所谓翻转,就是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);
}