定时器是 MCU 内部最基础的外设,也是必备模块,其应用极为频率最高。本文将针对 LPC82x 系列为例,一起来学习定时器的概念和应用。那么对于 LPC82x 系列的定时器,总共分了 5 种类型:状态可配置定时器 SCT,看门狗 WWDT,唤醒定时器 WKT,多速率定时器 MRT,系统时钟 SysTick。针对这 5 种不同类型的定时器,它们的时钟源是不一样,且应用方向也不一样。
一、看门狗 WWDT
首先我们先来看看,看门狗的作用是什么呢?我们可以这么来看,假如 MCU 进入错误的状态时,在可编程时间内将其复位或者中断,看门狗定时器使能时,如果程序在规定时间内未能够重新载入看门狗,即“喂狗”,则会生成看门狗复位,进行强制复位。WWDT 的时钟源是看门狗振荡器,时钟精度为 ±40%,主要应用于系统保护复位和低功耗模式唤醒。
1. WWDT 特性
首先,我们来看一下 WWDT 有哪些特性:
A. 当计数器达到可编程的超时值将产生内部复位信号; B. 可设置喂狗的窗口时间,使得喂狗时间限定在可编程的最小和最大值之间,否则产生看门狗复位; C. 超时复位前有警告中断,用户可配置看门狗外设警告中断使能; D. 看门狗为 24 位向下计数器,看门狗时钟输入后为固定的四分频器,则可设置的超时时间范围(4*Twdclk*256 –4*Twdclk*224),Twdclk 可通过看门狗振荡器控制寄存器设置; E. 看门狗启动后,只有硬件复位或者看门狗复位才能禁止使能; F. 看门狗定时器可以配置运行在 Deep-sleep 和 Power-down 模式下,不能用于 Deep power-down 模式;
2. WWDT 时钟和供电设置
WWDT 有自己独特的时钟和供电设置,但针对不同的应用,需要进行不一样的设置,如下是针对不同应用的设置: A. 看门狗模块内部有两个时钟域,分别为看门狗外设时钟和看门狗振荡器时钟。 B. 外设时钟源于芯片系统时钟,用于访问外设寄存器。 C. 振荡器时钟是独立的振荡器时钟,用于驱动看门狗计数器。 D. 初始化看门狗外设时,首先要设置好看门狗外设时钟和振荡器供电。
2.1 时钟设置
使能看门狗外设时钟,以访问 WWDT 寄存器
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WWDT);
设置看门狗振荡器时钟,该时钟用于驱动看门狗计数器
Chip_Clock_SetWDTOSC(WDTLFO_OSC_0_60, 64);
2.2 供电设置
设置电源配置寄存器 PDRUNCFG,使能对看门狗振荡器的供电
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_WDTOSC_PD);
3. WWDT 内部框图
以下框图显示了看门狗的内部运行原理和机制:
4. WWDT 低功耗模式应用
A. 看门狗可作为芯片低功耗模式下的唤醒源; B. 看门狗计数值达到警告中断寄存器设定值时,将产生看门狗外设中断,看门狗外设中断默认使能; C. 看门狗警告中断寄存器有 10 位有效值,可设的最大值为 1023,所以从警告中断到看门狗复位操作的最长可设时间为 1023 个看门狗计数值,再根据固定的四分频器则时间为 4096 个看门狗时钟;
5. WWDT 低功耗模式应用唤醒设置
我们在使用 WWDT 时,有如下 4 个注意事项需要记住: A. 看门狗模式寄存器 MOD 中的看门狗使能位 WDEN、复位使能位 WDRESET、保护位 WDPROTECT 和锁定位 LOCK,这些位使能后软件将无法清零,直到芯片复位; B. 保护模式下,计数器常数寄存器只能在计数值低于警告中断寄存器和窗口寄存器值时更改,否则将产生看门狗复位; C. 喂狗操作将加载 TC 寄存器的值到看门狗计数器; D. 喂狗时需要固定的喂狗序列,即顺序写 0xAA 和 0x55 到看门狗 Feed 寄存器,如果在写入 0xAA 和 0x55 之间有其他看门狗寄存器操作,且看门狗处于使能状态,将立即产生看门狗复位;
二、自唤醒定时器 WKT
1. WKT 特性
A. 32 位向下计数器,写入计数值自动开始计数; B. 计数超时后产生中断或者唤醒芯片; C. WKT 模块处于独立的常开供电区域; D. 三种时钟源可选:IRC,内部低功耗振荡器或者外部时钟(通过 WKTCLKIN 引脚接入); E. 内部低功耗振荡器模式和外部时钟模式可用于任意低功耗模式下唤醒,包括 Deep power-down 模式;
2. WKT 时钟配置内部时钟框图
WKT 内部有两个时钟域,分别是:
A. 内部寄存器接口时钟;
B. 32 位计数器时钟;
3. WKT 时钟配置
WKT 寄存器接口时钟使能
??Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WKT);
4. WKT 计数器时钟配置
如下是三种输入时钟源比较:
5. WKT 计数器时钟源设置
设置 WKT 控制寄存器 CTRL 来选择时钟源;
??Chip_WKT_SetClockSource(LPC_WKT, WKT_CLKSRC_10KHZ);
5.1 使能 IRC 时钟
设置电源控制寄存器 PDRUNCFG,使能对 IRC 的电源;
??Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_IRCOUT_PD);??Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_IRC_PD);
5.2 使能内部低功耗振荡器时钟
A. 设置 Deep power down 控制寄存器 DPDCTRL,使能低功耗振荡器;
??Chip_PMU_SetPowerDownControl(LPC_PMU, PMU_DPDCTRL_LPOSCEN);
B. 如果 WKT 不作为 Deep power down 模式下的唤醒源,应该禁能 LPOSCDPDEN,以节省能耗;
??Chip_PMU_ClearPowerDownControl(LPC_PMU,PMU_DPDCTRL_LPOSCDPDEN);
5.3 使能外部时钟输入
设置 Deep power down 控制寄存器 DPDCTRL,使能外部时钟输入
??Chip_PMU_SetPowerDownControl(LPC_PMU, (1 << 5));
6. WKT 低功耗模式唤醒配置事项
A. 使能 WKT 外设时钟,设置 WKT 控制寄存器选择低功耗振荡器时钟或者外部时钟;
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WKT);Chip_WKT_SetClockSource(LPC_WKT, WKT_CLKSRC_10KHZ);
B. 设置 Deep power down 控制寄存器,使能低功耗时钟或者外部时钟;
Chip_PMU_SetPowerDownControl(LPC_PMU, PMU_DPDCTRL_LPOSCEN);
C. 设置使能中断和唤醒;
NVIC_EnableIRQ(WKT_IRQn);Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_WKTINT);
D. 根据选择时钟频率和唤醒时间,加载 WKT 计数器寄存器,启动计数;
Chip_WKT_LoadCount(LPC_WKT, count);
三、多速率定时器 MRT
1. MRT特性
A. 31 位中断定时器; B. 4 个独立通道的向下计数器,计数值独立设置; C. 3 种可配置工作模式:重复中断触发、单次总线停止、单次中断触发;
2. MRT 时钟设置
MRT 外设时钟驱动 MRT 定时器,外设时钟即为系统时钟,通过设置系统时钟控制寄存器使能 MRT 外设时钟;
??Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_MRT);
3. MRT 工作模式
MRT 模块共有四个独立的 MRT 定时器,分别有独立的寄存器列表,可设置工作在不同的模式;
MRT 共有三中工作模式可设置 A. 重复中断触发模式 B. 单次中断触发模式 C. 单次总线停止模式
设置 MRT 控制寄存器 CTRL[0:3] 选择工作模式
??Chip_MRT_SetMode(LPC_MRT_CH0, MRT_MODE_REPEAT);
3.1 MRT 重复中断触发模式
A. 定时间隔寄存器 INTVAL[0:30] 的设定值 IVALUE 非 0 时,计数器开始向下计数,计数到 0 时触发中断,间隔寄存器 IVALUE-1 值重新自动加载到计数器,重新开始计数; B. 若 LOAD 标志位为 0 则计数器完成计数间隔后才加载新的 IVALUE 值,反之则立刻加载新 IVALUE 的值; C. 可在 LOAD=1 时写 0 到 IVALUE 停止计数器;
3.2 MRT 单次中断触发模式
A. 计数器处于非空闲转态且 IVALUE 非 0 时,计数器开始向下计数,计数到 0 时产生中断,并停止计数器,计时器将进入空闲状态; B. 计数器处于空闲状态时,写非0值到时间隔寄存器 IVALUE,将立即启动计数,从 IVALUE-1 值开始向下计数; C. LOAD 位的作用同重复中断触发模式;
3.3 MRT 单次总线暂停模式
A. 计数器处于空闲状态时,写非 0 值到时间隔寄存器 IVALUE,将立即启动计数,从 IVALUE-1 值开始向下计数; B. 计数器启动后,将暂停总线及所有 CPU 活动,计数器向下计数到 0,计数间隔到时后,并不产生中断,而是恢复总线活动,计数器也将停止,处于空闲状态; C. 总线停止模式可以用于暂停程序执行,实现设定的延时。相较于软件循环或者定时器查询实现的延时,可以节省 CPU 运行的功耗; D. 该模式只适用于较短的程序延时,微秒级或者 10 到 50 个时钟周期,较长时间的延时应该选用单次中断触发模式,因为在单次总线停止模式下,所有总线活动被暂停,任何中断服务程序都无法执行; E. 实际的总线停止时间为 IVALUE+3 个系统时钟周期;
四、SYSTICK 定时器
1. SysTick 特性
A. 24 位向下计数器; B. 可配置选用系统时钟或者 1/2 系统时钟驱动; C. 集成于 Cortex 内核中,方便软件移植,主要用于实时操作系统或者系统管理软件,作为系统时基时钟;
2. SysTick 内部框图
A. SysTick 控制和状态寄存器(SYST_CSR)设置时钟源为系统时钟或者系统时钟二分频; B. 计数器向下计数为 0 时,自动加载重载寄存器(SYST_RVR)值,并置位 SYST_CSR 的 COUNTFLAG 位,如果中断使能位 TICKINT 有效的话,产生 SysTick 中断;
3. SysTick 时钟设置
设置 SysTick 控制和状态寄存器 SYST_CSR,选择时钟源;
4. SysTick 使用设置
注:重载寄存器的设定值应为需求中断间隔值(Tick)-1
— End —
往期推荐
精华丨 如果你还不知道单片机的时钟怎么使用,一定要看看这 5 点!
教程丨 《说好不哭》,当我错过 SCT 真的哭了
种草丨 原来“明星产品”是这样称霸市场的 – LPC82X 特色功能开关矩阵