当前位置:   article > 正文

STM32微机系统框架、内存、存储器、寄存器_stm32单片机结构图

stm32单片机结构图

在这里插入图片描述

大家好,我是杰哥嵌入式开发
最近在出定时器系列,
但是线下班有一些学生在学习完C语言之后,
在51接触各种寄存器和对软件代码各种操作是如何在单片机系统中起到作用的感到非常的不解,
经过我的初步分析,是对嵌入式微机系统的大概雏形系统框架不熟悉导致。
所以我决定出一期基于STM32的系统框架介绍博客。

欢迎大家关注我的gitee仓库:
gitee源码仓库链接跳转

STM32微机系统框架、内存、存储器、寄存器

微型计算机系统组成框图

微机系统
硬件
软件
主机
外围设备
微处理器
存储器
输入输出I/O接口电路
外部设备
过程控制I/O通道
系统软件
应用软件
运算器_算术逻辑运算单元ALU
控制器_控制单元CU
寄存器阵列RA
RAM\ROM\EEPROM\FLASH\Cash等
输入设备USB键盘鼠标
输出设备HDMI显示器网口打印机
外部存储器DDR\EMMC
ADC\DAC\开关量

来分析一下这个框图:
众所周知,计算机在发展初期就是上千万个晶体管堆叠而成的
逐步发展成现在的第四代微型集成电路计算机
不管是咱们得51 32 香橙派,你们会发现中间的那个芯片都是由CPU和片上外设组成
在此基础上增加外部输入输出设备 如网口、USB、DDR、EMMC等。
这一硬件体系结构采用的是什么,是我们大学学计算机课经常听到的冯.诺依曼体系
还有另一个叫什么?你们来说!

冯.诺依曼体系的设计思想:

1 以二进制形式表示指令和数据。(计算机的语言)
2 程序和数据事先存放在存储器中,计算机在工作时能够高速地从存储器中取出指令加以执行。(内存映射)
3 由运算器、控制器、存储器、输入设备和输出设备等五大部件组成计算机硬件系统。 (通过总线结构交互)
  • 1
  • 2
  • 3

下面我们会拿STM32的硬件系统架构来讲解,讲解之前要让大家了解上面流程图中各个专业名词的定义,让大家对通用微机系统有一个基础文字定义的印象,然后在这里不要问我,我也不会,哈哈哈:
控制器(控制单元CU ):全机的指挥控制中心。负责读取指令,指令译码,形成各种定时控制信号,向内部各功能单元发送相应的控制命令,协调各部件之间的工作。

寄存器阵列(RA)

相当于微处理器内部的RAM,用于暂存数据和运算结果。我也没看懂 可以理解为我们上次讲的CPU中的cache吧

运算器(算数逻辑单元ALU)

用来进行算数或逻辑运算以及移位循环等操作。

存储器

计算机系统的记忆装置,用来存储程序和数据。
按工作方式,内存可分为两大类:
随机读写存储器RAM(Random Access Memory) 如内存条、DDR2 3 4 5
和只读存储器ROM(Read Only Memory) 机械硬盘 固态硬盘 flash TF-sd卡 emmc
以后面试问你们记得这么说:

  • 随机读写存储器可被CPU随机地读写,它用于存放将要被CPU执行的用户程序、数据以及部分系统程序。
    断电后,其中存放的所有信息将丢失。
  • 只读存储器中的信息只能被CPU读取,而不能由CPU任意地写入。断电后,其中的信息不会丢失。
    它用于存放永久性的程序和数据。如系统引导程序、监控程序、操作系统中的基本输入/输出管理程序(BIOS)等。
总线

连接微型计算机各组成部分的一组信号线,包括 地址总线AB、数据总线DB、控制总线CB 等三类。

地址总线AB:在对存储器或I/O端口进行访问时,
            传送由CPU提供的要访问存储单元或I/O端口的地址信息,
            以便选中要访问的存储单元或I/O端口,是单向总线。 

数据总线DB:从存储器取指令或读写操作数,对I/O端口进行读写操作时,
            指令码或数据信息通过数据总线送往CPU或由CPU送出,是双向总线。

控制总线CB:各种控制或状态信息通过控制总线由CPU送往有关部件,
            或者从有关部件送往CPU。CB中每根线的传送方向是一定的。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
系统软件

面向计算机的软件:操作系统、监控程序、I/O驱动程序、编译与解释程序和各种诊断、检查、引导程序等
面向用户的软件:各种程序设计语言、实用程序、字处理程序等

应用软件

为了解决各类实际问题,利用计算机以及它所提供的各种系统软件,编写解决各种实际问题的程序。

STM32的硬件系统架构

微型计算机的硬件系统由微处理器、存储器、输入设备、输出设备和系统总线组成。
那stm32呢 是不是也是这个规律,我们一起来看看:
STM32由驱动单元、FLASH、SRAM、片上外设和总线矩阵组成
我们一起来看看STM32芯片手册的系统结构图
在这里插入图片描述

这是手册的解释:

在小容量、中容量和 大容量产品中,主系统由以下部分构成:
● 四个驱动单元:
─ Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus)
─ 通用DMA1和通用DMA2
● 四个被动单元
─ 内部SRAM
─ 内部闪存存储器
─ FSMC
─ AHB到APB的桥(AHB2APBx),它连接所有的APB设备
这些都是通过一个多级的AHB总线构架相互连接的

说的还是蛮清楚的啊,看不懂?那我来翻译翻译!!!
左边三个方框和一个梯形是处理器 由1个cortex-m3核、2个dma和内核系统总线组成
(DMA不懂?理解成受精卵版的4090吧)
右边其他的就是片上外设 如片内的ROM即flash、RAM即SRAM、FSMC即用于连接外部存储的总线,
还有通过AHB桥接到各种各样的GPIO、TIM、ADC等等等等。

驱动单元

芯片手册上有的就不多说了,上图自己看。
在这里插入图片描述

  1. 内核通过ICode 总线读取内部FLASH代码指令来执行程序.
  2. DCode这条总线是用来取数据的.
  3. DMA总线与DCode总线一样主要是用来传输数据,但Dcode总线传输数据要占用内核(cpu)的资源,而DMA总线相当于独立于内核cpu但帮助内核cpu传输数据而不用占用内核(cpu)的资源,就是在DMA传输数据的同时内核cpu可以干别的事情比如点亮一个LED灯
  4. 总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁
被动单元
  1. FLASH、SRAM这些平时线下班面试题都有说,堆、栈是什么,什么区别、const是什么、malloc是什么、局部变量是什么、 内存分布图等,相信大家都非常熟悉了
  • 内存分布说明:
    内核空间: 放置操作系统相关的代码和数据。(用户不能直接进行操作 ------ 可以通过调用系统提供的api函数)
    栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
    内存映射段是高效的I/O映射方式,用于装载一个共享的 动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
    堆用于程序运行时动态内存分配,堆是可以上增长的。
    数据段–存储全局数据和静态数据。
    代码段–可执行的代码/只读常量。
  1. FSMC可以用来拓展内存的控制器,以后大家工作可能接触的到
  2. AHB到APB的桥:挂载着STM32各种各样的特色外设 GPIO、串口、I2C、SPI。学习单片机的重点,就是要学会编程这些外设去驱动外部的各种设备

内存映射

存储器映射

所以 知道了系统框图之后,知道了系统有哪些东西之后,有什么用?
我们还是对他们的之间的工作关系感觉非常的模糊
如:

  • 外设的寄存器怎么访问和控制,通过地址 地址哪来的?
  • 总线怎么读的FLASH?

我尝试解释给大家,好吧!
就是内存映射,其实应该是存储器映射,
我搜了好几篇博客都这么叫,那就这么叫吧,可能我对内存映射有点误解。
咱们用的这个存储器,他本身是不具备地址信息的,他的地址是板子启动初始化的时候分配的,
那这个给存储器分配地址的过程被称为存储器映射,
你可能以为我说的存储器是RAM、ROM,
但其实STM32的所有片内外设其实都是存储器,
他们都会被映射到一个4GB的线性地址空间内
数据字节以小端格式存放在存储器中
(什么是小端,低地址放低位,高地址放高位)

4GB

又衍生出来一个问题,那为什么是4GB的地址空间?
因为 存储空间的大小是由芯片内CPU内的地址总线的数量来决定的,而stm32芯片内部的总线为32根
2的32次方等于4GB
232B/210/210/210 = 2^2GB = 4GB
所以!STM32中的32是32根地址线?
NO!32位的单片机的地址线数量8、16根的都可以
STM32刚好碰巧的是CPU能够处理的数据位宽与地址线数量恰好都是32

所以什么是CPU能够处理的数据位宽?
MCU芯片内部CPU在处理数据时,每次可以处理的数据位宽为32个bit。
正是由于这个原因,STM32内部的寄存器大小都是32位
如果现在一款32单片机的地址线是8,
那他要访问一个32位的内部寄存器数据时,
他可以读取4次寄存器数据到CPU中,cpu一次对这32个位进行处理
懂了吧! 我们继续。

看看stm32的内存映射图
在这里插入图片描述

地址其实就是门牌号,存储中的每个字节就是房间,
存储器生产出来后,这些房间是没有地址的(门牌号),
映射的过程其实就是将这些门牌号分配给这些房间,
分配好后,每个门牌号只能访问自己的房间,
没有被分配的地址就是保留地址,
所谓保留地址的意思就是,没有对应实际存储空间。

上面的内存映射图4G的空间里 32把他们分成8块 每块512M
其中最重要的是代码区、静态RAM、片上外设

代码区

在这里插入图片描述

我们平时写的代码就是放到代码区的0x0800 0000~0x0807 FFFF
一共512KB,但是咱们上官二号stm32f1就128KB的flash 所以映射也只会使用128KB
可以看MDK-Keil中的jlink烧录选项界面,就有说烧录的地址范围 开始 大小
也提到了RAM的开始地址的大小

在这里插入图片描述

这里有个东西跟大家说一下 既然我们烧录代码到0x0800 0000之后
可是又印象中说 代码是从地址0x0开始的,是为什么?
地址重映射!
本来没有东西 然后还有一个大家影响中的东西叫做启动方式
stm32可以通过BOOT[1:0]引脚选择三种不同启动模式
可以选择将0x00000000-0x001FFFFF映射到不同的存储器上
默认大部分都是映射的flash 所以这就说的通了

在这里插入图片描述

上面代码区映射图里还有个system memory和option bytes
那个是系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),
当使用ISP方式加载程序时,就是由这个程序执行。
这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。
选项字节存储芯片的配置信息及对主存储块的保护信息。

所以stm32也可以像51一样用串口下载
但是在用串口烧录代码的时候需要改变启动模式到系统存储器
串口烧录完,还要把boot引脚改回主闪存存储器启动模式
有小伙伴自己学过stm32,用到过烧录程序flymcu,这个软件比较厉害
可以通过DTR和RTS改变BOOT的引脚电平,
达到不用修改BOOT引脚就可以下载运行代码,
实际上是软件替我们做了改变BOOT引脚的操作

以上说的是ISP,
然后还有个IAP是我们自己在flash里面写用户自己的bootloader
可以玩的很花,你们自行YY

静态ram

这个好像没什么好讲的
不同的型号内置sram不一样 所以性能不一样
越大越好 越大越贵 甚至能跑图形界面等等
所以有了FSMC可以外接SDRAM
上官二号好像没有FSMC外设 就那几个引脚 确实不太够用

片上外设

寄存器映射
可算到这了 这个是很多同学懵逼的地方
寄存器初始化 读写这些 很模糊
对单片机的软件硬件之间的控制到底哪里来的 在这里可以得到答案
前面内存映射图里面还有一个peripherals外设 就是片内外设的映射图

什么是寄存器 给特定功能的的单元取的别名这个别名就叫做寄存器
怎么用寄存器 通过寄存器地址去访问
地址哪里来 单片机硬件帮我们把这些映射到内存中

这些片上外设们以四个字节为一个单元,共32bit,
每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。
我们可以找到每个单元的起始地址,然后通过C语言指针的操作方式
(既然一个单元是四个字节那我们就用一次取四个字节的指针(int *)来操作这些功能单元)
来访问这些单元,如果每次都是通过这种地址的方式来访问,
不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,
以功能为名给这个内存单元取一个别名,
这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫 寄存器映射

在这里插入图片描述

我们想要操作一个外设 比如GPIOA_Port1
可能是读取状态 可能是设置状态, 初始化其实就是在设置状态
那就需要操作对应的寄存器,首先得到GPIOA_Port1的基地址
后根据要设置的状态所在寄存器位置进行地址偏移,即可到达目标点并进行读写操作

各个寄存器的地址=外设基地址+寄存器相对于外设基地址的偏移  
  • 1

51大家都玩过 我就不解释了 就是你们对那些TMOD TL0 TH0进行位操作
都是51头文件库帮你们封装好的寄存器地址
如果大家想尝试自己用寄存器开发就是要自己去算去偏移寄存器地址

总结

这篇就是用来帮助大家拓展微机系统知识的 不讲具体技术细节
让第一次接触到单片机开发的同学不那么恐惧
诶 这个变量哪里来的 都没初始化啊
诶 这个怎么就对它直接 与&或|操作了 我都不知道里面是啥
诶 我这个搞进去 怎么就单片机会有反应了 那样搞进去为啥没反应了
我们目前这种学习环境还相对理想
这样的解释也足够了
希望对大家有所帮助!!!

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/682008
推荐阅读
相关标签
  

闽ICP备14008679号