5、STM32基础知识 - XDU-Educational-UAV/Drone_Master_PID GitHub Wiki
5.1 STM32时钟树原理
我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。
在STM32中每个外设都有其单独的时钟,在使用某个外设之前必须打开该外设的时钟 ,为什么要这么麻烦来设置每一个外设的时钟而不是将所有外设的时钟统一打开?因为STM32的外设繁多,外设的运作所需要的最佳时钟各不相同,如果所有时钟同时运行会给MCU带来极大的负载,所以STM32采取自助餐式的时钟管理方式——随用随开。
各类时钟简括:
1.HSE时钟(高速外部时钟):来源为外部无源晶振,通常速度8M。由RCC_CR时钟控制寄存器中的16:HSEON控制。
2.HSI时钟(高速内部时钟):来源为芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,知道HSE启动成功,相当于HSE的替补。由RCC_CR时钟控制寄存器的位0:HSION控制。
3.PLLCLK(锁相环时钟):来源为HSI/2、HSE经过倍频所得。由CFGR(时钟配置寄存器)中PLLXTPRE、PLLMUL控制。
4.SYSCLK(系统时钟):来源为HSI、HSE、PLLCLK,最高速度为72M。由CFGR中的SW控制。
5.HCLK(AHB高速总线时钟):来源由系统时钟分频得到,速度最高为72M。由CFGR中的HPRE控制。
6.PCLK1(APB1低总线时钟):来源为HCLK分频得到,速度最高为36M ,为APB1总线上的外设提供时钟。由RCC_CFGR时钟配置寄存器的PPRE1位控制。
7.PCLK2(APB2高总线时钟):来源为HCLK分频得到,速度最高为72M,为APB2总线上的外设提供时钟。由RCC_CFGR时钟配置寄存器的PPRE2位控制。
8.RTC时钟:来源为HSE_RTC(HSE分频得到)、LSE、LSI,为芯片内部的RTC外设提供时钟。由RCC备份域控制寄存器RCC_BDCR中RTCSEL控制。
5.2 STM32 GPIO原理
STM32G0每组通用I/O 端口包括4 个32 位配置寄存器(MODER、OTYPER、OSPEEDR
和PUPDR)、2 个32 位数据寄存器(IDR 和ODR)、1 个32 位置位/复位寄存器(BSRR)、1
个32 位锁定寄存器(LCKR) 和2 个32 位复用功能选择寄存器(AFRH 和AFRL)等。
GPIO可以配置成以下8种工作模式:
浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。
上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于30K~50K欧姆,CPU可以随时在输入数据寄存器的另一端,读出I/O端口的电平状态。这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。该端口在默认情况下输入为高电平。
下拉输入:下拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个下拉电阻。与上拉输入模式类似,这种模式的好处在于外部没有输入时,由于内部下拉电阻的原因,我们的处理器会觉得我们输入了低电平。
模拟功能:STM32的模拟输入通道的配置很简单,信号从I/O端口直接进入ADC模块。此时,所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号。
开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。
推挽输出:推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。
开漏复用输出:GPIO的基本功能是普通的I/O,而STM32有自己的各个功能模块,这些内置外设的外部引脚是与标准GPIO复用的,当作为这些模块的功能引脚时就叫复用。开漏复用输出功能模式与开漏输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连即与复用功能的输出端相连,此时,输出数据寄存器在输出通道被断开。
推挽复用输出:推挽复用输出功能模式与推挽输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连,即与复用功能的输出端相连,而输出数据寄存器在输出通道被断开。
5.3 STM32 NVIC原理
NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。
通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt
request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context
switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种运行信息切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用。
对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8
=256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST的STM32F1xx和F4xx只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套。
对于这个NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以STM32为例进行介绍,STM32G030是只使用了这个8位寄存器的高四位[7:4]。
图5.3 NVIC优先级
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。
5.4 STM32 EXTI原理
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
外部中断的触发方式有:电平触发和跳沿触发。
边沿触发和电平触发基本就是触发器和锁存器的区别。触发器是边沿触发,只有当时钟上升(或下降)的一瞬间,触发器会读取并锁存输入信号。输出信号仅在时钟信号上升(或下降)的一瞬间会发生变化。锁存器是电平触发,只要使能(enable)信号处于高电平(或低电平),输出就会随着输入信号变化,直到使能信号变为低电平(或高电平)时,输出才会锁存,不再随输入变化。
STM32上每个IO都可以作为外部中断输入,其中断控制器支持22个外部中断/时间请求。
EXTI线0~15:对应外部IO口的输入中断。
EXTI线16:连接到PVD输出。
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB OTG FS唤醒事件。
EXTI线19:连接到以太网唤醒事件。
EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
EXTI线21:连接到RTC入侵和时间戳事件。
EXTI线22:连接到RTC唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。但是值得注意的是:外部IO口有16条中断线,但并不是能设置16个外部中断,一组IO口对应一根中断线,每个IO口都可以使用这跟中断线,但是在同一时刻,只能响应一个端口的事件触发,不能同时响应所有GPIO端口的事件,也就是分时复用。
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数。
中断线0 ~ 4 各对应一个中断函数
中断线5 ~ 9共用中断函数EXTI9_5_IRQHandler
中断线10 ~ 15共用中断函数EXTI15_10_IRQHandler
5.5 STM32 ADC和DMA原理
5.5.1 STM32 ADC原理
ADC(Analog-to-Digital Converter,模/ 数转换器)。也就是将模拟信号转换为数字信号进行处理,在存储或传输时,模数转换器几乎必不可少。
STM32 ADC特点
12位逐次逼近型的模拟数字转换器。
最多带3个ADC控制器
最多支持18个通道,可最多测量16个外部和2个内部信号源。
支持单次和连续转换模式
转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
通道0到通道n的自动扫描模式
自动校准
采样间隔可以按通道编程
规则通道和注入通道均有外部触发选项
转换结果支持左对齐或右对齐方式存储在16位数据寄存器
ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在
ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
ADC供电要求:2.4V-3.6V
ADC输入范围:VREF- ≤ VIN ≤ VREF+
5.5.2 STM32 DMA原理
DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。
CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。
DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输(外设到内存、内存到外设、内存到内存、外设到外设),但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。
5.5.3 DMA在AD转换中的作用
ADC采集到的数据是不能直接用的,单次采集会出现不准确的数据,所以要多次采样才能减小系统误差。也可以说,单次ADC采集无意义。多次采样造成了数据传输量大,因此我们需要独立于Cortex内核的DMA模块,实现通信“桥梁”的作用,将外设映射的寄存器“连接”起来,这样我们就可以高速访问各个寄存器,其传输不受CPU的支配。
5.6 STM32 PWM原理
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图 14.1.1 所示:
图 14.1.1 PWM 原理示意图
PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!