useState在定时器中使用 定时器常用库函数_初始化


一、定时中断有关的函数

void TIM_DeInit(TIM_TypeDef* TIMx);
//恢复缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, 
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//时基单元初始化,比较重要,用来配置上图的时基单元,第一个参数TIMx选择某个定时器,
//第二个是结构体,包含配置时基单元的一些参数,
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//可把结构体变量赋一个默认值,
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//用来使能计数器,对应上图的运行控制,第一个参数选择定时器,第二个NewState新的状态
//即使能还是失能,对应计数器是否运行
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, 
FunctionalState NewState);
//用来使能中断输出信号,对应上图中断输出控制,第一个参数选择定时器,第二个选择要
//配置哪个中断输出,第三个新的状态即使能还是失能,ITConfig函数会经常遇到使能外设的中断输出
//以下六个函数对应时基单元的**时钟选择**部分,可选择RCC内部时钟、ETR外部时钟等四个
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
//选择内部时钟,参数只有一个
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx,
 uint16_t TIM_InputTriggerSource);
//选择ITRx其他定时器时钟,第一个参数选择要配置的定时器,第二个选择要接入
//哪个其他的定时器
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
//选择TIx捕获通道的时钟,第一个选择定时器,第二个选择TIx具体的某个引脚,
//第三个和第四个,输出的极性和滤波器,对于外部引脚的波形一般都会有这两个选择,更灵活
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
//选择ETR通过外部时钟模式1输入的时钟,第一个略,第二个外部触发预分频器,可对ETR的
//外部时钟再提前做一个分频,后两个同样是极性和滤波器
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
//同上
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
 uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
 //这个不是用来选择时钟,单独用来配置ETR引脚的预分频器、极性、滤波器这些参数,

时钟源选择就用上面六个函数!!时基单元用TIM_TimeBaseInit函数,中断输出控制用TIM_ITConfig函数,NVIC用外部中断讲过的NVIC_Init函数,运行控制用TIM_Cmd函数,这样初始化基本就可以了!!
下面再来看几个,因为初始化结构体里有很多关键的参数,比如自动重传值和预分频值等,这些参数可能在初始化之后还需要进行修改,如果因为这个还要再调用一次初始化函数太过麻烦!

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, 
uint16_t TIM_PSCReloadMode);
//用来单独写预分频值,第二个prescaler就是要写入的预分频值,第三个参数写入模式
//预分频器有一个缓冲器,写入的值是在更新事件发生后才有效的,写入模式可选择是
//听从安排在更新事件生效、或者再写入后手动产生一个更新事件,让这个值立刻生效
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
//用来改变计数器的计数模式,参数countermode选择新的计数器模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
//自动重装器预装功能配置,有预装还是无预装是可以自己选择的,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);
//获取当前预分频器的值
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
//这四个函数用来获取标志位和清楚位的

二、下面的函数与通用/高级定时器的输出比较功能有关:(运用PWM实操用到了)

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
//这四个函数是用结构体来配置输出比较单元的,OC就是Output Compare,可参考输出比较单元博客(4路),第一个TMx选择定时器
//第二个结构体,就是输出比较的那些参数
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
//这个用来给输出比较结构体赋一个默认值的
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
//补充:这个函数仅高级定时器使用,在使用高级定时器输出PWM时需要调用该函数,使能主输出,否则PWM不可正常输出。

以上几个就基本可以配置输出比较了很重要,下面还有一些小功能和运行时更改参数的函数,大多数用的不多了解即可,有兴趣可参考手册,最后一个比较重要

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
//用来配置强制输出模式,如果在运行中想要暂停输出波形并且强制输出高/低电平可用到,用的不多了解一下!
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
//用来配置CCR寄存器的预装功能,即影子寄存器,就是写入的值不会立即生效,而是在更新事件后才会生效,用的不多!
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
//用来配置快速使能,手册中单脉冲模式小节其中一段有介绍,用的不多!
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
//手册中外部事件时清除REF信号小节有介绍,用的不多!
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
//可用来单独设置输出比较的极性的,带N的就是高级定时器里互补通道的配置,OC4没有互补通道,单独设置极性(多用于修改)
//在结构体初始化的函数里也可以设置极性。一般来说结构体里的参数都会有一个单独的函数可对其修改
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
//可用来单独修改输出使能参数
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
//可用来单独更改输出比较模式
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
//可用来单独更改CCR寄存器值,这四个比较重要更改占空比需要用到!!!!!!!!!

持续更新中…