加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【经验】说说 GPIOx的BSRR,BSRRL和BSRRH 【你们会遇到的麻烦】

(2014-07-01 16:14:18)
标签:

it

我用的是STM32F2xx系列的单片机。用了库也很新,stm32f2xx_stdperiph_lib 1.0 。(注意,这个是stm32f2xx的),Msnual Reference(用户手册) 也是匹配的,新的。

        旁晚我打算直接操作寄存器编个程,利用 用户手册 的时候,看了  GPIOX_BSRR 的寄存器,编程发现出现错误了,说 BSRR 是undefined的,我想奇怪了,竟然没定义。好吧,追根溯源,发现了那个固件库的stm32f2xx.h里面有个 struct 里面是有 BSRRL 和 BSRRH 的,竟然没有 BSRR ,那手册上面也没有说明 BSRRL 和 BSRRH ,我怎么用啊。其实我也猜到 BSRRL 和 BSRRH 应该是 BSRR 的低位和高位。但是为了搞清楚这东西,我所有搜索引擎都试过,都没用。无奈之下,下了各种固件库和各种参考手册,发现固件库说的都是 BSRRL 和 BSRRH ,参考手册说的只是 BSRR 。好吧,我在st公司的论坛发帖问了(当然用英文发啦~~然后突然间觉得自己英语很强大~~),最后到了现在,凌晨3点多,我终于自己想出来了。然后自己在st官网自己回复了自己,苦逼啊(再一次感觉到自己英语也不错啊~~~虽然考试考得一般般~~)。好了,进入正题。

        我是通过看Address offset 得出来的,Address offset 是偏移地址的意思,话说汇编真有用啊,我就是靠它推断出来的。在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C 。所以根据 OX1C-0X18=0X04 就知道BSRR是32位寄存器了。因为一个地址里面有一个字节的内容,一个字节是8位。好了,我看固件库里面的BSRRL的偏移地址是 0X18,而BSRRH的偏移地址是0X1A。不用多说了,两个都是16位的寄存器,BSRRL和BSRRH相隔两个字节,BSRRH和LCKR相隔两个字节,哦呵呵~~~发现后,我测试了一下把 BSRRL和BSRRH 编程时都试下这样: 1<<16  ,左移16位,果然报错了哈~~证明我说的没错。

       也就是说,现在BSRR 这个32位寄存器 分成了两部分,两个16位的寄存器,一低一高。然后我编程,然后成功了~~~哈哈~~~


          说到这里是凌晨4点了,休息了~~~~~~~~~~~~~~~~~~~~~~~~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有