前言
STM32G431RB共有10个定时器;
高级定时器:TIM1、TIM8
通用定时器:TIM2-5、TIM15-17
普通定时器:TIM6-7
一、首先是定时器的基础应用定时中断,这里配置定时器6产生10ms中断为例。
STM32CubeMX配置
配置完参数后使能中断,点击“GENERATE COOE”等待软件更新工程配置。
keil
//初始化定时器需要调用,参数为定时器编号
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);//启动定时器
//需要停止定时器调用,参数为定时器编号
HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);//停止定时器
//中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
//定时器6定时中断示例
HAL_TIM_Base_Start_IT(&htim6);//启动定时器
//定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)//判断是否是TIM6的中断
{
/*
需要定时的执行代码
*/
}
}
二、定时器的输入捕获
STM32CubeMX配置
配置完参数后使能中断,点击“GENERATE COOE”等待软件更新工程配置。
keil
//开启定时器输入捕获初始化时调用
//参数1:定时器编号
//参数2:定时器通道
HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
//中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
//定时器2通道1输入捕获示例
unsigned int ccr_val=0,frq=0;
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);//启动定时器捕获
//中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
ccr_val = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//读取计时值
frq = 1000000/ccr_val;//计算频率
__HAL_TIM_SetCounter(htim,0);//清除计时值
//HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);//重启定时器
}
}
三、定时器的输出pwm
STM32CubeMX配置
配置完参数后使能中断,点击“GENERATE COOE”等待软件更新工程配置。
keil
修改pwm的占空比、频率,方法1
//pwm输出初始化调用
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
/*
功 能:修改占空比
参数1:定时器编号
参数2:通道
参数3:比较值(占空比)
*/
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__);
//修改预分频值
//参数1:定时器编号
//参数2:分频值
__HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__);
//修改重装载值
//参数1:定时器编号
//参数2:重装载值
__HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__)
//修改预分频值或重装载值后需要调用
//参数1:定时器编号
//参数2:指定事件源 (计时器更新事件源: TIM_EVENTSOURCE_UPDATE)
HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource);
修改pwm的占空比、频率,方法2
/*
直接操作寄存器
决定输出pwm占空比的比较值寄存器是 CCRx
定时器的重装载值 ARR
*/
//用定时器17的通道1举例
//假设初始化时配置的参数为预分频值为 8-1 ,重装载值 1500-1 ,占空比为150-1
//那么输出的pwm为4khz,占空比为10%
//修改占空比为50%,只需修改比较值
TIM17->CCR1 = TIM17->ARR/2;
//修改pwm频率为8k
TIM17->ARR= 750 - 1;