14.4 TIM1应用实例

定时器TIM1在STM32F072VBT6微控制器所配备的定时器中功能是最强大的,具有很强的代表性,以下以TIM1为例,实际体会一下定时器的计时、捕捉和PWM功能。

14.4.1 测量信号周期

TIM1在捕捉模式下,可以检测4个输入通道的信号,并将每一个通道产生有效边沿时计数器的计数值复制至CCRx寄存器中,读取该寄存器的值并与上一次该寄存器的值相减即可计算出两次捕捉的时间间隔。为了提高捕捉的精确性,启用了输入捕捉中断来提高响应速度。

本例中使用PF10引脚产生PWM信号,并将该信号连接至TIM1_CH1(PA8)输入通道,使用数码管显示捕捉信号的周期长度。在外设配置上,将TIM1时钟源设置为内部时钟,并将通道1设置为输入捕捉直接模式。在“Pinout”和“Clock Configuration”视图中,引脚、外设及时钟配置如图14-32和图14-33所示。

在“Configuration”视图下,将TIM1的预分频器设置为“479”,即将分频比设置为“480”,即定时器的计数周期为10μs。自动重载计数器的值设置为“65535”,输入捕捉通道1有效边沿设置为上升沿。具体参数配置如图14-34所示。

同样在“Configuration”视图下,将NVIC配置为使能比较捕捉中断,具体参数如图14-35所示。

使用输入捕捉方式测量PWM周期的代码详见代码清单14-1和代码清单14-2。程序运行后,四位数码管显示的是PWM信号的周期值(以10μs为单位)。

代码清单14-1 输入捕捉测量信号周期值(main.c)(在附录J中指定的网站链接下载源代码)

代码清单14-2 输入捕捉测量信号周期值(stm32f0xx_it.c)(在附录J中指定的网站链接下载源代码)

14.4.2 生成PWM信号

TIM1在PWM模式下,可以输出4路占空比可调的PWM信号,其中3个通道具有互补输出功能。本例中将通过TIM1_CH1(PA8)输出占空比从0~100%连续变化的PWM信号,并将此信号驱动一个LED,以显示占空比的变化,具体驱动电路如图14-36所示。在“Pinout”和“Clock Configuration”视图中,对引脚、外设及时钟配置如图14-37和图14-38所示。

在“Configuration”视图下,将TIM1的预分频器设置为“47”,自动重载计数器的值设置为“500”,由此将产生分辨率设为1μs、周期为500μs(2kHz)的PWM信号。PWM通道1输出极性为低电平。具体参数配置如图14-39所示。

PWM输出的代码详见代码清单14-3。程序运行后,四位数码管显示的是PWM信号的高电平持续时间(以1μs为单位)。

代码清单14-3 PWM输出(main.c)(在附录J中指定的网站链接下载源代码)

14.4.3 体验PWM输入模式

本章另一个实践内容是要体验一下PWM输入模式,用它来测量PWM信号的周期和占空比。PWM输入模式巧妙地利用了TI1输入信号,将TI1FP1信号既用于定时器从模式的复位功能,又同时将该信号用于两个通道TI1和TI2的输入捕捉,所不同的是TI1通道捕捉上升沿,TI2通道捕捉下降沿。

在PWM输入模式下,使用数码管显示捕捉信号的周期长度或高电平长度,使用PF10引脚产生PWM信号,并将该信号连接至TIM1_CH1(PA8)输入通道。在外设配置上,将TIM1的从模式设置为复位模式,触发源设置为“TI1FP1”,时钟源为内部时钟,并将通道1设置为直接模式,将通道2设置为间接模式(通过TI1)。在“Pinout”和“Clock Configuration”视图中,对外设、引脚和时钟的配置如图14-40和图14-41所示。

在“Configuration”视图下,将TIM1的预分频器设置为“479”,自动重载计数器的值设置为“65535”,输入捕捉通道1设置为上升沿同,通道2设置为下降沿。“Configuration”视图下的参数配置如图14-42所示。

使用PWM输入模式测量PWM周期和占空比的代码详见代码清单14-4。程序运行后,四位数码管显示的是PWM信号的周期值(以10μs为单位),通过简单修改程序,也可以让数码管显示占空比或高电平时间值。

代码清单14-4 PWM输入模式测量信号周期值(main.c)(在附录J中指定的网站链接下载源代码)

第15章 看门狗

STM32F0系列微控制器片内集成了两种类型的看门狗,分别称为独立看门狗和窗口看门狗,用于监控程序的运行。本章主要介绍这两种看门狗的功能和使用方法。

15.1 独立看门狗

看门狗实际上是一个具有特殊功能的定时器,它会在程序运行时计数,并在溢出时复位微控制器,通过及时进行软件干预,可以确保不会产生复位动作。一旦程序运行出现问题,导致软件干预不能执行,微控制器会复位并重新开始执行程序。独立看门狗由它自己专有的低速时钟来驱动,其电路独立于微控制器的其他部分,用于消除因处理器硬件或软件故障所发生的程序运行错误。

15.1.1 IWDG的功能

独立看门狗(IWDG)是一个自由运行的向下计数器,当它的定时计数值达到预设的门限时,就会触发一个系统复位请求。IWDG作为微控制器内嵌的一个外设,由独立的低速RC振荡器(LSI RC,40kHz)驱动,因此就算是主时钟失效了,它仍然能保持运行状态。使用独立时钟的另外一个优点就是IWDG在Standby或Stop状态下仍可操作。

IWDG具有自己专用的三位可编程预分频器,可以对输入时钟进行4~256分频,可以提供较为灵活的时间参数配置。IWDG非常适合那些需要独立于主程序之外运行,又对时钟精确度要求不高的应用场合。其内部结构如图15-1所示。

当向IWDG的关键字寄存器写入启动指令0x0000CCCC时,看门狗计数器开始由复位值0xFFF向下计数,当计数值达到0x000时由独立看门狗发出复位信号。任何时候将重加载指令0x0000AAAA写到IWDG_KR寄存器中,都会使IWDG_RLR寄存器中的值被重加载到看门狗计数器中,从而阻止即将发生的复位动作。编程IWDG_RLR寄存器可以设定看门狗计数器向下计数的开始值,因此定时的长度也是由这个值和预分频器的设置值共同决定的。

IWDG也能够工作在窗口模式下,只要在窗口寄存器IWDG_WINR中设置适当的值即可。IWDG_WINR寄存器的默认值是0xFFF,如果没有改写它,那么窗口模式默认是关闭的。窗口寄存器的值一旦改变,立即会引起看门狗计数器的一次重加载动作,将其置为IWDG_RLR寄存器中所设置的值,会在一定程度上延缓当前到下次复位所需的时间周期。独立看门狗的窗口模式原理如图15-2所示。

在窗口模式下,计数器从IWDG_RLR寄存器定义的最大值开始向下计数,当计数值位于IWDG_WINR寄存器的值和0之间时,向IWDG_KR寄存器写入0x0000AAAA指令不会引发复位,相反,如果向下递减计数器的值位于重加载窗口区域之外时,使用重加载指令则会导致复位。

默认条件下,对IWDG_PR、IWDG_RLR和IWDG_WINR的写访问操作都是受保护的。想要改变这一点,必须先向IWDG_KR寄存器写入0x00005555解锁指令。如果写入其他值,将会使写保护重新生效。

编程向导 配置IWDG工作在窗口模式

1)向IWDG_KR寄存器写入0x0000CCCC指令,使能IWDG。

2)向IWDG_KR寄存器写入0x00005555指令,打开寄存器访问许可。

3)向IWDG_PR寄存器写入0~7的值,配置IWDG预分频器。

4)配置重加载寄存器IWDG_RLR。

5)等待状态寄存器IWDG_SR的值更新为0x00000000。

6)配置窗口寄存器IWDG_WINR,这将会引发IWDG_RLR的值更新至看门狗计数器。

编程向导 配置IWDG工作在非窗口模式

1)向IWDG_KR寄存器写入0x00005555指令,打开寄存器访问许可。

2)向IWDG_PR寄存器写入0~7的值,配置IWDG预分频器。

3)配置重加载寄存器IWDG_RLR。

4)等待状态寄存器IWDG_SR的值更新为0x00000000。

5)向IWDG_KR寄存器写入0x0000 AAAA指令,将IWDG_RLR的值刷新到看门狗定时器中。

6)向IWDG_KR寄存器写入0x0000CCCC指令,使能IWDG。

15.1.2 特殊状态下的IWDG

1.硬件看门狗

如果在选项字节中打开了“硬件看门狗”功能,那么在系统上电时,IWDG会被自动打开。如果没有在看门狗计数器计数结束或者在非重加载窗口时间向关键字寄存器写入正确的值,那么将会产生硬件复位请求。

2.调试模式

当微控制器进入调试模式时(内核被暂停),看门狗计数器可以继续运行,也可以被停止。这取决于DBG模块中的DBG_IWDG_STOP选项的配置。

15.2 窗口看门狗

窗口看门狗(WWDG)使用系统时钟支持运行,在一个程序设定的时间窗口之内,必须由软件进行干预,否则将会产生复位操作,因而称其为窗口看门狗。

15.2.1 WWDG的内部结构和时间窗口

WWDG通常用于监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。WWDG的计数时钟由APB1时钟经预分频后得到,通过建立一个精确的可编程时间窗口来检测异常发生是否推迟或提前。窗口看门狗的内部结构如图15-3所示。

WWDG是一个可编程的自由运行递减计数器,来自APB1时钟预分频器的PCLK1时钟,经WDC预分频器分频(4096×2WDGTB)后,得到窗口看门狗的计数时钟。

在系统复位后,窗口看门狗总是处于关闭状态,将WWDG_CR寄存器的WDGA位置1能够开启看门狗,随后它不能再被关闭,直至复位发生。窗口看门狗启动后,7位的递减计数器(T[6:0])开始降序计数,当计数值从0x40变为0x3F(T6变为0)时,看门狗将产生一个复位信号。

应用程序在正常运行过程中,必须定期地写入WWDG_CR寄存器的T[6:0]位,以保证WWDG_CR寄存器的值始终在0xFF和0xC0之间,以防止微控制器发生复位。但写入WWDG_CR寄存器是有条件的,必须当计数器的值小于窗口配置寄存器WWDG_CFR的值时,才能进行写操作,否则同样会产生复位。这样,在计数器的最小值与WWDG_CFR寄存器的值之间会存在一个时间窗口,具体如图15-4所示。

15.2.2 WWDG的高级功能

1.软件复位

递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6位必须被设置,以防止立即产生一个复位。当然,也可以使用T6位来产生一个软件复位,即在设置WDGA位为1时将T6位清0。

2.提前唤醒中断

如果在复位产生之前需要进行特定的安全操作或数据记录,可以启用提前唤醒中断。设置WWDG_CFR寄存器的WEI位可以开启此中断。在复位之前,当递减计数器的值为0x40时,则产生提前唤醒中断。在提前唤醒中断服务程序中,可以触发特定的行为,例如启动通信或数据记录等。

在有些应用中,使用窗口看门狗监控程序的最终目的并不是复位,而仅仅是降低故障带来的损失,使故障弱化。这时可以使用提前唤醒中断,并在中断服务程序中重加载WWDG计数器,以避免WWDG复位,然后触发必要的处理动作。使用提前唤醒中断要考虑到如果系统锁定在更高优先级的任务上,将使提前唤醒中断不能及时执行,并最终导致WWDG复位。

3.调试模式下的WWDG

当微控制器进入调试模式时(Cortex-M0内核停止),根据调试模块中DBG_WWDG_STOP配置位的状态,WWDG的计数器可以继续正常工作或停止。

15.3 看门狗函数

15.3.1 看门狗类型定义

输出类型15-1:IWDG HAL状态结构定义

15.3 看门狗函数

15.3.1 看门狗类型定义

15.3.2 看门狗常量定义
15.3.3 看门狗函数定义

15.4 IWDG应用实例

独立看门狗使用与微控制器内核不同的时钟源,在电路上也与微控制器的其他部分隔离,这相当于在微控制器外部链接一个外置看门狗,它不仅可以解决软件的运行故障,也可以处理因时钟失效等硬件问题引发的故障。以下我们将配置独立看门狗来监控微控制器的运行,在使用STM32CubeMX软件生成开发项目时,在“Pinout”视图中,对引脚、外设的配置如图15-5所示。

在“Clock Configuration”视图中,对时钟的配置如图15-6所示。

在“Configuration”视图下,将IWDG的预分频系数设置为4,重装值设为4000。具体参数配置如图15-7所示。

使用独立看门狗监控微控制器运行的程序详见代码清单15-1。

代码清单15-1 独立看门狗监控微控制器(main.c)(在附录J中指定的网站链接下载源代码)

第16章 I2C总线接口

I2C总线由Philips公司开发,主要用于连接微控制器及其外围设备,因此也称其为芯片间总线。STM32F0系列微控制器片内集成的I2C模块可以与外围器件进行芯片间的串行数据通信,本章重点讲述

I2C模块的内部结构和功能。

16.1 I2C模块概述

STM32F072VBT6微控制器的I2C模块支持主机和从机模式,并且支持多主机功能。模块可以控制I2C总线上特定的时序、协议、仲裁和定时等功能,并且与系统管理总线SMBus兼容。

16.1.1 I2C模块的功能

STM32F072VBT6微控制器片内集成有2个I2C模块,其中I2C1模块支持标准、快速和超快速模式,具体功能配置详见表16-1。在标准通信模式下,速率为100kbit/s,在快速和超快速通信模式下,速率可达400kbit/s和1Mbit/s。当模块启用了SM总线功能时,附加的ALERT(SMBA)引脚将被使能。当I2C模块配置成从机模式时,模块本身具有2个可编程的7位地址或者1个可编程的10位地址。

注:“√”已配备,“×”未配备。

I2C1模块的内部结构如图16-1a所示。I2C1模块的时钟不是来自于PCLK时钟,而是由HSI或SYSCLK直接驱动,I/O端口支持增强的20mA电流输出能力,以适应超快速模式的需要。I2C2与I2C1的功能大体相同,但I2C2不支持SM总线,也不能将微控制器从停止模式唤醒,其工作时钟来自于PCLK。I2C2模块的内部结构如图16-1b所示。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐