你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
accelerating 发布时间:2015-10-16 13:37
最近用到STM32F303,在修改IO的时候,觉得用库操作太麻烦了,要自己一个一个修改,用宏定义也不解决,自然就会想到用位带操作。查M4的手册知道M4也是支持位带操作,F3系列也是属于M4内核,而且在405也是用位带操作,觉得F303也是一样可以做位带操作。直接先修改一个IO,调试却发现在,IO电平始终没有变化。查IO,初始化没有问题。再查位带宏定义:( [4 f+ I6 Y& F: }; X
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
9 ^1 P! g1 ]) C  A$ J#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))   Q5 c9 h9 Y! ~
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
. ?& t& r, q1 l0 y1 A/ _//IO口地址映射
& J( j: P/ D- I" k9 o+ [#define GPIOA_ODR_Addr    (GPIOA_BASE+20)
8 K" a) U* K) _0 m#define GPIOB_ODR_Addr    (GPIOB_BASE+20)$ k. P( g* g; R
#define GPIOC_ODR_Addr    (GPIOC_BASE+20)  n7 o2 Y* L+ c$ v0 T7 y; c1 o7 R1 c" d
第一次地址映射操作是内核决定的,F3跟F4都是相同的,这里不会有错。查ODR寄存器的偏移地址:, p: I+ W9 {" z- a* {9 x
_IO uint16_t ODR;          /*!< GPIO port output data register,                           Address offset: 0x14 */' J) ^6 V$ Y" Z4 s0 U$ t7 v+ g

: A! Z$ x% P" ~% h, n, XODR的地址偏移了0x14,也就是20,也是对的。F4都可以用位带操作,F3却用不了,就觉得很奇怪。放了一段时间,不死心,继续查找问题。调试,看汇编代码,在位带操作IO那里打断点( t( k5 T2 N- b/ O2 N) r
  Q; S5 A0 H% c$ ~! F& j

# I* N8 s; ]2 S: @0 N. D' S6 ?7 a1 M" T

/ W% B( X: e  [& s$ Q2 U3 L1 H7 N& t) ?3 N! m7 c! {
可以看到,操作寄存器的地址是0X42010290,查M3的GPIO地址,
3 E& K. q  |% }7 i- f$ L#define GPIOC_BASE            (AHB2PERIPH_BASE + 0x0800)5 m& s3 D" n/ U
#define AHB2PERIPH_BASE       (PERIPH_BASE + 0x08000000)$ [" I* s) B2 o) ~
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
: }0 N/ Y! k4 l
- u# B8 D5 B$ m$ d: y4 t也就是GPIOC的地址是0x48000800。这明显就对不上,位带操作的地址都不是对应GPIO的ODR,当然操作不了GPIO的电平,这下死心了。
, \* R% |* o* K% g/ h9 j, x- P      死也要再死个明白,继续查M4的手册关于Memory System章节,可以看到位带操作地址有两个,Bit Band Region是直接位带操作(具体的可以百度),Bit Band Alias是间接位带操作,要做地址映射才能操作,所以才会BITBAND这个宏定义。只有寄存器的地址在Bit Badn Alias(0x42000000,0x43FFFFFF)地址区域内的才进行位带操作。F303的GPIO是属于AHB2,地址已经不在位置操作区域,所以地址映射后对应不是GPIO的寄存器,自然不能进行位带操作(ST这点也做得太坑了,为什么要把GPIO的归到AHB2)。M4的GPIO都在AHB1总线上,地址在位带操作地址区域自然可以用位带操作GPI,M1也是一样。3 N7 a: t7 t/ A8 ^, m) ^. }4 a

: k$ O( U5 \  R2 ]" D9 Y7 \4 l0 x% T+ {: R( m2 h
收藏 2 评论13 发布时间:2015-10-16 13:37

举报

13个回答
安臣 回答时间:2015-10-16 13:55:42
这个对我也有用
mark0668 回答时间:2015-10-16 14:10:10
F3 是不支持位操作端口的。
disheng4688 回答时间:2015-10-16 14:57:09
学习                       
bimax 回答时间:2015-10-16 15:04:55
学习了,谢谢分享
wyxy163@126.com 回答时间:2015-10-16 17:15:15
提示: 作者被禁止或删除 内容自动屏蔽
wu1169668869 回答时间:2015-10-16 21:52:21
多谢分享~
4 ?0 s7 ?( ]# z还有最后是F1 M3系列吗?不知道还有M1 6.gif
ruilimeng 回答时间:2015-10-20 23:52:50
谢谢分享!
foxglove 回答时间:2015-10-21 08:14:36
STM32F3不能用位带操作GPIO
ROCK0525 回答时间:2015-10-21 08:34:26
好帖,学习了
zlutian 回答时间:2015-10-22 10:45:26
谢谢分享,还真不知道有这坑。
watershade 回答时间:2015-10-22 13:40:47
回头查查,还真没发现这茬。谢谢楼主分享。
aoxiangwode2008 回答时间:2015-10-22 14:15:42
学习了。。。
无线传感器啊 回答时间:2015-10-23 10:21:44
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版