赞
踩
大家好,我是杰哥嵌入式开发
最近在出定时器系列,
但是线下班有一些学生在学习完C语言之后,
在51接触各种寄存器和对软件代码各种操作是如何在单片机系统中起到作用的感到非常的不解,
经过我的初步分析,是对嵌入式微机系统的大概雏形系统框架不熟悉导致。
所以我决定出一期基于STM32的系统框架介绍博客。
欢迎大家关注我的gitee仓库:
gitee源码仓库链接跳转
来分析一下这个框图:
众所周知,计算机在发展初期就是上千万个晶体管堆叠而成的
逐步发展成现在的第四代微型集成电路计算机
不管是咱们得51 32 香橙派,你们会发现中间的那个芯片都是由CPU和片上外设组成
在此基础上增加外部输入输出设备 如网口、USB、DDR、EMMC等。
这一硬件体系结构采用的是什么,是我们大学学计算机课经常听到的冯.诺依曼体系
还有另一个叫什么?你们来说!
冯.诺依曼体系的设计思想:
1 以二进制形式表示指令和数据。(计算机的语言)
2 程序和数据事先存放在存储器中,计算机在工作时能够高速地从存储器中取出指令加以执行。(内存映射)
3 由运算器、控制器、存储器、输入设备和输出设备等五大部件组成计算机硬件系统。 (通过总线结构交互)
下面我们会拿STM32的硬件系统架构来讲解,讲解之前要让大家了解上面流程图中各个专业名词的定义,让大家对通用微机系统有一个基础文字定义的印象,然后在这里不要问我,我也不会,哈哈哈:
控制器(控制单元CU ):全机的指挥控制中心。负责读取指令,指令译码,形成各种定时控制信号,向内部各功能单元发送相应的控制命令,协调各部件之间的工作。
相当于微处理器内部的RAM,用于暂存数据和运算结果。我也没看懂 可以理解为我们上次讲的CPU中的cache吧
用来进行算数或逻辑运算以及移位循环等操作。
计算机系统的记忆装置,用来存储程序和数据。
按工作方式,内存可分为两大类:
随机读写存储器RAM(Random Access Memory) 如内存条、DDR2 3 4 5
和只读存储器ROM(Read Only Memory) 机械硬盘 固态硬盘 flash TF-sd卡 emmc
以后面试问你们记得这么说:
连接微型计算机各组成部分的一组信号线,包括 地址总线AB、数据总线DB、控制总线CB 等三类。
地址总线AB:在对存储器或I/O端口进行访问时,
传送由CPU提供的要访问存储单元或I/O端口的地址信息,
以便选中要访问的存储单元或I/O端口,是单向总线。
数据总线DB:从存储器取指令或读写操作数,对I/O端口进行读写操作时,
指令码或数据信息通过数据总线送往CPU或由CPU送出,是双向总线。
控制总线CB:各种控制或状态信息通过控制总线由CPU送往有关部件,
或者从有关部件送往CPU。CB中每根线的传送方向是一定的。
面向计算机的软件:操作系统、监控程序、I/O驱动程序、编译与解释程序和各种诊断、检查、引导程序等
面向用户的软件:各种程序设计语言、实用程序、字处理程序等
为了解决各类实际问题,利用计算机以及它所提供的各种系统软件,编写解决各种实际问题的程序。
微型计算机的硬件系统由微处理器、存储器、输入设备、输出设备和系统总线组成。
那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等等等等。
芯片手册上有的就不多说了,上图自己看。
所以 知道了系统框图之后,知道了系统有哪些东西之后,有什么用?
我们还是对他们的之间的工作关系感觉非常的模糊
如:
我尝试解释给大家,好吧!
就是内存映射,其实应该是存储器映射,
我搜了好几篇博客都这么叫,那就这么叫吧,可能我对内存映射有点误解。
咱们用的这个存储器,他本身是不具备地址信息的,他的地址是板子启动初始化的时候分配的,
那这个给存储器分配地址的过程被称为存储器映射,
你可能以为我说的存储器是RAM、ROM,
但其实STM32的所有片内外设其实都是存储器,
他们都会被映射到一个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
这个好像没什么好讲的
不同的型号内置sram不一样 所以性能不一样
越大越好 越大越贵 甚至能跑图形界面等等
所以有了FSMC可以外接SDRAM
上官二号好像没有FSMC外设 就那几个引脚 确实不太够用
寄存器映射
可算到这了 这个是很多同学懵逼的地方
寄存器初始化 读写这些 很模糊
对单片机的软件硬件之间的控制到底哪里来的 在这里可以得到答案
前面内存映射图里面还有一个peripherals外设 就是片内外设的映射图
什么是寄存器 给特定功能的的单元取的别名这个别名就叫做寄存器
怎么用寄存器 通过寄存器地址去访问
地址哪里来 单片机硬件帮我们把这些映射到内存中
这些片上外设们以四个字节为一个单元,共32bit,
每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。
我们可以找到每个单元的起始地址,然后通过C语言指针的操作方式
(既然一个单元是四个字节那我们就用一次取四个字节的指针(int *)来操作这些功能单元)
来访问这些单元,如果每次都是通过这种地址的方式来访问,
不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,
以功能为名给这个内存单元取一个别名,
这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫 寄存器映射。
我们想要操作一个外设 比如GPIOA_Port1
可能是读取状态 可能是设置状态, 初始化其实就是在设置状态
那就需要操作对应的寄存器,首先得到GPIOA_Port1的基地址
后根据要设置的状态所在寄存器位置进行地址偏移,即可到达目标点并进行读写操作
各个寄存器的地址=外设基地址+寄存器相对于外设基地址的偏移
51大家都玩过 我就不解释了 就是你们对那些TMOD TL0 TH0进行位操作
都是51头文件库帮你们封装好的寄存器地址
如果大家想尝试自己用寄存器开发就是要自己去算去偏移寄存器地址
这篇就是用来帮助大家拓展微机系统知识的 不讲具体技术细节
让第一次接触到单片机开发的同学不那么恐惧
诶 这个变量哪里来的 都没初始化啊
诶 这个怎么就对它直接 与&或|操作了 我都不知道里面是啥
诶 我这个搞进去 怎么就单片机会有反应了 那样搞进去为啥没反应了
我们目前这种学习环境还相对理想
这样的解释也足够了
希望对大家有所帮助!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。