完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
存储器映射
程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。也就是被总线连接的部分。我们在编程的时候,也是对这些功能部件进行操作。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 从图 中我们可以看出 ARM 将这 4GB 的存储器空间,平均分成了 8 块区域,每块区域的大小是 512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计各自特色的外设,要注意一点每块区域容量占用越大,芯片成本就越高,所以说我们使用的 STM32 芯片都是只用了其中一部分。ARM 在对这 4GB 容量分块的时候是按照其功能划分,每块都有它特殊的用途。 在这 8 个 Block 里面,Block0、Block1 和 Block2 这 3 个块是我们最为关心的。因为它包含了 STM32 芯片的内部 Flash、RAM 和片上外设。
什么是寄存器? 在上一节存储器映射中我们知道Block2 这片区域是用来设计片上外设的,由于Cortex-M3 内核是32 位的,所以存储器内部是以四个字节为一个单元,每一个单元对应不同的功能,当我们控制这些单元时也就可以控制外设。每一个单元还对应一个地址,我们要操作这些单元,也就是通过对应的地址来访问。由于STM32 外设非常多而且复杂,如果每操作一个外设就要写一大串对应的存储单元地址,显然是非常麻烦的而且还极容易出错。因此我们就把每个单元的功能作为名,给这个内存取一个别名,这个别名是我们经常说的寄存器。然后通过C语言指针来操作这些寄存器即可。那什么是寄存器映射呢?给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。 比方说我们找到0x4001 1010 这个单元地址,那么可以通过查阅相关资料了解到此单元具有GPIOC 端口置位/复位功能。因此为了更好区分此单元的功能和方便后续的程序开发,可以给这个单元取一个别名GPIOC_BSRR,那么这个GPIOC_BSRR 就是寄存器,并且这个寄存器地址就是0x4001 1010。这个过程就是寄存器映射。 举例子如下图: |
|
|
|
只有小组成员才能发言,加入小组>>
3323 浏览 9 评论
3000 浏览 16 评论
3497 浏览 1 评论
9072 浏览 16 评论
4093 浏览 18 评论
1192浏览 3评论
613浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2341浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 06:59 , Processed in 1.578859 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号