码迷,mamicode.com
首页 > 其他好文 > 详细

GPIO引脚翻转技巧

时间:2015-04-10 07:13:57      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:stm32 gpio 电平翻转


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

}

本文出自 “whatever957” 博客,请务必保留此出处http://whatever957.blog.51cto.com/6835003/1630674

GPIO引脚翻转技巧

标签:stm32 gpio 电平翻转

原文地址:http://whatever957.blog.51cto.com/6835003/1630674

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!