复习51单片机:
寄存器映射:每个外设所对应的内存有个地址,通过关键字(例如sfr)实现寄存器映射,把地址取名字。
单片机有端口(51有4个),对应的地址0x80,0x90,0xA0,0xB0,通过
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
实现寄存器定义。编程时直接使用P0进行赋值,如:
P0 = 0xFE; /*51只有8 bits,0b11111110*/
STM32F103:
让某个GPIO端口的16引脚实现高/低电平输出(同时):
(端口)输出数据寄存器ODR(output data register),低16位有效,16个引脚都输出低电平需将低16位都设置成1即可。
自己的板卡连接指示灯的是GPIOE,在“总线架构”找到端口E地址范围: 0x40011800-0x40010FFE.
地址偏移:寄存器相对于总线基地址的偏移量,这里是0x4001180C。
(unsigned int *)的作用: 强制类型转换
GPIOE_ODR的地址是0x4001180C,编译器不认为其是一个地址,因此需要用
(unsigned int *)0x4001180C;
对0x4001180C进行强制类型转换。
“*”的作用:对地址进行指针操作。即:
*(unsigned int*)0x4001180C;
以上是最基础繁琐的实现方式,可以用宏定义进行优化。即用#define对地址(unsigned int *)0x4001180C定义成宏,语句:
#define GPIOE_ODR (unsigned int*)0x4001180C;
再对宏进行指针操作并赋值,语句:
* GPIOE_ODR = 0xFF;
可将上句前面的*号移到宏定义语句中,即:
#define GPIOE_ODR *(unsigned int*)0x4001180C;
直接赋值:
GPIOE_ODR = 0xFF;