定时器是stm32的重要功能部件,通过适当的配置可以使用它的定时溢出功能实现精确的定时,配置内容主要是预分频值和计数周期两项内容,现以TIM3为例,打算配置该定时器1us溢出一次,试说明: 1、预分频值和计数周期各为多少? 2、写出完整的定时器时基配置代码。 3、如果启用溢出中断,写出中断管理器配置代码。 4、如果计划定时2s,试给出你的定时策略,并写出实现代码。
时间: 2023-03-29 18:04:09 浏览: 112
1、预分频值为71,计数周期为999。因为STM32的时钟频率为72MHz,而要实现1us的定时,需要计数器每计数一次就产生一个定时器溢出,即需要1MHz的计数频率。因此,预分频值为71,计数周期为999,总的计数频率为72MHz/(71+1)=1MHz,每计数100次就产生一个定时器溢出,即1us。
2、完整的定时器时基配置代码如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; //设置计数周期
TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式为向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3
3、启用溢出中断的中断管理器配置代码如下:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //设置TIM3中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ; //设置抢占优先级为
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ; //设置子优先级为
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
4、定时2s的策略是,每次定时器溢出时计数器加1,当计数器累加到200时,表示已经定时2s,此时停止定时器并执行相应的操作。实现代码如下:
TIM_Cmd(TIM3, ENABLE); //启动定时器
uint16_t count = ; //计数器初始化为
while (1) {
if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == SET) { //判断是否发生定时器溢出
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除定时器溢出标志位
count++; //计数器加1
if (count >= 200) { //计数器累加到200时,停止定时器并执行相应的操作
TIM_Cmd(TIM3, DISABLE); //停止定时器
//执行相应的操作
break; //跳出循环
}
}
}
阅读全文