从零单排嵌入式__stm32硬件基础

从零单排嵌入式----stm32硬件基础

0.引言

   stm32是一款主流的单片机,采用ARM内核设计,由ST公司集成外围器件,设计而成CPU,目前手头有一款stm32f401ret6单片机,后面就使用它来做实验。学习过程主要参考以下三个文档进行:
  
文档1:Cotex-M4内核原理

在这里插入图片描述

文档2:stm32f401系列datasheet

在这里插入图片描述

文档3:stm32f401系列产品手册

在这里插入图片描述

   参考文档是学习嵌入式最直接,最有效的方式。也是迅速学习应用各个厂家的单片机的最有效的方式。天下武功武功出少林,少林武功武功没见过,但站桩,马步这些基本功确实每一位大侠都练过的,文档就是其一吧。

1.STM32F4系列CPU架构

   STM32F4单片机看似很复杂,画人画皮,画鬼画骨,这款单片机的骨就是ARM公司大名鼎鼎的Cotex-M4内核。所以识骨寻踪,要想搞明白真身,还必须得研究一下Cotex-M4内核的原理。

1.1 cotex-M4内核

   内核是什么,内核就是单片机的大脑,做运算,做数据处理。细一想具体怎么做呢,又云山雾罩的。那么我们来西西分解一下:
首先,内核负责运算,怎么运算那是芯片开发设计人员的事情,我们不需要关心。
其次,作为程序开发人员,只需要知道怎么跟CPU交互。
最后,指令和寄存器是控制CPU的工具,下面是讨论。
   指令就是控制M4内核的命令,学会命令才能控制CPU。M4内核采用ARM的一套指令集来实现交互控制。
   寄存器是存放数据的,CPU要运算就得有地方取数据,那就从寄存器里面取喽。
   M4内核主要包括如下寄存器:

在这里插入图片描述

   这里主要讨论一个寄存器,那就是PC寄存器,PC寄存器呢就是我们命令CPU的信差,这是一个专属信差,十分称职,会按照我们的吩咐一条一条把我们的命令送到CPU内部,CPU接到命令就开始执行运算了。
   其他寄存器细节需要在后续移植操作系统时候再进行讨论。

1.2 STM32F4单片机原理

   stm32单片机在M4的基础上,增加了很多的外围器件,这些外围器件当然也在芯片内,是大家肉眼看不到的了,这些外围器件包括,GPIO口,串口,IIC,SPI,flash,ram,timer等等,这些外围器件也跟M4内核一个样子。只不过这些器件都是专用器件,不像cpu有很多通用寄存器,这些器件都提供了专用寄存器,我们通过寄存器配置,便能实现这些外围器件的控制使用。

在这里插入图片描述

1.3 ARM汇编语言

   ARM汇编语言呢就是前面提到的指令了,也就是ARM的一套控制命令。这套命令呢在后续写bootloader,写启动代码时候都需要用的到。汇编语言会被芯片进一步翻译成M4能够明白的指令,并使CPU得以执行这些语言命令。
  单片机的启动代码一般都是用汇编编写,单片机启动后,会准备好C语言运行环境,准备好堆栈,开始进入C语言的世界,后续均是使用C语言来开发。所以使用KEIL开发时,很少能接触到汇编,但这部分是确实存在的。
  移植系统时候,需要仔细学习这部分,设计启动代码,引导操作系统。

2.硬件地址空间分布

2.1 cotex-M4内核地址空间

   M4内核是基于ARM框架设计的,框架呢也是十分复杂,详细原理这里就不讨论了,简单说一下这个框架里最需要了解的就是这个框架的地址规划了,就像一座城市,每家每户都有一个地址,城外人可以根据这个地址就能很轻松的找到城里的每一个人,城市里的人也可以根据地址互相串门,总归总,我们研究这个框架,就需要首要搞明白这个地址分布,通过这些个地址来实现,框架中的每一个模块的访问。

在这里插入图片描述

   M4地址分成了代码区,静态内存区,外围设备寄存器地址区,外部RAM区,外部设备区以及私有外围设备总线区。
M4有32位宽的地址总线,总共可以访问4G的地址范围,所以这个框架总共规划了4G的绝对地址空间。各个厂家的单片机都需统一按照这个地址规划进行单片机设计。例如单片机厂家增加外围器件RAM内存时,需要将RAM映射到0x20000000,对应的0.5G地址上。
   需要强调的是0x40000000地址空间,这里映射了所有外围器件的地址,通过这些地址能够操作任何一个外围器件的相关寄存器,这就是我们今后STM32硬件基础中会经常用到的地址空间。

2.2 STM32F401ret单片机地址

   stm32f401ret6单片机是基于上面框架设计的,所以ST公司也同样遵守了地址分配规则,具体如下,可以对比一下。

在这里插入图片描述

   其中内存区是需要特别注意的,Flash区是程序代码存储的地方,SRAM的96k是内存区,用于存放数据和堆栈。stm32的启动方式选择中,包含了从flash中启动,就意味着我们告诉PC通信员来这里取第一条执行命令。

2.3 单片机中地址的操作

   上面分析了地址空间,那么我们就开始使用前面的地址进行操作了。当选取了boot从flash中启动后,我们需要将启动程序的第一行代码指定到falsh的起始区域,这个区域就是0x0800 0000这个地址了,不信的可以回去查看一下你的map文件或者linux下的链接脚本文件。
   外围器件地址空间包含了单片机厂商在内核基础上增加的全部外围器件地址空间。
   在4G空间的最尾部有一个M4内部外围设备的地址,是不是很疑惑,怎么又搞出个内部外围设备,不要紧张,这个内部外围设备呢是随ARM公司内核一起设计的,像NVIC,SCB这些系统控制模块,还是留给内核厂家自己设计吧,反正只有他们自己最了解自己啊。这些更像是买一送一的喽,省去了单片机厂家很多事情,如果您想做一款单片机芯片出来,其实也很简单,直接买来ARM的IP内核,再买来一大堆什么UART啦,SPI啦,集成到一起,找到台积电,让他们生产一下,就是stm32喽,说的简单,其实过程很难。

3.结论

   这里简单的介绍一下单片机硬件基础,所有的技术不过是一个缩引,还需要更深入的分析,这里就不详细展开,其实先搞清楚这几块就没问题了,后面在涉及到具体模块的时候会详细讨论一下。
   写文章其实是梳理自己知识脉络,总结自己经验的最好方式,如能得到各位大侠得指点,那就更是一桩美事了。
   下一节继续分析硬件基础,及keil编程环境,单片机启动过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值