赞
踩
传统STM32外部中断的设计步骤:
(1)将GPIO初始化为输入端口。
(2)配置相关I/O引脚与中断线的映射关系。
(3)设置该I/O引脚对印的中断触发条件。
(4)配置NVIC,并使能中断。
(5)编写中断服务函数。
基于STM32CubeMX的外部中断设计步骤
(1)在STM32CubeMX中指定引脚,配置中断初始化参数。
(2)重写该I/O引脚对应的中断回调函数。
打开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触发一次定时器中断;
公式的由来:
配置好之后生成工程,打开工程后先全局编译。
开启定时器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()初始化函数下
在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)回调函数
若想要使得LED灯以每隔500ms开关状态翻转,则可以找到MX_TIM2_Init()初始化函数,将该函数中的htim2.Init.Period = 9999;数值设置为4999,此时Prescaler设置为7199,Counter Period设置为4999,Tclk为72Mhz。根据公式计算得出定时时间为0.5s触发。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。