作为一个零基础的小白,起步学习单片机真的非常迷茫和痛苦。为了激励自己学习,同时也充当笔记的作用,我想通过博客的方式对学习过程进行记录。有一些引用的文章我自己是速览了一下,但是也没有深入仔细看,放进来方便日后查阅。中间难免会有错误或者理解不到位的地方,恳请大家指出,感谢大家的支持。
在此过程中参考的数据手册是STM32F10xxx版本的,参考网课是b站上江协科技的视频。数据手册在江协科技的视频简介里有。
STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili
由于我接触到的型号是STM32F103,属于超高密度产品(XL),因此这里的系统框架参考的是数据手册里的figure 1而不是figure 2(connectivity line device),我感觉,看数据手册两者之间的框架差别不大,cl型的会多一个master少一个slave。要看芯片选型的可以看看这里:
STM32不同型号的芯片对应的启动文件如何选择_startup_stm32f10x_cl.s-CSDN博客
废话不多说开始学习STM32的框架吧~
单片机是一个SoC(System on Chip)系统。一个完整的单片机包括中央处理单元(CPU,Central Processing Unit)、程序存储器(Read-Only Memory)、数据存储器(Random Access Memory)、周边外设(Peripheral)和数据总线(BUS)。CPU获取程序的指令,并对指令进行执行;程序存储器存储了这些指令;数据存储器存储了这些指令处理的数据;周边外设是一些被操控的单元;数据总线负责连通各个部分进行信息传输。
在XL超高密度产品框架中,有四个master(主机)和四个slave(从机)。主机负责发起和控制通信或操作的设备,通常具有更强大的处理能力和控制能力;从机被动地接受主机的指令或请求,并执行相应的操作。四个主机分别是连接内核Cortex-M3的DCode和System总线以及两个DMA()的总线,四个从机分别是SRAM(Static Random Access Memory)、Flash闪存、FSMC(Flexible static memory controller)和AHB(Advanced High performance Bus)。
碎碎念:我一直迷惑为啥ICode不是主机的一部分,求教~我个人的理解是Icode只是执行指令的预取操作,并没有执行那么复杂的主从之间的通讯操作。
以下是STM32的系统框架图:
一. 主机部分
1. Cortex-M3内核与三条总线
这里的中央处理器内核是Cortex-M3。Cortex-M3是32位(即一次最多处理32位的二进制数据)的处理器内核。这个内核属于ARMv7架构,哈佛体系结构的。ARMv7架构定义了处理器的指令集架构,即规定了处理器能够识别和执行的指令集合、寄存器组织、内存模型和异常处理机制等,软件开发人员编写的程序必须基于这样的架构才能被处理器识别并执行。哈佛体系结构定义了中央处理器访问指令和数据的方式,与之相对的是冯诺依曼结构。哈佛体系和冯诺依曼体系的区别就在于,前者的指令和数据分别存储在不同的存储器,走不同的总线,而后者都存在同一个存储器中,走相同的总线。两者的优缺点在下面这篇博客中给出:
从内核引出了三条总线:ICode指令总线,DCode数据总线,System系统总线。
其中,ICode和Dcode连接Flash闪存,中间的FLITF是闪存接口(Flash Interface)。ICode总线接Flash的指令集接口,作用是取指令,只和指令有关;DCode总线接Flash的数据集接口,的作用是对数据读写访问,只和数据有关(程序中的常量数据),对应了此前提到的哈佛体系结构。
System系统总线通过Bus matrix 访问其他外设。Bus matrix即总线矩阵,就是多主(Core、DMA)多从(RAM、APB、外部总线)的交联和仲裁(仲裁采用循环调度算法)。目的是为了提高不同主控单元访问不同外设情况下的带宽。借助Bus matrix,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行的时候,系统也可以实现并发访问和高效运行。有关总线矩阵的细节在下面这篇文章中有解说:
单片机(二)STM32F407启动流程 - 知乎 (zhihu.com)
2. DMA(Direct Memory Access)
DMA是CPU的小秘书,专门干数据搬运这种简单重复且枯燥的体力活。外部设备向DMA发送数据访问的请求后,DMA就会获得总线的访控制权,然后到存储器中去访问数据并搬运。可以看到,Cortex-M3内核和DMA都可以通过Bus Matrix去访问Flash、SRAM、FSMC存储器。
有关DMA的介绍在此:
二. 从机部分
1. 存储器:Flash、SRAM、FSMC
这三个我暂时不展开学啦。
Flash闪存中存储了编写的程序以及程序中的常量数据, SRAM(Static Random Access Memory)用于存储程序运行过程中的变量数据。FSMC( Flexible static memory controller)是 STM32中一个很有特色的外设,用于生成硬件时序,帮助STM32访问外部的存储器。有关各种存储器的介绍可以参考以下博客:
https://zhuanlan.zhihu.com/p/640008073
https://zhuanlan.zhihu.com/p/640649076
2. 其他外设
从Bus matrix矩阵出来以后,可以看到AHB(Advanced High performance Bus,先进高性能总线)总线。高性能(我理解主要是宽带宽,就是数据的吞吐量比较大,要求通讯速度比较快)的外设就挂载(意思是通过这条总线内核可以访问到外设)在这条总线上。桥接后是APB(Advanced Peripheral Bus,先进外设总线),挂载的是低速的外设。中间的桥接是因为AHB和APB的总线协议,总线速度以及数据传输的格式有差异,需要对数据进行转换和缓存。APB2一般和AHB同频(72MHz),而APB1频率较低(36MHz),因此相比APB1,APB2又会连接稍微重要一点的外设。比如TIM1和TIM8是高级定时器,就挂载在APB2上,而其他定时器TIMx就挂载在APB1上。有关AHB,APB的细节可以参考这篇博客:AHB与APB总线你需要知道的事儿 - 知乎 (zhihu.com)
有关转接桥可以看看下面这篇,此外这篇博文后面也有关于AMBA总线协议(AHB,APB,ASB,AXI协议的合集)的介绍链接:
(1)AHP上挂载的外设
A. RCC(Reset & Clock Control)
复位与时钟控制。复位包括系统复位(system reset)、电源复位(Power reset)和备份域重置(Backup domain reset)。时钟是单片机运行的基础,决定了各个模块运行的步调。在单片机中,不管配置什么,都需要先打开对应的时钟信号。RCC中的信号源包括:
a. 用于驱动系统时钟(系统时钟)
HSI:高速内部时钟,内部时钟源,RC振荡器实现,8MHz
HSE:高速外部时钟,接外部时钟源,晶振实现,4MHz~16MHz
PLL:锁相环,用于倍频,生成比前两者时钟源更高频率的时钟
b. 二级时钟源
LSI:低速内部时钟,驱动独立看门狗,可选择性给待机或者停止模式下自动唤醒提供RTC时钟,RC振荡器实现,40kHz
LSE:低速外部时钟,选择性生成RTC(real-time clock)时钟信号,晶振实现,32.768kHz
时钟源给内核和各种外设提供时钟信号的方式已在数据手册的clock tree中清晰地给出:
B. SDIO(Secure digital input/output interface)
SDIO模块用于使AHP总线能够读写MMC(MultiMedia Card)、SD存储卡、SDIO卡和CE-ATA接口设备。其中包含SDIO adapter模块和AHB接口模块,前者负责为接入的设备提供时钟信号,向接入设备收发指令和传输数据,后者访问前者中的寄存器,与AHB通信,向系统发送中断或者DMA请求。
(2)APB上挂载的外设
最后这么一大坨咱们就快速过!我也学不动啦!
ADC(Analog-to-digital converter ):模数转换器(模拟信号转数字信号),12bit;
DAC(Digital-to-analog converter ):数模转换器,12bit;
UART(Universal Asynchronous Receiver/Transmitter):通用异步收发器,串口通信(数据串行传输)的一种;
USART(Universal synchronous asynchronous receiver transmitter ):通用同步/异步收发器,串口通信的一种,特点是通过定义起始位和停止位来控制接收端和发送端正常传递数据;
SPI(Serial peripheral interface):串行外设接口,串口通信的一种,特点是通过时钟信号来保证发送端和接收端传递数据的同步;
I2C(Inter-Integrated Circuit):内部集成电路,串口通信的一种,特点是有应答响应机制,支持多主多从模式;
附上一位本科博主整理的UART、SPI和I2C之间的区别:
USB(Universal serial bus full-speed device interface):通用串行总线,个人粗浅的感受就是它最大的作用是和个人电脑连接hhh
bxCAN(Basic Extended Controller Area Network):CAN是汽车行业常用的串行通信协议;
GPIO(General Purpose Input Output ):通用输入/输出,通用端口,总线扩展器,用来增加系统的IO口;
碎碎念:写到这里真的想找个时间把各种端口的通信原理都学习整理一下,但是我学习能力真的不太行,学到这我大脑已经宕机了各种博文看不懂一点,以后再好好学吧,先挖个坑在这~
AFIO(Alternate function I/O and debug configuration ):复用功能输入输出和调试配置,复用的意思是引脚不是单一功能的,可能是有好几个功能,那么具体行驶哪个功能,就需要通过AFIO来配置,这篇博文有讲:
EXTI(External interrupt/event controller):外部中断/事件控制器, 可分为两大部分功能,一个是产生中断,另一个是产生事件。中断是单片机工作的重要机制,后面我会好好学的~
PWR(Power control):电源控制;
BKP(Backup):备份寄存器,备份域里的数据在断电、待机、复位的情况下都不会被删除或修改;
IWDG(Independent watchdog):独立看门狗,用于检查系统是否正常工作的模块,其实就是一个递减计数器,系统正常运行时数值会不断刷新从而确保不会减为0,否则会产生复位信号,有独立时钟信号,用于监视硬件错误;
WWDG(window watchdog):窗口看门狗,时钟信号与系统一致,用于监视软件错误;
RTC(Real-time clock):独立的定时器,掉电后还是可以运行;
TIM(timer):定时器,在生成PWM(脉宽调制波形)中不可或缺。分为高级定时器(Advanced-control timers (TIM1 and TIM8)),通用定时器(General-purpose timers (TIM2 to TIM14))和基本定时器(Basic timers (TIM6 to TIM7))
终于粗略学完STM32的基本框架啦!撒花!接下来就是对各个外设进行学习!有机会的话也把引脚学一学,现在脑子不太够用啦!