> 技术文档 > TIM 实现定时中断【STM32L4】【实操】

TIM 实现定时中断【STM32L4】【实操】

使用定时器实现定时中断的功能:比如每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); }}