编辑这篇文档时候,听说相关的解析过程在《Cortex-M3权威指南》里有详细讲解。
前几日被一个跑马灯语句勾引
LED1=!LED1;
于是深入探究一下这句话的实现过程。
#include "led.h" #include "delay.h" #include "sys.h" #define LED0 PAout(8) // PA8 #define LED1 PDout(2) // PD2 int main(void){ delay_init(); LED_Init(); while(1){LED0=0;LED1=1;delay_ms(300); LED0=1;LED1=0;delay_ms(300); }}
关于PAout(8)是实现位带操作的最终封装形式,在sys.h中定义为
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define之间传递的是n这个参数
再去查看BIT_ADDR的以及GPIOA_ODR_Addr定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
最终的实现过程就在这三句里面。