stm32过31定时器3倒计时
时间: 2023-07-25 22:05:20 浏览: 158
以下是使用STM32F103C8T6芯片的定时器3进行倒计时的示例代码,时钟频率为72MHz:
1. 初始化定时器3
```c
void TIM3_Init()
{
// 使能定时器3时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
// 设置预分频器为72-1,即时钟频率为1MHz
TIM3->PSC = 71;
// 设置自动重载值为999,即定时器3周期为1ms
TIM3->ARR = 999;
// 使能更新事件
TIM3->CR1 |= TIM_CR1_URS;
TIM3->EGR |= TIM_EGR_UG;
// 使能定时器3
TIM3->CR1 |= TIM_CR1_CEN;
}
```
2. 设置定时器3的中断
```c
void TIM3_NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
// 配置定时器3中断优先级为2,抢占优先级为0,子优先级为2
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能定时器3更新中断
TIM3->DIER |= TIM_DIER_UIE;
}
```
3. 定时器3的中断处理函数
```c
void TIM3_IRQHandler()
{
// 判断是否为定时器3更新中断
if (TIM3->SR & TIM_SR_UIF)
{
// 更新计数器并判断是否到达0
if (--countdown == 0)
{
// 关闭定时器3
TIM3->CR1 &= ~TIM_CR1_CEN;
// 做其他操作
// 清除计数器
countdown = 0;
}
// 清除中断标志位
TIM3->SR &= ~TIM_SR_UIF;
}
}
```
4. 启动倒计时
```c
void startCountdown(uint16_t time)
{
// 设置倒计时时间
countdown = time;
// 初始化定时器3
TIM3_Init();
// 设置定时器3的中断
TIM3_NVIC_Config();
}
```
在调用startCountdown函数时,传入需要倒计时的时间(单位为ms),即可启动倒计时。在定时器3的中断处理函数中,每隔1ms更新计数器countdown的值,并判断是否到达0,如果到达0,则关闭定时器3并进行其他操作。
阅读全文