【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

一. 外部中断的程序设计

传统STM32外部中断的设计步骤:
 (1)将GPIO初始化为输入端口。
 (2)配置相关I/O引脚与中断线的映射关系。
 (3)设置该I/O引脚对印的中断触发条件。
 (4)配置NVIC,并使能中断。
 (5)编写中断服务函数。
基于STM32CubeMX的外部中断设计步骤
 (1)在STM32CubeMX中指定引脚,配置中断初始化参数。
 (2)重写该I/O引脚对应的中断回调函数。

二. 使用STM32CubeMX实现定时器中断

  打开STM32CubeMX,如何新建一个工程就不赘述了。
  设置高速外部时钟HSE,选择外部时钟源

在这里插入图片描述
在这里插入图片描述

  这里使用PB4引脚(我的开发板上LED灯接在PB4引脚),设置为推挽输出模式,默认输出高电平

在这里插入图片描述

  接下来配置定时器TIM2及其参数

在这里插入图片描述

  开启TIM2的全局中断

在这里插入图片描述

  接下来是一个重点,关于设置定时器的参数以及计算定时公式
这里暂时先将Prescaler设置为7199,Counter Period设置为9999
在这里插入图片描述
Counter Settings(计数器设置)
Prescaler(定时器分频系数):7199
Counter Mode(计数器模式):up(这里选择向上计数模式) down(向下计数模式)/ Certer Aligned mode(中央对齐模式)
Counter Period(自动重装载值):9999
Internal Clock Division(时钟分频因子):No Division(这里选择不分频) Division by 2(二分频)/ Division by 4(四分频)
auto-reload preload(自动重装载):使能
TRGO Parameters 定时器触发信号(TRGO)参数 这里暂时不需要用
Master/Slave Mode(主从模式):禁用
Trigger Event Selection(触发事件选择):复位

在这里我将Prescaler(psc)与Counter Period(arr)的分别设置为了7199和9999,Tclk为72Mhz。
根据STM32定时器时间计算公式:Tout = ((arr+1)(psc+1))/ Tclk;
将数值带入到公式中 Tout = ((9999+1)(7199+1))/ 72000000 = 1s;就可以算成这个是1s触发一次定时器中断;
公式的由来:

  1. 定时器的时钟频率是Tclk:当Prescaler为psc时,时钟频率被分频了psc+1;那么此时定时器的最终频率为Tclk/(psc+1);由此可知定时器计数值加1所需要的时间是(psc+1)/Tclk;
  2. 当装载值设置为arr时,定时器从0计数到arr时清零;
  3. 所以定时时间公式为:Tout = ((arr+1)(psc+1))/ Tclk;
    注意:若将72MHz换算代入公式的话,则计算出的结果单位就是s,反之,就是us。

配置好之后生成工程,打开工程后先全局编译。

三. STM32F103定时器中断有关HAL库函数

 开启定时器TIM中断

/**
  * @brief  在中断模式下启动TIM Base生成。
  * @param  htim TIM基本句柄
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim){
	/*
	...
	*/
}

 触发定时器中断的非阻塞中断回调函数。在定时器触发中断后,就会进入定时器中断,退出定时器中断后就会调用定时器中断回调函数

/**
  * @brief  在非阻塞模式下经过的周期回调
  * @param  htim TIM handle
  * @retval 空
  */
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /*注意:这个函数不应该被修改,当需要回调时,
	HAL_TIM_PeriodElapsedCallback可以在用户文件中实现
  */
}

 关于定时器计数器参数配置在tim.c文件的MX_TIM2_Init()初始化函数下
在这里插入图片描述

四. 实现STM32F103定时器中断

 在main.c文件中的main函数中开启定时器中断的初始化

在这里插入图片描述

 在main.c文件中的main函数中的USER CODE BEGIN PFP注释对中添加定时器中断回调函数。在之前设置的定时器计数器的参数设置中,将Prescaler设置为7199,Counter Period设置为9999,Tclk为72Mhz。根据公式计算得出定时时间为1s触发。也就是说,按以下代码的写法,定时器每一秒都会触发一次定时器中断,退出定时器中断后进入中断回调函数判断是否是定时器TIM2触发的中断,若是,则翻转PB4的电平状态,不是,则不做处理。

在这里插入图片描述

 HAL_TIM_PeriodElapsedCallback中断回调函数在stm32fxx_hal_tim.c文件中

在这里插入图片描述请添加图片描述

 在stm32fxx_hal_tim.c中找到HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)回调函数

在这里插入图片描述

下载到板子上运行,会发现PB4引脚口所接的LED灯每隔一秒开关状态翻转。

若想要使得LED灯以每隔500ms开关状态翻转,则可以找到MX_TIM2_Init()初始化函数,将该函数中的htim2.Init.Period = 9999;数值设置为4999,此时Prescaler设置为7199,Counter Period设置为4999,Tclk为72Mhz。根据公式计算得出定时时间为0.5s触发。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CubeMX中配置高级定时器,您可以按照以下步骤进行操作: 1. 打开STM32CubeMX软件,并选择您的目标STM32微控制器型号。 2. 在"Pinout & Configuration"选项卡中,选择"Timers"选项。 3. 在"Timers"选项中,找到您想要配置的高级定时器,例如TIM1或TIM8。 4. 单击所选定时器旁边的复选框,以启用该定时器。 5. 根据您的需求,配置定时器的不同参数,例如时钟源、预分频器、计数模式等。您可以参考STM32的参考手册或数据手册来了解每个参数的具体含义和配置方式。 6. 在配置完成后,单击"OK"按钮以应用配置。 7. 在"Project"选项卡中,选择您的开发板或目标硬件。 8. 根据您的需求,配置其他外设和功能。 9. 单击"Project"选项卡上方的"Generate Code"按钮,生成代码并导出到您的开发环境中。 通过按照以上步骤进行配置,您可以在STM32CubeMX中成功配置高级定时器。请注意,具体的配置步骤可能会因不同的STM32微控制器型号而有所差异,因此请参考您所使用的微控制器的参考手册或数据手册以获取更详细的配置信息。\[2\]\[3\] #### 引用[.reference_title] - *1* [STM32CubeMx配置定时器](https://blog.csdn.net/qq_31073871/article/details/121657095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32CubeMX学习笔记九《定时器配置》](https://blog.csdn.net/weixin_43123205/article/details/109958592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值