使用定时器实现定时中断的功能:比如每1ms进入中断处理函数
使用STM32CubeMX配置TIM初始化
先了解每个参数的含义,在进行配置
Counter Settings: 计数器基本设置
Prescaler(PSC): 预分频器,设置预分频器系数
Counter Mode: 技术模式,上/下/中央对齐
Counter Period(AutoReload Register): 计数周期,ARR的值
Internal Clock Division: 内部时钟频率,对输入到定时器内部的时钟进行分频,位于预分频器后面,作用是:数字滤波、信号同步、噪声抑制
auto-reload preload: 自动装载预装载,影子寄存器,是否启用
Trigger Output(TRGO) Parameters: 触发输出参数
Master/Slave Mode: 主从模式选择
Trigger Event Selection: 触发事件选择,触发输出TRGO
**************************
使用的L4进入定时器的频率是 80Mhz
我们选择80分频,就是1Mhz,1000 / 1000 000 = 0.001s,就是1ms
int main(void)
{HAL_Init();SystemClock_Config();MX_TIM4_Init();// 以中断模式启动定时器// 启动后 会一直循环 不会停止if (HAL_TIM_Base_Start_IT(&htim4) != HAL_OK){Error_Handler();}while (1){}
}// 用户的中断回调函数 编写自己所需功能
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM4){// 比如使 LED 亮灭HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); }
}
void MX_TIM4_Init(void)
{ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; // TIM时钟配置结构体TIM_MasterConfigTypeDef sMasterConfig = {0}; // TIM主机配置结构体htim4.Instance = TIM4;htim4.Init.Prescaler = 79; // 分频系数htim4.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式htim4.Init.Period = 1000; // 计数周期htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 内部时钟分频htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重装载影子寄存器if (HAL_TIM_Base_Init(&htim4) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; // 选择内部时钟源if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; // 主输出触发源复位sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; // 不使能主机模式if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK){Error_Handler();} }void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{if(tim_baseHandle->Instance==TIM4){ __HAL_RCC_TIM4_CLK_ENABLE(); // 打开TIM4时钟/* TIM4 interrupt Init */HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0); // 设置TIM4中断优先级HAL_NVIC_EnableIRQ(TIM4_IRQn); }
}