A122基本定时器生成脉冲演示视频
STM32F4使用基本定时器生成脉冲
相关理论介绍
脉冲指的是具有一定时间间隔或频率的电子信号。要利用STM32F4基本定时器生成脉冲,需要设定分频系数、计数模式、重装载值等相关寄存器参数,通过这些设置,定时器能够在达到特定的计数值时产生一个中断或者翻转其输出状态,从而生成所需的脉冲信号。本小节将介绍两种生成脉冲信号的方式,一种是中断计数方式,另一种是计数触发方式。使用中断模式,有个较为明显的缺点是当生成脉冲的频率较高时,频繁的中断会影响程序运行效率。
脉冲的生成是要为控制所用,所以要能做到精准控制脉冲在单位时间内生成的个数。这里就涉及到要弄清楚3个参数。
第1个参数是定时器对应的时钟频率(见表1.1),这直接关系到定时器频率的选择。
第2个参数是预分频系数(TIM_Prescaler),这是用于设定定时器时钟频率的参数,要注意的是在STM32F4中,APB1和APB2的时钟源都是来自AHB总线,然后通过分频器进行分频,当预分频系数为1时,设备直接使用AHB总线的时钟;当预分频系数不为1时,设备使用的时钟频率将是AHB总线时钟的2倍。例如,使用基本定时器TIM7时,对应APB1的时钟频率为42MHz,当预分频系数等于1时,TIM7的时钟频率为42MHz,当预分频系数不等于1,TIM7的时钟频率为84MHz。
第3个参数是重装载值(TIM_Period),这是用于设定定时器计数溢出值的参数。例如,选择基本定时器TIM7,通过设定预分频系数使TIM7的计数频率为1000Hz,同时,设定重装载值等于(1000-1),这意味着TIM7从0开始计数后,当计数值CNT等于999时,产生中断事件,也就是说TIM7每1秒钟产生一次中断。
在了解了以上3个参数之后,就可以通过下面这个公式准确的计算出中断时间TINT。例如,选用基本定时器TIM7,设置预分频系数TIM_Prescalerr设定为(84000-1),此时TIM7的时钟频率TCLK为84MHz,设置重装载值TIM_Period=(1000-1),得到中断时间TINT=1S。
注意:重装载值等于(1000-1)中减1的操作是因为定时器TIM7从0开始计数,这样当计数器计数到重装载值999时,它实际上已经计数了1000次,如果不减去1,计数器将在达到999时产生溢出事件,而不是预期的1000次计数,导致定时不准确。而中断时间计算公式中的“+1”,是因为人类是从1开始计数,从而抵消(1000-1)中的“-1”,得到实际计算值。所以不管是机器计数,还是人类计数,在这个例子中得到的计数次数都是1000次,只是从0或从1开始计数罢了。
接下来介绍具体编程步骤
步骤一:结构体介绍
/**定时器初始化结构体**/
typedef struct
{
uint16_t TIM_Prescaler; //定时器预分频器
uint16_t TIM_CounterMode; //计数模式
uint32_t TIM_Period; //定时器重装载值
uint16_t TIM_ClockDivision; //时钟预分频系数
uint8_t TIM_RepetitionCounter; //重复计数器
} TIM_TimeBaseInitTypeDef
步骤二:定时器TIM7程序配置
/**TIM7初始化配置**/
void TIM7_Pulse_Init(u32 arr, u32 psc)
{
}
步骤三:定时器TIM7中断函数
/**TIM7中断服务函数**/
void TIM7_IRQHandler(void)
{
}
步骤四:主程序
前面讲到的两种可生成脉冲的方式,下面将使用条件编译方法,选择自己所需脉冲生成方式。
#define Select1 //宏定义,用于选择定时器中断方式
//Select1 开启定时器中断,使用中断功能实现电平翻转产生脉冲
//Select2 关闭定时器中断,使用数值判断实现电平翻转产生脉冲,可避免频繁中断影响其他功能
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC优先级分组为2
LED_Init();//初始化LED
TIM7_Pulse_Init(10000-1,8400-1);//初始化TIM7,设置中断时间为1秒(10000-1)
while(1)
{
}
}