打通stm32定时中断的流程
就定时中断的基本结构可知 使用定时器中断要打通三部分 :选择时基单元的时钟来源 配置时基单元 配置中断
相关库函数
选择时基单元的时钟来源
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
配置时基单元时钟来源为内部时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
输入捕获,参数2为捕获的引脚,3为极性选择,4滤波
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
外部时钟模式一跟二 参数2可以对外部时钟进行一次分频
模式一是选择外部输入脚作为时钟源,模式二是选择外或内触发输入
滤波是判断一个周期内的信号稳定与否,稳定输入该周期的波,不稳定则输出上一稳定周期
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
单独配置etr引脚
时基单元的配置
void TIM_TimeBaseInit (TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
参数1 选择配置的定时器
参数2 时基单元参数的结构体
初始化时基结构体后一些可单独修改值的函数
预分频
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
1对预分频值进行配置 参数2对预分频值写入方式做选择,可以是缓冲写入,可以是直接写入
计数器
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
对计数器值写入是否缓冲进行选择
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
写入值到计时器中
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
写入一个自动重装值
查看时基相关值
计数器
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
获取当前计数器的值
预分频
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
此外查看中断位与其他外设相同
使能时基与使能中断
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
使能计数器,相当于基本结构中的运行控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
中断使能,相当于图中中断输出控制
编程注意
1 基础跟通用定时器挂载在APB1上,高级定时器挂载在APB2上
2 初始化时基之后会立即产生一次更新中断(因为有的要更新之后才写入psc arr),因此当作为计时使用时,是从1开始计,若需要从0开始,初始化时基后需要编程清除一次更新状态。
-------------------------------------------------------------------------------------------------------------------------------
图片来自江科大