打印
[STM32F3]

STM32F3不能用位带操作GPIO之原由

[复制链接]
862|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2016-8-25 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用到STM32F303,在修改IO的时候,觉得用库操作太麻烦了,要自己一个一个修改,用宏定义也不解决,自然就会想到用位带操作。查M4的手册知道M4也是支持位带操作,F3系列也是属于M4内核,而且在405也是用位带操作,觉得F303也是一样可以做位带操作。直接先修改一个IO,调试却发现在,IO电平始终没有变化。查IO,初始化没有问题。再查位带宏定义:
#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))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+20)
#define GPIOB_ODR_Addr    (GPIOB_BASE+20)
#define GPIOC_ODR_Addr    (GPIOC_BASE+20)
第一次地址映射操作是内核决定的,F3跟F4都是相同的,这里不会有错。查ODR寄存器的偏移地址:
_IO uint16_t ODR;          /*!< GPIO port output data register,                           Address offset: 0x14 */

ODR的地址偏移了0x14,也就是20,也是对的。F4都可以用位带操作,F3却用不了,就觉得很奇怪。放了一段时间,不死心,继续查找问题。调试,看汇编代码,在位带操作IO那里打断点
沙发
androidbus| | 2016-8-25 21:45 | 只看该作者
可以看到,操作寄存器的地址是0X42010290,查M3的GPIO地址,

使用特权

评论回复
板凳
litengg| | 2016-8-25 21:49 | 只看该作者
  是的,位带操作地址有两个,Bit Band Region是直接位带操作(具体的可以百度)。

使用特权

评论回复
地板
qiangweii| | 2016-8-25 21:51 | 只看该作者
这个之前还没有很多的接触,进来学习下。

使用特权

评论回复
5
mmuuss586| | 2016-8-25 21:58 | 只看该作者
学习了;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

424

主题

1616

帖子

1

粉丝