在我的工作中,我处理不同的微控制器,微处理器和DSP处理器.其中许多都有24位寄存器和计数器.
我知道如何使用它们,这不是我的问题.
我的问题是为什么他们有24位注册!为什么不把它变成32位?据我所知,这不是大小问题,因为寄存器已经是32位,但最大为0xFFFFFF.
这样可以更容易地实现硬件吗?更快的计算?或者只是"嗯,让24位寄存器让程序员的工作变得更加困难"?
我正在使用dsPic33F(16位微控制器);
char[]为int[]使用C++ 将每两个字符变成一个int?我正在为一个只有几个字节RAM的小型8位微控制器编写代码.它有一个简单的工作,即传输7个16位字,然后传输这些字的CRC.在编译时选择单词的值.CRC具体是"字0到字6的除法的余数,因为无符号数除以多项式x ^ 8 +x²+ x + 1(初始值0xFF)."
是否可以使用C预处理器在编译时计算这些字节的CRC ?
#define CALC_CRC(a,b,c,d,e,f,g) /* what goes here? */
#define W0 0x6301
#define W1 0x12AF
#define W2 0x7753
#define W3 0x0007
#define W4 0x0007
#define W5 0x5621
#define W6 0x5422
#define CRC CALC_CRC(W0, W1, W2, W3, W4, W5, W6)
Run Code Online (Sandbox Code Playgroud) 我陷入了以下指针问题:
假设你有一个功能:
void Function (unsigned char *ubPointer)
{
ubPointer++;
}
int main (void)
{
unsigned char *PointerX;
Function( PointerX );
}
Run Code Online (Sandbox Code Playgroud)
我想要的是++在PointerX中得到反映,而不是将其声明为全局变量.
非常感谢你.
如何在AVR studio 4的编码中将unsigned char值转换为float或double.
请帮助我是初学者,我的问题也可能听起来很愚蠢:/
就像我有一个char keyPressed
我用lcd_gotoxy(0,0)将它打印在屏幕上; lcd_puts(keyPressed);
现在我想用这个值来计算一些东西..如何将它转换为float或double?请帮忙
我的GSM调制解调器默认设置为115200波特率.我连接了PIC18微控制器,波特率为19200.我将调制解调器波特率更改为19200然后保存了设置,但每次重置调制解调器时,波特率都会变回115200.
这些是我使用的以下命令.
改变波特率
AT+IPR=19200
然后我重新打开了具有19200波特率的超级终端(Putty)以保存当前设置.
保存设置
AT&W
但是在重置调制解调器后,波特率会变回115200.我使用的是M6000 GSM/GPS模块(Tk115 Gps Tracker),但没有太多的支持,这里有数据表供参考.
我正确保存设置吗?
我正考虑在PIC18F87j11上将波特率更改为115200,但使用当前的8 mhz振荡器是不可能的.任何反馈都会有所帮助.
谢谢!
我想实现一个GPIO中断,但我不知道如何,我也没有找到真正的样本或解释.
我已经知道如何写Pins,但不多,请考虑我真的没有任何关于c或编程微控制器的知识.
一个简单的例子或解释将帮助我很多.以下代码是我已经拥有的,但我不确定这是否正确.
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_2;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud) 我应该编写一个程序,将一些值发送到寄存器,然后等待一秒,然后更改值.问题是,我无法找到停止操作一秒钟的指令.
我正在尝试使用MC9S08QD4微控制器对分频器进行编程.它使用遵循HCS08指令集的8位架构(此处提供文档).
但是,为了在尽可能宽的范围内容纳输入频率,我一直在尝试使用double和unsigned long变量来存储诸如输入信号周期之类的属性.
我遇到的问题是:每当我为值double或long变量赋值时,它都会正确地将值赋给该变量,但也会覆盖完全不相关的内存部分,从而破坏可能存储在那里的其他变量.一位同事建议这可能是因为它在计算过程中使用这些位置存储中间值,如果是这样的话,这将是非常奇怪的.
这些是我正在使用的工具,作为本文其余部分的参考:
在我的代码的某些部分我给你潜在的较大值long或double变量."大"我的意思是大于16位值可以支持的值,但是在无符号的32位整数或双倍可以支持的范围内.
如果我在执行这些赋值时检查局部/全局变量,我可以看到我分配的变量按预期分配,但其他变量也是如此.我也可以像这样检查内存,当我分配给这些变量时,我会看到任意和不同的位置被覆盖.
通过遵循本指南,我已经采取了我所知道的所有步骤,以确保支持使用大型/可能浮动的数据类型:
将S08链接器设置为include ansis.lib,它使用small HCS08内存模型并支持32位浮点数和64位双精度数.
确保的__NO_FLOAT__是不限定为预处理器符号.
Use IEEE32 for double (default is IEEE64)在HCS08中确保编译器设置未被选中(虽然对于我的用例,32位双精度很好).
确保所有数据类型都是预期的大小HCS08 Compiler -> Type Sizes.
我还验证了变量在生成的映射文件和变量调试屏幕中分配了正确的内存量.
SSCCE
在我设置的虚拟项目中,我已经能够使用非常少量的代码轻松地重现这个问题:
static double temp = 0;
static double temp2 = 0;
static …Run Code Online (Sandbox Code Playgroud) 我是MCU的新手,并试图弄清楚基于arm(Cortex M3-M4)的MCU是如何启动的.因为启动是针对任何SOC的,所以我采用了STM的示例硬件板进行案例研究.
主板:STMicroelectronics - STM32L476 32位.
在该板中,当引导模式为(x0)"从用户闪存引导"时,电路板将0x0000000地址映射到闪存地址.在闪存上我已经粘贴了我的二进制文件,前4个字节指向矢量表第一个条目,即esp.现在如果我按下复位按钮ARM文档说PC值将设置为0x00000000.
CPU通常基于PC -> PC + 1循环执行指令流.在这种情况下,如果我看到PC值指向esp,这不是指令.Arm CPU如何做不使用该指令地址的逻辑,但跳转到地址处的值存储0x00000004?
或者是这种情况:复位会产生一个特殊的硬件中断并导致PC值为at 0x00000004,如果是这样的话,为什么Arm文档说它将PC值设置为0x00000000?
参考:http://infocenter.arm.com/help/index.jsp?topic = / com.arm.doc.faqs/ka3761.html
上电复位后ARM寄存器中有哪些值?适用于:ARM1020/22E,ARM1026EJ-S,ARM1136,ARM720T,ARM7EJ-S,ARM7TDMI,ARM7TDMI-S,ARM920/922T,ARM926EJ-S,ARM940T,ARM946E-S,ARM966E-S,ARM9TDMI
应答寄存器R0-R14(包括存储寄存器)和SPSR(在所有模式下)在复位后未定义.
如果内核具有VINITHI或CFGHIVECS输入,当核心保持复位时,程序计数器(PC/R15)将被设置为0x000000或0xFFFF0000.应设置此输入以反映系统中矢量表的基础所在的位置.
当前程序状态寄存器(CPSR)将指示ARM内核已启动处于ARM状态,Supervisor模式同时设置了FIQ和IRQ掩码位.条件代码标志将是未定义的.有关CPSR的详细说明,请参阅"ARM体系结构手册".
microcontroller ×10
c ×6
arm ×2
c++ ×2
stm32 ×2
24-bit ×1
8051 ×1
at-command ×1
atmega16 ×1
avr-studio4 ×1
command ×1
cortex-m3 ×1
crc ×1
gsm ×1
interrupt ×1
memory ×1
pointers ×1
serial-port ×1
sleep ×1
thumb ×1