所谓翻转,就是1变0,0变1。

即第一次执行时,若引脚为高电平,则下一次再执行时,则让其变为低电平。


对于GPIO引脚来说,实现电平翻转,有很多方法。

其中两种比较好的方法如下:

(1)采用位带操作方法。

在stm32中,关于位带操作,有以下一些内容需要清晰:

1.支持位带操作的两个内存区的范围是: 

       0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB) 

       0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)

2.对于SRAM 位带区的某个比特,记它所在字节地址为 A,位序号为n(0<=n<=7),则该比特

在别名区的地址为: 

AliasAddr = 0x2200 0000 + ((A-0x2000 0000)*8 + n)*4 

          = 0x2200 0000 + (A-0x2000 0000)*32 + n*4

对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则该比特

在别名区的地址为: 

AliasAddr = 0x4200 0000 + ((A-0x4000 0000)*8 + n)*4

          = 0x4200 0000 + ((A-0x4000 0000)*32 + n*4


综上所述,要想实现对某个位进行位映射,可采用如下方法:


//得到位映射地址

//(0x2000 0000<= addr <=0x200F FFFF || 0x4000 0000<= addr <=0x400F FFFF)

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

//取地址内容

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 

//取位映射地址内容

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 


//假设想对GPIOB的PB5引脚进行位映射

#define GPIOB_ODR_Addr (GPIOB_BASE+0x0C)

//PB5即GPIOB第5引脚对应位映射地址的内容

#define PB5 BIT_ADDR(GPIOB_ODR_Addr,5)


(2)采用与1异或的方法:

    0^1=0;1^1=0;从而实现了电平翻转。


(3)采用1取反

u8 nVal = 1<<5;  //PB5

while(1)

{

    GPIOB->BSRR &= ~nVal;  //&1不改变原数

    delay_ms(1000);

}