有个朋友@Hawker 在搞飞行器,需要使用到DMA方式进行传输数据,其中DMA串口传输初始化的代码中需要计算外设的地址,如USART2的DR寄存器,芯片手册给出了一个比较通用的计算表达式,如图1 图1
但是这个公式用起来比较麻烦,通过翻阅《STM32中文参考手册》和《Cortex-M3技术参考手册》,总结出如下最简单的计算方法,只需要看《STM32中文参考手册》,现在翻到该手册的第19页表1 寄存器组起始地址
图中红色方框里的即为表1中第二列对应外设的首地址。
注意:外设包含若干寄存器,寄存器属于某个外设,这个关系不要搞错了!
现在翻到第20页,找到USART2的首地址,如图3。

图3
由图3可以看出外设USART2的起始地址为0x4000 4400(红色方框圈起的部分),那么表1中的bit_band_base + (byte_offset*32)就等于0x4000 4400。现在单击后面的超链接“参见24.6.8“可以看到图4所示的表158 USART寄存器列表及其复位值
 图4
可以看出,每个寄存器占用4个字节(其中灰色部分被保留了未被使用),所以在图1中,bit_number要乘以4,但是表158已经把偏移量算出来了,直接加即可,那么USART2的DR寄存器的地址即为0x4000 4400 + 0x04 = 0x40004404。如果要计算USART2的SR寄存器地址,同理为0x4000 4400 + 0x00 = 0x4000 4400。
再举一例,如果我要知道USART1的DR寄存器的地址,那么首先找到外设起始地址0x4001 3800,再加上偏移0x04,结果为0x4001 3804,很多参考书都是抄来抄去,没有讲这些东西怎么算出来的,这篇文章应该很详细地给大家解释了寄存器地址的计算最简单方法,如果觉得好,可以借鉴一下。
此教程仅写给新手看,高手请绕道!
|