stm32 的定时器功能非常强大,包括基本定时器,通用定时器以及高级定时
器。 本章介绍定时器的基本应用,通过定时器中断控制 LED 闪烁,间隔 1s.
这一章我们在前一章 GPIO 的工程修改。复制 GPIO 的工程,修改文件夹名。
点 XXX.ioc 击打开 STM32cubeMX 的工程文件重新配置。开启定时器 TIM3,选择
内部时钟。
定时器就相当于单片机的闹钟,下面我们以基本定时器为例简单介绍一下定时器。
从上图我们可以看到,基本定时器主要由下面三个寄存器组成。
计数器寄存器 (TIMx_CNT)
预分频器寄存器 (TIMx_PSC)
自动重载寄存器 (TIMx_ARR)
计数器寄存器 (TIMx_CNT)存储的是当前的计数值。预分频器 (TIMx_PSC)为多少
个 SK_PSC 脉冲计数一次,如图 145 预分频器的值为 1(预分频寄存器默认为 0,
为不分频),则为两个脉冲计数一次。即为二分频。如果要 10000 分频,则预分
频器的值为 1000-1。
自动重装寄存器 (TIMx_ARR)存储的是计数器的溢出值,例如图 147 中计数器递
增计数到 36 计数器溢出,触发一次事件。而实际上为 37 个脉冲触发一次溢出事
件(从 0 开始计数)。
要确定定时的时间我们必须先确定 CK_PSC 的频率,TIM3 配置中选择内部时钟
作为时钟源,查看数据手册可以知道 TIM3 是挂接到 APB1 时钟线上。
这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M。
定时器计算公式:Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk: TIM3 的输入时钟频率(单位为 Mhz)。
Tout: TIM3 溢出时间(单位为 us)。
若要定时时间为 1s,则即可设置 7200 分频(预分频器寄存器 (TIMx_PSC)的值为
7200-1 ), 定 时 器 的 时 钟 CK_CNT 的 频 率 为 10000Hz. 则 自 动 重 载 寄 存 器
(TIMx_ARR)设置为 10000-1 即定时为 1s.TRGO 为触发输出,可以触发内部
ADC/DAC,这里我们没有用到这个功能,参数为默认设置。
定时器有如下三种计数模式
递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成
计数器上溢事件。
递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始
计数并生成计数器下溢事件。
中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;
然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重
新计数。
在 NVIC Settings 框勾选开启定时器中断。优先级为默认。或者在 NVIC 配置中使
能 TIM3 中断。
生成报告,以及生成代码,编译程序。
打开 main.c 文件。把 main()函数里 while 循环上一章的代码删掉,while 循环里
面为空。在 main.c 文件后面 USER CODE BEGIN 4 和 USER CODE END 4 中间添
加中断回调函数。定时器中断处理函数中翻转一次 LED2 的电平。
在 main.c 文件中 while(1)循环前面添加代码启动基本定时器中断模式计数
在 main()函数中调用 HAL_TIM_Base_Start_IT(&htim3)开启定时器,定时器从 0 开
始计数,当计数到 10000-1,即 9999 时,产出上溢出事件,计数器又从 0 开始
继续计数。由于我们开启了定时器中断,所以发生上溢出事件时会触发定时器中
断。程序会转跳到中断服务函数中运行。我们在中断服务函数中翻转 LED 的电
平。下次定时器再次溢出触发中断继续翻转 LED 的电平。所以我们会看到 LED
不断闪烁。
关 于 HAL 库 API 的 使 用 方 法 可 以 到 ST 官 网 下 载 :
https://www.stmcu.com.cn/Index/search?search_keywords=UM1725