stm32f103使用定时器2写一个延迟函数,延迟一秒,并且在main中如何调用
时间: 2024-10-14 10:04:27 浏览: 55
STM32F103C8T6使用HAL库创建0.96‘OLED模拟I2C显示例程
在STM32F103单片机上,我们可以使用Timer2的溢出中断来实现大约一秒的延时。首先,你需要配置Timer2的工作模式、预分频值以及计数器的初始值。这里是一个基本的步骤:
1. 配置Timer2:
- 将Timer2设置为PWM模式,如果需要计时,则可以设置为自由运行模式(例如 TIM2_Mode_2 或 TIM2_Mode_3)。
- 设置预分频器:TIM2_Prescaler = (SystemCoreClock / TimerPrescalerValue) - 1,通常选择72MHz时钟,预分频8(8 * 15 = 120),那么预分频值为16(即8除以120约等于0.07)。
- 开启Timer2:TIM2_Cmd(ENABLE)。
2. 定义定时器溢出中断服务函数(ISER):
```c
void TIM2_IRQHandler(void) {
// 如果到达了预定时间点(比如计数值达到某个预设值),则清除中断并结束延时
TIM2_ClearFlag(TIM2_FLAG_Update);
if (your_condition_to_end_delay) {
EXTI_ClearITPendingBit(EXTI_Line_TIM2); // 清除中断标志
}
}
```
3. 初始化中断系统:
```c
void init_TIM2_IRQ() {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // Timer2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 低优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 启动中断
NVIC_Init(&NVIC_InitStructure);
}
4. 在主函数`main()`中,首先要启用Timer2的中断,然后开始定时:
```c
int main(void) {
... (其他初始化代码)
init_TIM2_IRQ();
TIM2->ARR = SystemCoreClock / TimerPrescalerValue - 1; // 设置定时器最大计数值
TIM2->CNT = 0; // 初始计数器值为0
TIM2->CR1 &= ~TIM_CR1_CEN; // 关闭计数器
TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器
while (1) {
// 主循环,如果到达延时时限,可以在这个位置调用你的延时完成后的函数
}
}
```
在`while(1)`循环中,当延时一到,你可以通过检查`your_condition_to_end_delay`是否满足来结束延时,然后在TIM2_IRQHandler中断服务函数中执行相应的操作。
阅读全文