我用的是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点了,休息了~~~~~~~~~~~~~~~~~~~~~~~~
加载中,请稍候......