五、HAL_Timer的定时功能

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)STM32CubeMX: V6.8.1

(3)MCU: STM32F407ZGT6

2、定时器简介

(1)定时器可以通过输入的时钟源进行计数,从而达到定时的功能。

3、实验目的&原理图

3.1、实验目的

(1)通过定时器设置定时,实现LED灯以500毫秒间隔闪烁。

3.2、原理图

(1)选择LED1,接PF9引脚。

4、STM32CubeMX创建工程及配置

4.1、创建工程

(1)打开STM32CubeMX软件。

(2)点击File→NewProject。

(3)Commercial Part Number(商用部件号)处输入MCU型号,然后选择正确的单片机型号,点击Start Project(开始项目)。

(4)配置工程名、工程存放文件等。

点击Project Manager(项目经理)进行如下配置。 

点击Code Generator(代码生成器)进行如下配置。 

(5)点击GENERATE CODE生成KeilMDK工程。 

4.2、配置时钟及GPIO

(1)HSE、LSE时钟源选择

  • HSE:高速外部时钟源
  • LSE:低速外部时钟源
  • Disable:禁用
  • BYPASS Clock Source:旁路时钟源
  • Crystal/Ceramic Resonator :水晶/陶瓷共振器
  • 一般选择水晶陶瓷共振器
  • 旁路时钟源就是由外部给定一个时钟信号,一般用于作为同步时钟。
  • 水晶/陶瓷共振器:指外接晶振,经过内部振荡电路产生时钟。

(2)LED1 GPIO配置

(3)时钟树配置

4.3、配置定时器

4.3.1、确定定时器挂载总线

(1)这里选择TIM2,确定TIM2挂载到哪根总线。

(2)查看STM32F407ZGT6芯片对应的数据手册。

(3)打开对应KeilMDK工程,点击Books。

(4)双击打开数据手册。

(5)查看芯片框图。TIM1挂载再APB1总线上,APB1 timer clocks时钟为72MHz,所以定时器1初始时钟为72MHz。

4.3.2、CubeMx中的TIM1配置

(1)定时器的配置项有很多,用不到的可以不用考虑,保持默认即可。

(2)时钟源的选择,选择内部时钟。也就是APB1 timer clocks。某些定时器只能选择内部时钟。

(3)定时器Parameter Settings(参数设置)计算。

  • 定时时长500毫秒。
  • Prescler(PSC -16 bits value): 分频系数,选择72-1,进行72分频,即定时时钟变为1MHz。
  • Counter Mode: 计数器模式,选择Up,向上计数。
  • Counter Period (AutoReload Register-32 bits value): 计数器周期,32位自动加载值。
  • 时钟频率1MHz表示1秒钟时钟振荡1000000次。
  • Counter Period = 500mS/(1/1Mhz) = 500mS/(1/1000000S) = 500000。

(4)打开定时器中断,定时器定时时间到,进入中断处理函数。

(5)点击GENERATE CODE更新KeilMDK工程。 

5、KeilMDK软件编写

5.1、程序编写

HAL_TIM_Base_Start_IT(&htim2);       /*启动定时器2,LED闪烁定时*/

/*功能:定时器中断回调函数
 *参数:定时器x
 *返回值:无
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM2)    
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);/*LED状态翻转*/
	}
}

5.2、完整工程下载地址

(1)完整工程存储再码云。

(2)STM32_CSDN: CSDN中STM32专栏的所有示例代码

6、定时器计数模式

(1)Up,向上计数模式。计数器从 0 计数到自动装入的值,然后重新从0开始计数并且产生一个计数器溢出事件。

(2)Down,向下计数模式。计数器从自动装入的值 开始向下计数到 0 ,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

7、分频系数和计数周期为什么要减1

7.1、STM32CubeMX中TIM分频系数

(1)假设STM32CubeMX中Tim2要进行72分频,分频系数设置为72-1。

(2)因为没有0分频,分频系数设置为0时表示不分频。

(3)查看对应芯片参考手册。

(4)ck_psc是指定时器时钟源。

7.2、STM32CubeMXTIM计数周期

(1)应为计数值到了后,需要往下再计数一个值,也就是溢出才产生中断。

(2)溢出的同时计数值重新加载。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HAL库提供了定时器Timer)的功能,您可以使用定时器来实现多次定时。具体步骤如下: 1. 初始化定时器 使用`HAL_TIM_Base_Start_IT()`函数初始化定时器,并启用中断。例如: ``` /* 定义定时器句柄 */ TIM_HandleTypeDef htim; /* 初始化定时器 */ void TIM_Init(void) { /* 定时器时钟使能 */ __HAL_RCC_TIM3_CLK_ENABLE(); /* 配置定时器参数 */ htim.Instance = TIM3; htim.Init.Prescaler = 71; /* 分频系数 */ htim.Init.CounterMode = TIM_COUNTERMODE_UP; /* 计数器模式 */ htim.Init.Period = 999; /* 自动重装载值 */ /* 启动定时器 */ HAL_TIM_Base_Init(&htim); /* 启动定时器中断 */ HAL_TIM_Base_Start_IT(&htim); } ``` 2. 实现定时器中断服务函数 定时器计数器到达自动重装载值时,会产生定时器中断。您需要实现定时器中断服务函数,在其中处理定时器事件。例如: ``` /* 定时器中断服务函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { /* 处理定时器事件 */ // ... } } ``` 3. 在定时器中断服务函数中实现多次定时定时器中断服务函数中,您可以使用计数器变量来实现多次定时。每次定时完成后,将计数器减1,直到计数器为0时,表示所有定时均已完成。例如: ``` /* 定义计数器变量 */ uint32_t counter1 = 10; uint32_t counter2 = 20; /* 定时器中断服务函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { /* 处理定时器事件 */ if (counter1 > 0) { /* 定时器1未完成 */ counter1--; // ... } if (counter2 > 0) { /* 定时器2未完成 */ counter2--; // ... } } } ``` 以上就是使用HAL库实现多次定时的基本步骤。需要注意的是,定时器的精度取决于分频系数和自动重装载值的设置,您需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码织梦师小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值