单片机如何控制外设?
单片机不是直接控制外设的,而是通过配置片上外设寄存器来控制其输出和检测高低电平,进而控制外围器件。
单片机如何配置寄存器的?
下图是单片机驱动 点亮发光二极管
- 内核从flash里面加载读取指令。
- 内核根据指令到SRAM里面对应的地址读取数据,这些数据就是即将赋值给GPIO片上外设寄存器里的数据。
- 内核通过总线对GPIO寄存器赋值。
- 如果寄存器某一位为零,那么对应的IO口对应的一些开关电路就会输出低电平。LED另一端接高电平时,LED就会点亮。
单片机是如何找到寄存器的?
每个寄存器都有对应的地址,单片机通过地址访问寄存器,ARM寻址范围4GB(2的32次方=4G byte),分为多个块,片上外设对应的地址范围是0x4000 0000-0x6000 0000。
C程序是如何实现访问寄存器的?
C程序通过指针访问寄存器,这也是指针在嵌入式开发中的一个典型应用。
//访问GPIOG这一组IO口contrl0寄存器,赋值0xFFFFFFFF
#define APB2_BUS_BASE ((uint32_t)0x40010000U)
#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U)
#define GPIOG (GPIO_BASE + 0x00001800U) //先定义GPIOG基地址,通过计算是0x40012000
#define GPIO_CTL0(gpiox) REG32((gpiox) + 0x00U) //再找到GPIO control 0 的寄存器地址, 就是在GPIOG的基础上,再加一个偏移地址。
#define REG32(addr) (*(volatile uint32_t*)(uint32_t)(addr))
GPIO_CTL0(GPIOG) = 0xFFFFFFFF;
//展开上面这条赋值语句就是: *(volatile uint32_t*)0x40012000 = 0xFFFFFFFF