STM32F103硬件系统与KEIL MDK工程 第06章 定时器.pptx
第六章
定时器
目录系统节拍定时器看门狗定时器实时时钟通用定时器本章小结
本章将介绍STM32F103RCT6片内定时器的结构和用法,按照从简单到复杂的顺序依次介绍系统节拍定时器、看门狗定时器、实时时钟和通用定时器,其中,系统节拍定时器是Cortex-M3内核的定时器组件,主要用于为嵌入式实时操作系统提供时钟节拍(一般取为100Hz)。STM32F103RCT6具有8个定时器,其中定时器1和定时器8为高级定时器、定时器2~5为通用定时器、定时器6和定时器7称为基本定时器,本章将主要介绍通用定时器,且以定时器2为例。1
6.1系统节拍定时器2
3系统节拍定时器SysTick属于Cortex-M3内核的组件,是一个24位的减计数器,常用于产生100Hz的定时中断(即系统节拍定时器异常),用作嵌入式实时操作系统μC/OS-II等的时钟节拍,系统节拍定时器的结构如下图所示。系统节拍定时器工作原理
4了解STCTRL、STRELOAD、STCURR和STCALIB这4个寄存器的内容,即可掌握系统节拍定时器的工作原理。这4个寄存器的内容如下表所示。系统节拍定时器工作原理
5根据上述对系统节拍定时器的分析,可知设计一个定时频率为100Hz(即定时周期为10ms)的系统时钟节拍定时器,可采用以下语句;(1)配置STCTRL为(1uL1)|(1uL2),即关闭系统节拍定时器并开放系统节拍定时器中断,同时设置系统时钟为系统节拍定时器时钟源。此时对于STM32F103RCT6微控制器使用内部8MHz时钟源而言,系统时钟为64MHz,芯片手册上明确说明:将系统时钟经AHB预分频器后的32MHz信号的8分频值用作系统节拍定时器的输入时钟信号(见图2-3),但实际测试发现,系统节拍定时器的输入时钟信号仍然是32MHz,即没有所谓的8分频器。(2)向STCURR寄存器写入任意值,例如写入0,清除STCURR的值,同时清除STCTRL的COUNTFLAG标志;(3)向STRELOAD寄存器写入320000-1,即十六进制数0x4E1FF。(4)配置STCTRL的第0位为1(其余位保持不变),启动系统节拍定时器。系统节拍定时器工作原理
6系统节拍定时器相关的寄存器定义在CMSIS库头文件core_cm3.h中,如下面的程序段所示。系统节拍定时器工作原理
7在CMSIS库头文件core_cm3.h中还定义了一个初始化系统节拍定时器的函数,如下面的程序段所示。系统节拍定时器工作原理
8系统节拍定时器异常一般用作嵌入式实时操作系统的时钟节拍,也可以用作普通的定时中断处理。这里使用系统节拍定时器实现LED1灯D9的闪烁功能,其寄存器类型的工程实现步骤如下:(1)在工程PRJ05的基础上,新建工程“PRJ07”,保存在目录“D:\STM32F103RCT6PRJ\PRJ07”下,此时的工程PRJ07与工程PRJ05完全相同。(2)新建文件systick.c和systick.h,这两个文件保存在目录“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,其代码分别如下面的程序段所示。系统节拍定时器实例
9系统节拍定时器实例
10系统节拍定时器实例
11系统节拍定时器实例
12将systick.c文件添加到工程管理器的BSP分组下,建设好的工程PRJ07如下图所示。系统节拍定时器实例
13由图可知,在工程PRJ07中,主函数main主要完成了系统的外设初始化工作,同时,工程PRJ07保留了工程PRJ05中的全部功能,并添加了系统节拍定时器功能。由于配置了系统节拍定时器的工作频率为100Hz,所以,定时异常每触发100次相当于延时准确的1秒。通过添加静态计数变量,使得系统节拍定时器异常服务函数实现了每隔1秒使LED灯D9状态切换一次的功能。系统节拍定时器实例
14系统节拍定时器的库函数类型工程的建设过程为:在工程PRJ06的基础上,新建工程PRJ08,保存在保存在目录“D:\STM32F103RCT6PRJ\PRJ08”下,此时的工程PRJ08与工程PRJ06完全相同,需要做的修改为:(1)修改文件main.c、includes.h和bsp.c;(2)新建文件systick.c和systick.h,如程序段6-3和程序段6-4所示,保存在目录“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,并将文件systick.c添加到工程管理器的BSP分组下。系统节拍定时器实例
6.2看门狗定时器15
16STM32F103RCT6微控制中有两个看门狗,即独立看门狗和窗口看门狗。本书仅介绍复杂一些的窗口看门狗。看门狗定时器工作原理
17在本小节中,拟把看门狗定时器WWDG用作普通的定时器,实现每隔约1秒LED灯D10闪烁的功能。在工程07的基础上