本帖最后由 新乡吴彦祖 于 2018-8-18 15:57 编辑
MDK中寄存器地址名称映射分析(开发指南4.6节) 对MCU,一切底层配置,最终都是配置寄存器 库函数是对底层寄存器封装了一遍,位操作也是最终操作的寄存器 51中映射的方法:sfr P0=0x80;//P0映射到地址0x80 ,以后只需要直接写P0=0x00即代表往寄存器地址0x80所代表的寄存器赋值,0x00相当于给P0的每一位IO口都赋值0。这样的好处是不需要记住每个寄存器的地址,需要用对应的寄存器时直接写寄存器相应的名称即可。最常用的P0、P1、P2、P3,四组输入输出(I/O)寄存器,以及TH1, TH0, TL1,TL0,SCON,TCON,TMOD,SBUF等等 相比于51,32的寄存器要多得多,32采用了结构体来表示相应的寄存器 GPIOA->ODR=0x00000000。32中每组IO口都有7个寄存器控制这与51稍有不同。每组IO对应一个基地址,寄存器根据基地址进行偏移取的地址,GPIOA的基地址又是根据APB2的地址来偏移,同理得到其他地址。其中外设基地址是一个比较高的地址,他被定义为一个常量,作为参考。再回头说结构体,我们打开stm32f10x.h 定位到GPIO_TypeDef 定义处:GPIOA被强制转换为结构体指针,就意味着接下来的地址代表了结构体中的七个寄存器。由于每个寄存器是32位,每个地址设置八位(类似于51),并且结构体存储的成员他们的地址是连续的。所以GPIOA下的寄存器相对应的寄存器之间的地址都是相差了4,例如我们访问ODR寄存器就是访问了ODR相对于GPI_的基地址的偏差的四个地址。 |