STM32单片机---内存映射(一)内核与ROM、RAM、外设寄存器的介绍


声明:文中介绍的单片机为STM32F1的大容量芯片

单片机的硬件组成

单片机简介

单片微型计算机简称单片机。是集CPU(也是处理器或者说是内核,作用是运算、控制)、RAM(内存,作用是作数据存储)、ROM(程序存储)、输入输出设备(外设)处于同一芯片的器件。在电脑中,CPU、RAM、ROM、外设这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了PC主板,进而组装成电脑。只不过单片机只是将这些所有的都集中在了一个芯片上面而已。

单片机组成框架

这里的组成框架并没有详细到总线通信这些,只是描述了一个MCU的组成部分,以及各自的工作任务。更详细的框架请参考芯片厂家提供的数据手册(这里借鉴的是STM32F1的数据手册)。
如下图,单片机的组成可以分类两部分:内核与存储器内核是ARM公司的与芯片厂家(如TI、ST)没有半毛钱关系,存储器是芯片厂家的。简单点就是,芯片厂家在ARM公司那里拿到内核后,在根据自己的需求设计相应的存储器,再将存储器与内核通过内核规定的总线方式链接起来,在封装成一个总体的芯片。如下图一
在这里插入图片描述

单片机的功能

(1)单片机是可以执行程序的,就是代码的执行,逻辑的计算(加减乘除,与或非)这些。
(2)单片机是可以控制硬件的,比如我们在芯片外面设计的LED、LCD、MOS这些硬件。这些都是由单片机去做控制的。
由上面知道,单片机是由内核和存储器这两个组成的。内核是负责单片机的第一个功能,执行程序。存储器是负责单片机的第二个功能,控制硬件。

内核介绍

关于内核方面的知识太多太多了,作者也不理解内核里面的内容。有读者想更全面了解内核方面的知识可以去看官网给出的CM3权威指南。这里只是以读者个人理解的来粗糙的描述下:
(1)内核是一个现成的模块,其硬件和软件都是由ARM公司做好固定好的。并且是独立的。
(2)内核里面就是一些指令集、存储器架构、调试系统架构等等牛逼并且是不对外的东西。
(3)内核的功能就是运行程序(做运算和控制用)。就是我们写的代码、代码里面的逻辑运算以及加减乘除的计算都是由内核来执行的。
(4)内核本身就是有代码和指令的,只不过内核的代码指令是固定的,内核代码指令的功能就是去执行我们写的代码和运算以及计算我们的逻辑。
(5)内核是不存储我们写的代码和数据的。

内核内存映射的介绍

从上面的内核介绍可知,内核是一个执行单元,它并不会存储我们的代码和代码运行中产生的一些数据变量。

那么,内核要执行的程序从哪里来,中间产生的数据变量又存到哪里去呢?当然是从芯片厂家的存储器里面获得代码和存放数据变量的。因为我们的代码和数据都是放在存储器里面的。

内核本身会提供一块地址空间,这块地址空间会给出一些接口总线。这些接口总线的作用是给芯片厂家的存储器提供映射作用。把芯片厂家的存储器一一映射到内核的地址空间上面。这样内核在通过读写操作自己本身的这块地址空间时,就相当于读写芯片厂家的存储器了。
可以粗糙的理解为:内核提供的这块地址空间,是实实在在存在于内核里面的一块物理地址。而内核要执行的程序和执行程序过程中产生的数据变量都来自于这块地址空间。而ARM公司对内核做了一个限制,内核要执行的代码和其它要存储的数据(就是我们写的程序)不能直接放在这块内核空间里面。但是它提供了一些总线出来,这些总线可以把外部的存储器一一对应的都映射到内核的空间里面。如下图就是内核提供的地址空间给到芯片厂家映射存储器的框图。图二
在这里插入图片描述
由上图可知,内核提供的地址空间大小是4G,至于为什么是4G,这个和地址总线宽度有关,由硬件决定。分成八个模块。每个模块的基地址和大小都是固定的。芯片厂家在拿自己的存储器映射到内核的地址空间时,也是需要按模块来的。并且要映射的存储器大小最大可以和内核提供的存储器模块一样大。芯片厂家根据自己的设计要求来,一般映射都是会比内核的小。
比如拿代码模块来分析,内核提供的代码模块是512MB大小,并且基地址是0X0000 0000开始。芯片厂家在设计自己的存储器模块(这个模块就是和内核对应的代码模块了),最大就是512MB了。但是这个对于代码模块来说已经是很大的了。拿STM32F1的大容量来说,代码模块才512KB。(这里的代码模块就是ROM了)
注意:内核给出的4G地址空间,分成八个模块。并不是芯片厂家就要全部添加这八个模块。而是根据自己的需求来添加。

存储器介绍

首先声明一下:上图框架里面的存储器并不是指一整块的存储器(内存条这些),单片机除了内核以为,芯片厂家还加了很多的资源进去,比如ROM,RAM,外设,FSMC(外部SRAM),这些独立的存储模块。STM32F1大容量的芯片就加了这四个存储模块。如下图也可以看到。四个被动单元就是ST公司在这块芯片上面加的四个存储模块了。如下图三
在这里插入图片描述

我们知道ROM,RAM和FSMC可以读写数据,存储数据。是存储器不假,但是外设呢,外设是控制硬件的,为什么也统称在存储器里面呢。这是因为每一个外设都对应有自己的寄存器(可以理解成是硬件控制器)。我们在写程序的时候也发现,我们是通过读写地址的方式(寄存器对应的地址)去达到控制硬件的功能。所以这里不难联想到,寄存器就是地址,而地址是可以归属到存储器里面的。
所以这里可以理解为,在单片机中寄存器本身就是地址,属于存储器的一类。我们都知道寄存器在模拟电路中其实是由一些逻辑门电路以及触发器组成的。至于在单片机中,他是如何把寄存器和地址关联起来的,以及通过读写地址的内容去实现控制寄存器里面的与非门逻辑电路,从而实现控制外部硬件的原理。这里不是作者关注的。后期可能会了解。
所以在单片机中,寄存器是一种特殊的存储器,它可以读写我们程序中运行的数据。只不过这些数据不是普通的变量数据。而是我们去控制外部信号。或者是控制与非门逻辑电路(寄存器的电路)。
为什么说寄存器在单片机中是存储器呢。寄存器除了有地址,可以读写外,寄存器还有存储数据的功能。比如我们在控制一个外设(如GPIO),我们往IO的数据寄存器(ODR)写入一个1或者0,那这个IO的电平是不是就是1或者0呢,而且是一直保持当前电平的状态。除非你再次去重新写过值。这就说明这个地址的数据一直存在里面保持不变。所以寄存器就是存储器,有地址,能读能写还能存储。
寄存器存储的数据有些是掉电不丢失的,像FLASH一样。有些寄存器存储的数据则是掉电就清零不保存的。比如STM32的单片机,寄存器就是掉电清零的。LKS的芯片,有些寄存器就是掉电不丢失的。

根据图一所示,STM32F1大容量芯片一共有四个存储模块,分别是ROM、RAM、外设、外部RAM(FSMC)。

ROM存储器

(闪存)
内核在执行代码的时候,会在一块指定的地址空间中去读取要执行的代码。但是内核的这块地址空间是不支持我们直接把代码写到里面去的。所以使用地址映射的方式,把外部的地址空间映射到内核的这块地址空间上。
ROM存储器是芯片厂家提供的实实在在的一块物理存储器。这块存储器被映射到了内核地址空间的代码区上面。我们写的代码,编译成的bin、hex这些可执行文件,就是下载到ROM存储器上面的。
然后内核在上电后会开始执行程序,内核执行程序是从0地址开始往上执行的。内核就会从这个地址区域从0地址开始,读取一条程序去执行,读取一条执行一条。(因为外部的ROM存储器被映射到了内核的代码区了,内核从地址空间的代码区读取一条程序,就相当于在ROM存储器读取一条代码了,具体是通过总线来完成的,这个后续文章会讲到)。

ARM存储器

(内存)
内核在执行代码的时候,在运算的过程中产生的一些需要存储的数据,或者变量,内核会提供一块地址空间来存储这些数据。但是内核的这块地址空间其实是不支持把我们的代码数据真正的存储在里面的。可以这样理解,内核只提供这块地址空间,然后内核会有相应的动作去读写这块地址空间。但是这块地址空间又不真正能存储数据。所以需要外部映射一块实实在在能存储数据的地址空间对应到内核的这块地址空间上面。
ARM存储器是用来存储代码中定义的一些变量,和程序执行过程中的一些需要存储的数据。内核在读写程序中的一些变量或数据的时候,就是操作这块存储器了。

外设—实现内核控制硬件

寄存器的本质就是地址空间,整个外设模块就是一块存储器。

我们都知道内核只是执行程序,做逻辑运算用。它是不能直接去控制硬件的。但是我们知道,单片机就是用来控制硬件的。那么它是如何通过内核来控制外设的呢?
首先内核会提供一块地址空间(这个地址空间应该不算是特意去控制外设的吧,这里吧这块地址空间看成是一块普通的存储器)。单片机厂家会做出一个叫外设的模块出来,这个模块集成了很多很多的外设,如I/O,串口,SPI等等。每一个外设都会对应很多寄存器。寄存器里面就是芯片厂家集成的各种逻辑电路或者触发器这些。然后把每一个寄存器都关联到一个地址,独立外设的所有寄存器地址都是连续的一块存储空间。然后各外设间的寄存器地址又是连续在一起的。就组成了一块连续的存储空间,里面都是寄存器的地址了。我们把这块存储器空间称为外设存储器。
芯片厂家就是把这块外设存储器模块给映射到了内核对应的地址空间上面。然后内核就可以通过读写这些地址去实现控制对应地址的寄存器,从而实现去控制硬件了。
关于寄存器是怎么关联地址,然后使地址里面的值能去触发控制寄存器里面对应的各种逻辑电路。这个是由芯片厂家设计的。
我们在读写寄存器地址的时候,一般都是按位来操作的。比如在那个寄存器的第几位写1,第几位写0,我想一个寄存器地址32位,每一位都是对应一个逻辑电路与非门电路的触发点吧。

外部SARM

外部ARM一般是给开发者提供的一个接口,可以在单片机外面接一个ARM存储器。

内核与芯片厂家的存储器配合工作

大致可以这样理解:
内核在执行程序时,会从外部ROM存储器从0开始一条一条的代码拿过来,然后再执行代码运算过程中,遇到要对数据要存储的,就把数据存储到外部ARM存储器,如果再代码中有程序要从ARM存储器读取数据,内核就从ARM存储器读取数据出来。如果执行的程序中,有对寄存器地址区读写数据的,就往寄存器地址区里面进行读写数据。这样就达到了控制硬件的能力。
再整个过程中,从上电到断电。可以理解内核是不存储我们的代码和任何数据的。它就想一个过道一样。

  • 30
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值