STM32F103C8T6,寄存器访问

推荐一篇很好的文章比我自己说的明白。

STM32F103的存储器映射&寄存器映射_stm32f103存储器的结构映射图-CSDN博客

STM32单片机地址映射_#define periph_base ((uint32_t)0x40000000) /*!< pe-CSDN博客

在研究DMA的时候对寄存器地址的访问有了疑惑,记录一下。

单片机可以通过C语言编程,固件库的方式,也可以直接操控底层的寄存器。

起因是看到下面这段代码是有些不懂

函数是如何通过这些地址找到DMA寄存器的位置的。

查看数据手册的存储器映像(图9 存储器图)

程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个 4GB 的线性地址空间内。
数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
外设寄存器的映像请参考相关章节。
可访问的存储器空间被分成 8 个主要块,每个块为 512MB
由图9可以看出DMA 在存储器的第2块(0、1、2)
具体位置如下

也可以在参考手册的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位的。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值