STM32学习笔记(一):架构(以STM32F103为例)

作为一个零基础的小白,起步学习单片机真的非常迷茫和痛苦。为了激励自己学习,同时也充当笔记的作用,我想通过博客的方式对学习过程进行记录。有一些引用的文章我自己是速览了一下,但是也没有深入仔细看,放进来方便日后查阅。中间难免会有错误或者理解不到位的地方,恳请大家指出,感谢大家的支持。

在此过程中参考的数据手册是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架构定义了处理器的指令集架构,即规定了处理器能够识别和执行的指令集合、寄存器组织、内存模型和异常处理机制等,软件开发人员编写的程序必须基于这样的架构才能被处理器识别并执行。哈佛体系结构定义了中央处理器访问指令和数据的方式,与之相对的是冯诺依曼结构。哈佛体系和冯诺依曼体系的区别就在于,前者的指令和数据分别存储在不同的存储器,走不同的总线,而后者都存在同一个存储器中,走相同的总线。两者的优缺点在下面这篇博客中给出:

http://t.csdnimg.cn/4BA4Z

从内核引出了三条总线: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的介绍在此:

http://t.csdnimg.cn/mHf9a


二. 从机部分

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协议的合集)的介绍链接:

http://t.csdnimg.cn/Y1HVj

(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之间的区别:

http://t.csdnimg.cn/54uv1

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来配置,这篇博文有讲:

http://t.csdnimg.cn/COiLT

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的基本框架啦!撒花!接下来就是对各个外设进行学习!有机会的话也把引脚学一学,现在脑子不太够用啦!

### 回答1: STM32款基于ARM Cortex-M 内核的微控制器系列,其软件架构设计主要包括以下几个方面。 首先,STM32 的软件架构设计根据其内核特性,采用分层结构,包括底层驱动层、中间层和应用层。底层驱动层负责与硬件外设进行交互,中间层提供些常用的库函数和协议栈,应用层则是开发者实现自己的业务逻辑的地方。这种分层的设计使得软件开发更加模块化和可维护。 其次,STM32 的软件架构设计采用了面向对象的编程思想,使用多种软件设计模式,如事件驱动模型、观察者模式等。通过事件驱动模型,外设的操作可以通过中断方式触发,有效解决了资源竞争和实时性的问题。而观察者模式可以实现不同模块之间的解耦,方便软件的扩展和维护。 另外,STM32 的软件架构设计还注重数据结构的设计和优化。根据不同的应用场景,可以合理选择适当的数据结构和算法,提高软件的效率和性能。同时,还可以利用DMA (直接内存访问)控制器和外设的硬件加速功能,减轻CPU 的负担,提高系统的实时性。 最后,STM32 的软件架构设计还包括低功耗优化。通过合理的休眠模式的选择,以及中断和时钟的管理,可以降低系统的功耗,延长电池寿命。此外,还可以通过软件设计实现功耗管理策略,根据系统的实际工作状态动态调整功耗模式,更好地满足应用要求。 综上所述,STM32 的软件架构设计是个以分层结构为基础,面向对象、事件驱动、数据结构优化和低功耗优化为特点的系统设计。这种设计可以提高系统的灵活性、扩展性和实时性,满足不同应用场景的需求。 ### 回答2: STM32软件架构设计是指在使用STM32系列微控制器开发应用程序时所设计的软件体系结构。它是个基于嵌入式系统的设计,涉及到硬件平台和软件层面的设计。 软件架构设计通常包括以下几个方面: 1. 硬件平台选择:首先,需要选择合适的STM32微控制器作为硬件平台。选择合适的芯片型号,根据项目需求确定其性能、接口、存储等硬件资源。 2. 系统划分:将整个系统按功能进行划分,确定主控制逻辑、外设驱动、通信协议等模块的划分。 3. 任务调度:设计任务调度器,将不同的任务分配到不同的优先级中,确保系统中各个任务之间的协调工作。 4. 驱动程序设计:根据硬件平台的要求,编写相应的驱动程序,实现对外设的访问和控制。 5. 中断处理:设计中断处理程序,响应外部中断事件(如,按键触发)。 6. 通信协议设计:如有需要,根据项目需求,选择合适的通信协议(如CAN、UART、SPI等),并进行相应的协议设计和实现。 7. 任务逻辑设计:根据需求,设计各个任务的逻辑流程,并实现任务之间的交互、数据传输等操作。 8. 软件测试和调试:对软件进行测试和调试,确保系统功能的正确性和稳定性。 总之,STM32软件架构设计对于嵌入式系统的开发非常重要。它能够提高系统的稳定性、可扩展性和可维护性,同时也能够优化资源的利用,提升系统的性能。有个良好的软件架构设计可以有效地降低开发难度和时间,提高开发效率。 ### 回答3: STM3232位的嵌入式微控制器系列,软件架构设计是指在STM32开发过程中,根据系统需求和硬件特性,设计出合理的软件架构,用于实现系统功能和性能的优化。 首先,软件架构设计要考虑系统的模块划分。针对不同的功能模块,将其划分为独立的模块,并通过合适的接口进行通信。如,将外设控制模块、通信模块、数据处理模块等划分为不同的模块,便于模块之间的独立设计和后续的维护。 其次,软件架构设计要考虑系统的任务调度与管理。采用合适的任务调度算法,实现任务的优先级管理和任务切换。通过任务调度器,合理安排任务的执行顺序,提高系统的响应能力和效率。 此外,软件架构设计还要考虑系统的中断管理。STM32采用了中断机制,对于外部事件的响应十分重要。在软件架构设计中,应合理配置中断优先级,确保中断的及时响应和处理。同时,针对不同的中断类型,设计合适的中断服务程序,以实现相应的功能需求。 另外,软件架构设计要考虑系统的存储管理。在STM32中,具有不同的存储器,如Flash、RAM等。针对不同的存储器,设计合适的存储管理模块,实现数据的读写和管理。同时,还要考虑存储器的分配和使用,在有限的存储容量内实现系统功能的完整性。 最后,软件架构设计还要考虑系统的通信协议和接口设计。在STM32开发中,通常需要与外部设备或其他硬件进行通信。根据具体需求,选择合适的通信协议,并设计相应的通信接口模块,以实现数据的传输和交互。 综上所述,STM32软件架构设计是个系统工程,需要考虑多方面的因素。通过合理的模块划分、任务调度与管理、中断管理、存储管理以及通信协议和接口设计,可以实现系统功能和性能的优化,满足不同应用场合的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值