推荐一篇很好的文章比我自己说的明白。
STM32F103的存储器映射&寄存器映射_stm32f103存储器的结构映射图-CSDN博客
STM32单片机地址映射_#define periph_base ((uint32_t)0x40000000) /*!< pe-CSDN博客
在研究DMA的时候对寄存器地址的访问有了疑惑,记录一下。
单片机可以通过C语言编程,固件库的方式,也可以直接操控底层的寄存器。
起因是看到下面这段代码是有些不懂
函数是如何通过这些地址找到DMA寄存器的位置的。
查看数据手册的存储器映像(图9 存储器图)
![](https://img-blog.csdnimg.cn/direct/a11cec2103a54fda8019a38601c1ed7c.png)
也可以在参考手册的表1 寄存器组起始地址中找到DMA 的位置
0x4002 0000~0x4002 07FF这里的地址更加具体。
对照一下
0x40000000+0x00020000+ 0x0000+0x0008=
到此还是有一些思路没理清楚,等后续在来补充
/*****直接地址操作,改变寄存器的值****/
*(unsigned int *)(0x40020008)&= 0x00;
//这行代码的作用是将地址 0x40020008处的寄存器值与 0x00 进行按位与操作,
//相当于将该寄存器的特定位清零。这里的 (unsigned int *) 是将地址强制转换
//为指向无符号整数的指针,然后使用 * 运算符对其进行取值操作,即获取该地址
//处的值。然后进行按位与操作,将指定位置零。
寄存器映射
每个寄存器都是32bit,占用4个Byte即4个存储单元。可以把寄存器看作一个特殊的单元,一个这样的单元占32bit,只要找到这个单元的起始地址就可以对其进行操作。
其映射地址 = 外设总基地址(块基地址)+ 总线相对于外设总基地址的偏移 + 具体外设基地址相对于总线基地址的偏移 + 寄存器相对于具体外设基地址的偏移。
补充:32位cpu代表了什么,stm32也是32位
代表的是数据总线32位,也就是说cpu一次可以处理32位数据,而上面我们说了,cpu要从寄存器取数据,所以它寄存器也是32位的,所以32位代表什么?代表它的寄存器是32位的。
敲黑板:stm32的寄存器是32位的,都是存储8位16进制的数或者32位2进制的01数字。
寄存器由两部分组成,地址以及寄存器的值。可以通过32位的地址对寄存器的值修改。寄存器的值是32位的。