STM32入门100步系列教学文章
STM32内部重要功能全记录
杜洋 洋桃电子
上一期我们讲了内核、存储器和时钟,它们都是单片机核心功能的一部分,没有它们中的任何一个,单片机都不
能正常工作。而核心功能还包括复位和电源管理两个部分,因为篇幅关系没有写完,这一期把它们补上。同时我还要继续介绍单片机的多个重要功能。之所以说“重要”,是因为单片机如果没有这些功能,虽然可以正常工作,但其性能和所发挥的作用会大大减弱。重要功能包括:低功耗模式、ADC、DMA、I/O端口、调试模式、定时器、看门狗定时器和嘀嗒定时器。因为我们现在是做入门的介绍,一开始不能讲得太深、太复杂,对于每个功能,我只介绍其表面上的功能与原理。大家只要看过,有一个基本的印象即可。待日后讲到编程设计时再深入讲解,你便会有温故知新的感觉。
【复位】
复位功能是核心功能的一部分,大到PC,小到单片机,每一台计算机系统都有。在我小时候,台式机的机箱上会有一个独立的复位按钮。随着PC 越来越高级和稳定,复位按钮渐渐被取消了,但在主板上还是有复位电路的。单片机上的复位功能也有着类似的变化,在我学习单片机时,需要在单片机的一个复位专用引脚上接一个由电阻和电容组成的复位电路。如果没有这个电路,单片机就没法工作。近些年来的新款单片机都把复位功能内置到单片机中,用户甚至可以忽略复位这件事了。如果有必要,你可以在复位引脚上接一个按键用来手动复位,除此之外不需其他操作。
复位功能的作用是让RAM 中的数据清空,让所有连接到复位的相关功能都回到刚开始工作的(初始)状态。在接通电源之前,单片机里的存储器及其他功能的状态是混乱、不稳定的。如果上电后不复位,所有功能都处在无序状态,就好像军队集合时没有立正、稍息、向右看齐,直接齐步走的结果就是乱成一片。复位的作用就是让单片机内部秩序化,都回到设计者规定好的状态。这个状态为用户程序的运行做了充分的准备,就像计算机每次重启一样。
在STM32 单片机中,有一个供电监控器,这个监控器是一直工作的,它能监测外部电源的
电压,当电压低于2V 时,监控器会让单片机复位。当电压高于2V 时,监控器让单片机进入工作状态。这个监控器本质上达到了上电复位的效果,也就是说你每次给单片机接通电源时,电压都是一次从0 升到3.3V(STM32 的工作电压)的过程,这个过程使单片机复位,不需要再外接复位电路。还有一种复位的方法是在单片机的复位引脚上接一个微动开关,开关另一端接地。按下开关可手动复位,如图1 所示。
图1 外接复位按键电路原理图
【电源管理】
电源管理是指对单片机外接电源处理、分配的功能。电源管理主要分成4 个部分,分别是备用电源输入、端口输入/ 输出、逻辑电源输入和模拟电源输入。其结构如图2 所示,蓝方框里是单片机内部电路,方框之外是单片机的外部电路。
先说逻辑电源输入,这是单片机最基本的供电输入端口。给这些接口输入2 ~3.6V 的直流电压,就能让ARM 内核、存储器、I/O 端口和其他纯数字电路工作了。逻辑输入电压还能让I/O 端口输入或输出数字信号的电压。在未来,我们使用I/O端口点亮LED 或者让一个按键输入,都会用到逻辑电源输入的电压。而模拟电源输入的电压是用在模数转换器(ADC)、RC振荡器和PLL 倍频等模拟电路上的。这两部分电源输入在引脚较多(64 脚以上)的单片机上是分开的。而在引脚较少的单片机上,逻辑电源和模拟电源并联在一起使用。分开输入的电源在使用上有很多好处,而合并输入可以减少引脚的占用。合并输入方式会对模拟电源的稳定性造成影响,但如果设计中不要求高精度,一般会合并使用。
备用电源输入是一个独立的存在,它是专门给实时时钟(RTC)供电的,以保证在逻辑电源断开后依然让RTC 保持走时。同时它也给唤醒电路和后备寄存器供电,让它们一直处在工作状态。备用电源输入可以外接独立电源或者一块1.8 ~3.6V 的电池。如果你不想使用单片机内部的RTC 等功能,备用电源可以不接。
图2 供电方案
【低功耗】
单片机在正常工作时,内部大部分功能都处于开启状态,最耗电的ARM 内核处在100% 全速运行状态。试想一下你的PC,在玩大型游戏时,CPU 的风扇强力旋转,这就是CPU 处在100% 运行的时候。而平时CPU 只有5% 左右的工作量。可是单片机的内核却一直处在全速的状态,只是单片机的性能远低于PC,发热量低,你感觉不到而已。当单片机要用在电池供电的产品上时,降低功耗、让电量使用更持久便成了重要的项目需求。STM32 单片机为应对这样的用户需要,做出了低功耗功能。通过关掉一些耗电大的内部功能来达到省电的目的,根据关掉的功能数量,可分为3 种低功耗模式,分别是睡眠模式、停机模式、待机模式,如附表所示。其实这些低功耗模式在不同的单片机手册中会有不同的名字,如有的叫待机模式,有的叫断电模式,但叫什么模式不重要,只要关心这个模式关掉了什么功能、怎么唤醒这些功能就行了,名字只是帮助你记忆的。
睡眠模式,只关掉ARM 内核,其他所有功能正常工作。这种方式不怎么省电,但不会影响整个系统的工作。因为内核在关掉之后,可以通过所有内部和外部功能来唤醒(重新开启)内核。相当于我们的PC 不用时,CPU 只有2% 左右的工作量,几乎关闭。当我们动动鼠标时,CPU 又被这个行为唤醒,处理鼠标移动的事件,完成后又回到几乎关闭的状态。单片机的睡眠模式与之大体相同。睡眠模式的好处是系统的正常工作不受任何影响,只是内核在没
有工作时才关闭;缺点是只关内核不够省电。
停机模式是睡眠模式的升级版,它将ARM 内核与几乎所有内部功能,包括外部高速晶体振荡器和PLL 都关掉了,只有RTC、看门狗定时器、中断控制器在工作,只是还能接收中断,SRAM 中的数据还保存。唤醒的方式是外部中断、RTC 的闹钟还有USB 接口唤醒,除此之外再没有能恢复的方式,因为所有的内部功能都被关掉了,时钟电路都不工作了。这有点像PC 的睡眠模式,进入后只有按电源按键才可以唤醒,唤醒后系统数据、你打开的文件都还在,因为内存没有关掉。停机模式的优点是非常省电;缺点是程序不能正常运行了,只有被唤醒后,内部的功能才能工作。停机模式适用于平时工作任务很少的情况,单片机完成工作后有很长一段时间可以休息。这时开启停机模式,可以最大程度省电。
最后也是最省电的模式是待机模式。它和停机模式的区别是把SRAM 和外部中断控制器也关掉了,用户运行的数据消失,也就表示唤醒后必须重头开始,相当于复位。唤醒的方式是按复位按键、看门狗定时器复位、专用唤醒引脚和RTC 闹钟唤醒。复位按键和专用唤醒引脚完全不耗电,看门狗定时器算是唯一需要耗电的。RTC 闹钟由备用电源供电,不耗逻辑电源的电。待机模式相当于PC 的关机,只有按电源按钮才能复位启动。待机模式在实际的项目开发中很少用到,因为停机模式已经很省电了,只有一些特殊需求才会用到。
附表:低功耗模式表
工作模式 | 关掉功能 | 唤醒方式 |
睡眠模式 | ARM内核 | 所有内部、外部功能的中断/事件 |
停机模式 | ARM内核 内部所有功能 PLL、HSE | 外部中断输入接口EXTI(16个I/O之一) 电源电压监控中断PVD RTC闹钟到时 USB唤醒信号 |
待机模式 | ARM内核 内部所有功能 PLL、HSE SRAM内容消失 | 单片机编程100例详解NRST接口的外部复位信号 独立看门狗IWDG复位 专用唤醒WKUP引脚 RTC闹钟到时 |
【ADC】
在电源管理的部分提到了ADC(模数转换器),它需要模拟电源供电。ADC 的功能是读取模拟量的电压,类似于电压表。如图3 所示,在单片机中,I/O 端口是输入或输出逻辑电平的,也就是高电平(1)和低电平(0)。也就是说,I/O 端口只能读取有电压和没电压两种状态,至于有电压时的电压是多少伏,这就需要ADC 功能来判断。ADC 可以读出从0V 到电源电压之间的具体电压值,并把这个值变成一组数据。单片机的ADC 性能各有不同,有8位、10 位、12 位甚至更高的,位数越多,表示测得的电压值更精密。STM32F103 中的ADC 是12 位的,对于一般的精度需要已经足够。
图3 模拟量电压关系
【DMA】
DMA 功能是一种比较新的功能,它是代替CPU 完成内部功能间的数据传递的。这个概念很好理解,比如上面讲到的ADC功能,在没有DMA 功能的单片机里,想读取ADC 的值,首先要在内核向ADC 功能发出指令,然后等待ADC 读取完成,内核再从ADC 读出数据,再存放到SRAM 当中,如图4 所示。这个过程需要内核的过程参与,这占用了内核的时间,内核就不能做其他工作了。而DMA 功能可以在这种数据读取、存放的任务上完全解放内核。它能按预先设定好的设置从ADC 读出数据,然后自动存放到SRAM 中指定的位置,不需要内核的参与。当内核需要ADC 的数据时,只要读SRAM 指定的位置这一步操作就行了。DMA 不只能读ADC,它还能在Flash、SRAM、SPI、USART、定时器、I2C 等功能之间相互传递数据,如图5 所示。STM32F103 的DMA 有7 个通道,可以设置7 组数据传递任务。DMA 大大提高了内核的工作效率,真的是很重要的功能。
图4 DMA工作原理举例
图5 DMA可在多个功能之间相互传递数据
【I/O端口】
终于讲到了I/O 端口,学习单片机最先接触的往往就是I/O 端口,它是内部功能当中最重要的一块。因为I/O 端口也可以代替除ADC 之外所有的逻辑电平的通信接口,包括我们后面要讲的I2C、USART、SPI、CAN 等。早年的单片机没有那么多通信接口,也都是靠I/O 端口来模拟的,由此可见I/O 端口的全能。I/O 端口最原本的功能就是电平的输入(IN)和输出(O
UT),所以才用I 和O 两个首字母作为它的名字。在写法上,正确的是I/O,但也有省去斜线直接写成IO 的,在STM32 单片机上也被写成GPIO,都是可以的。
STM32F103 最多有80 个I/O 端口,这些端口每16 个被分成一组,一共有5 组。组的名字分别是PA、PB、PC、PD 和PE,每组中16 个端口的名字可以是PA0 到PA15,其他组也一样。但由于封装引脚数量不同,端口的数量也不同。STM32F103C8T6 这款单片机的48 个引脚当中有37 个可作I/O 端口,其接口定义如图6 所示。其中PA 和PB 的16 个端口都引出了,PC组只引出3个,PD组只引出2个。
每一个I/O 端口都有8 种工作模式,也就是I/O 端口的状态是输出还是输入?是输入的话,是模拟量输入还是逻辑电平输入?我们需要在启动I/O 端口之前先把它设置成正确的状态。图7 所示是GPIO的8 个工作模式,模拟输入是在作ADC 输入接口时使用的,浮空输入是内部不接电阻,下拉和上拉输入是在I/O 内部接一个约10kΩ 的下拉或上拉电阻,根据外部连接的电路可以设置它们。输出的模式有推挽输出、开漏输出,还有复用推挽和复用开漏。推挽是指I/O 端口有很强的电流推动能力,可以输出一定量的电流,用于推动一些元器件(如LED)工作。开漏则是弱电流的输出,用于逻辑电平的数据信号通信。复用的推挽和开漏是用在复用状态下的,这在后面讲到复用功能时再说吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论