文章目录
前言
使用STM32CubeIDE实现基本定时器实验。
硬件:STM32F103C8T6最小系统板 + 自制扩展板
软件:STM32CubeIDE
一、实验目的
使用基本定时器的更新中断,LED1用于指示定时器发生更新事件的频率,每500ms状态翻转。
二、学习内容
- 学习基本定时器的使用
- 学习如何确定计数器的工作频率
三、实践操作
定时器概述
软件定时原理
使用纯软件( CPU死等 )的方式实现定时( 延时 )功能,具有延时不精准、CPU死等的缺点
WWDG( Windows Watchdog ),窗口看门狗。
定时器定时原理
使用精准的时钟源,通过硬件的方式,实现定时功能,核心就是计数器。
STM32定时器分类
- 专用定时器:独立看门狗(IWDG)、窗口看门狗(WWDG)、定时时钟(RTC)、低功耗定时器;
- 内核定时器:SysTick定时器(滴答定时器)
- 常规定时器:基本定时器、通用定时器、高级定时器
基本定时器:没有输入输出通道,常用作时基,即定时功能
通用定时器:具有多路独立通道,可用于输入捕获/输出比较,也可用作时基
高级定时器:除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能( 可用于电机控制、数字电源设计等 )
基本定时器
基本定时器简介
STM32F1中,基本定时器为TIM6和TIM7( STM32F103C8T6没有 );
主要特征:
- 16位递增计数器( 计数值:0~65535 );
- 16位预分频器( 分频系数:1~65536 );
- 可用于触发DAC;
- 在更新事件(计数器溢出)时,会产生中断/DMA请求。
只能递增
基本定时器框图
可以看出,基本定时器的时钟来源为内部时钟( CK_INT ),溢出条件为CNT == ARR(影子)
,只有递增计数模式。
其中影子寄存器才是真正起作用的寄存器,但不能直接访问。
计数模式与溢出条件
计数器模式 | 溢出条件 |
---|---|
递增计数模式(向上) | CNT == ARR |
递减计数模式(向下) | CNT == 0 |
中心对齐模式 | CNT == ARR - 1,CNT == 1 |
定时器溢出时间计算
其中:
Tout 为定时器溢出时间
Ft 为定时器的时钟源频率( 未分频 )
ARR 为自动重装载寄存器的值
PSC 为预分频寄存器的值
可以这样来看这个公式:
这个是计数频率;
这个是计一个数的时间,频率的倒数;
这个是要计这么多数;
因此可以理解为一个数的时间 × 个数 = 总时间
。
3.硬件介绍
硬件:STM32F103C8T6最小系统板 + 自制扩展板
实物图如下图所示:
LED1 -> PB3
4.软件介绍
首先新建工程并进行初始化配置
在此不进行赘述,详细步骤可移步至之前文章。
与之前文章不同的是,根据预设条件:溢出时间(Tout)为500ms,定时器的时钟源频率(Ft)为72MHz,因此可设定(PSC+1)= 7200,(ARR+1)= 2500,从而实现溢出时间(Tout)为500ms。
配置TIM4(没有基本定时器,用通用定时器实现),如下图所示:
其中 auto-reload precload 为自动重装载的预装载:
- auto-reload precload = Disable:自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期;
- auto-reload precload = Enable:自动重装载寄存器写入新值后,计数器完成当前旧的计数后,再开始新的计数周期。
由于是定时器溢出之后是产生中断,因此需要使能定时器中断:
接下来进行基本定时器实验的代码编程
主要是对定时器中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
进行定义:
/* 定时器中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* TIM4发生中断 */
if(htim->Instance == TIM4) //判断是否是TIM4发生中断
{
LED1_TOGGLE();
}
}
可放在main.c中,也可以放在tim.c中。
其次,要在int main()
中,使能更新中断并启动定时器,否则定时器都不工作:
HAL_TIM_Base_Start_IT(&htim4); //使能更新中断并启动定时器
代码很简单,旨在了解定时器的定时功能。
实验现象:LED1每500ms翻转一次状态,也可以通过示波器看到IO的波形变化。
可以看出,IO电平变化间隔为500ms。
总结
本篇介绍了如何实现一个基本定时器实验,分别从硬件方面与软件方面阐述,在硬件方面主要介绍了硬件组成,在软件方面主要介绍了通过定时器中断,实现让LED1每500ms翻转一次状态!
这是定时器的最基本的功能,时基功能!