赞
踩
使用STM32CubeIDE实现基本定时器实验。
硬件:STM32F103C8T6最小系统板 + 自制扩展板
软件:STM32CubeIDE
使用基本定时器的更新中断,LED1用于指示定时器发生更新事件的频率,每500ms状态翻转。
使用纯软件( CPU死等 )的方式实现定时( 延时 )功能,具有延时不精准、CPU死等的缺点
WWDG( Windows Watchdog ),窗口看门狗。
使用精准的时钟源,通过硬件的方式,实现定时功能,核心就是计数器。
STM32F1中,基本定时器为TIM6和TIM7( STM32F103C8T6没有 );
主要特征:
只能递增
可以看出,基本定时器的时钟来源为内部时钟( CK_INT ),溢出条件为CNT == ARR(影子)
,只有递增计数模式。
其中影子寄存器才是真正起作用的寄存器,但不能直接访问。
计数模式与溢出条件
计数器模式 | 溢出条件 |
---|---|
递增计数模式(向上) | CNT == ARR |
递减计数模式(向下) | CNT == 0 |
中心对齐模式 | CNT == ARR - 1,CNT == 1 |
其中:
Tout 为定时器溢出时间
Ft 为定时器的时钟源频率( 未分频 )
ARR 为自动重装载寄存器的值
PSC 为预分频寄存器的值
可以这样来看这个公式:
这个是计数频率;
这个是计一个数的时间,频率的倒数;
这个是要计这么多数;
因此可以理解为一个数的时间 × 个数 = 总时间
。
硬件:STM32F103C8T6最小系统板 + 自制扩展板
实物图如下图所示:
LED1 -> PB3
在此不进行赘述,详细步骤可移步至之前文章。
与之前文章不同的是,根据预设条件:溢出时间(Tout)为500ms,定时器的时钟源频率(Ft)为72MHz,因此可设定(PSC+1)= 7200,(ARR+1)= 2500,从而实现溢出时间(Tout)为500ms。
配置TIM4(没有基本定时器,用通用定时器实现),如下图所示:
其中 auto-reload precload 为自动重装载的预装载:
由于是定时器溢出之后是产生中断,因此需要使能定时器中断:
主要是对定时器中断回调函数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翻转一次状态!
这是定时器的最基本的功能,时基功能!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。