STM32位带操作实现过程解析

编辑这篇文档时候,听说相关的解析过程在《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)) 

最终的实现过程就在这三句里面。

posted @ 2018-10-16 08:51  凉初捕影  阅读(979)  评论(0编辑  收藏  举报