stm32f4定时器基本应用
程序员文章站
2022-03-13 23:34:32
...
stm32f4定时器基本应用
所谓的基本应用,就是只用到了它的计数功能和中断功能,没用到外部输入功能、PWM输出功能以及一些其它高级的功能。
一、定时器时钟源
STM32F4的定时器的时钟频率由硬件自动设置,分为2种情况:
- 如果 APB 预分频器为 1,定时器时钟频率等于 APB 域的频率。
- 否则,等于 APB 域的频率的两倍 (×2)。
在我使用的板子上,AHB1为4分频,AHB2为2分频
二、计算器模式
1. 递增计数模式
在递增计数模式下,计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
2. 递减计数模式
在递减计数模式下,计数器从自动重载值开始递减计数到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
3.中心对齐模式(递增/递减计数)
在中心对齐模式下,计数器从 0 开始计数到自动重载值 — 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从
0 开始重新计数。
三、程序解析
程序使用定时器1,设置定时器1为1秒中断。
void Time1Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 1. 使能时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_DeInit(TIM1);
/* 2. 配置定时器参数 */
TIM_TimeBaseStructure.TIM_Period = 10000 - 1; /* 定时器重装载值 */
TIM_TimeBaseStructure.TIM_Prescaler = 16800; /* 定时器时钟分频系数 */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 计数器模式 */
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; /* 重复计数值 */
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* 3. 配置定时器中断优先级 */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
/* 4. 使能定时器中断 */
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
/* 5. 使能定时器 */
TIM_Cmd(TIM1, ENABLE);
}
四、注释
1. 定时器重载值的计算
由于APB2为2分频,故定时器时钟源的频率为168MHz,在程序中定时器1的分频系数为16800,故要产生1S定时中断的值X为:
16800/168000000*X = 1
故定时器初值为:10000 - 1
2. TIM_RepetitionCounter重复计数的作用
重复计数的值可以设定为0x00~0xff,如果设定该值为非0时,定时器中断将会在设定时间TIM_RepetitionCounter倍后产生,例如设定该值为2,那么定时器中断将会在2秒后产生。注意,该值只在定时器1和定时器8中有用。
3.TIM_ClockDivision的作用
在《STM32F4xx中文参考手册.pdf》中是这样描述的
具体什么意思,暂时不明白。
上一篇: STM32CubeMx之定时器