每个寄存器都占据4字节,32位。而CPU的总线一次可以操作32位,所以比8位单片机厉害一点。 经过这三步查找,我们可以做出以下结论: PB3的输入数据位于0x4001 0C08这个地址上,这个地址上存放数据的右起第4个位就是PB3引脚对应的高低电平。 我们可以简单粗暴地直接访问这个地址: unsigned int *pGPIOB_IDR = (unsigned...
*(unsigned int*)(0x4001 0C0C) = 0xFFFF;`0x4001 0C0C 也就是GPIOB 端口ODR寄存器,一共32位...
2*(unsigned int*)(0x4002 1C14) = 0xFFFF; 有人会说咋不写0x0000 FFFF 这样看不是更直观吗?其实0x0000 FFFF和0xFFFF表示的意思一样,就比如1和01都表示1,直接写1不是更简单吗?对吧。但是你有这个想法很好,说明你在思考。 0x40021C14在我们看来是 GPIOH端口 ODR的地址,但是在编译器看来,这只是一个普...
stdint.h 这里放着C语言的标准表达方式//第36行开始 typedef signed char int8_t; // 标准表达方式 signed char 被等同于 int8_t; typedef signed short int int16_t; typedef signed int int32_t;//在32位环境里,int代表4个字节32位!! typedef signed __int64 int64_t; typedef unsigned char uint8...
*(unsigned int*) (0x40010c0c) = 0xFFFF; 就是对这个内存空间赋值0xFFFF 那么stm32中如何去对这些寄存器操作呢? 通过寄存器别名方式访问内存单元 上面就是stm32对寄存器内存单元的操作形式,对相应寄存器对应的地址进行宏定义 (已将将立即数强制转换成无符号整形地址)之后就是 *(宏定义名)就代表是这个寄存器的...
#define GPIOA_OTYPER *(unsigned int *)(0x04+0x4000 0000)这就是寄存器映射。 寄存器映射:给具有特殊功能的内存块的首地址取一个具有特殊意义名称的过程就叫做寄存器映射。 存储器映射 定义:芯片在做的时候,内存并没有地址,我们给内存分配地址的过程中就叫做寄存器映射。
如下图,搜索的结果并不多,挨个查看后,可以看到只有sub_800F3C8函数中有往0x20000104地址写数据的代码,而且sub_800F3C8函数参数为unsigned int类型(刚好是4个字节大小),所以基本上可以确定这个函数就是MCU注册时的密钥变换为加密密钥的函数。 接下来将sub_800F3C8和sub_800E2...
char 1 int 2 long 4 float 4 double 8 指针类型所占字节和地址总线宽度有关系,8位机器的话就是1个字节 stm32单片机(32位): char 1 short 2 int 4 long 4 float 4 double 8 指针类型所占字节和地址总线宽度有关系,32位机器的话就是4个字节
*(unsigned int*)(0x4002 0410) = 0xFFFF;一直以为这句话很清楚,但是却发现有人看不懂这句话,那...