STM32c8t6的定时器2的初始化和中断,且有延时函数1ms,使用标准库,不适用hal库
时间: 2024-10-16 09:05:04 浏览: 44
STM32C8T6使用HAL库,驱动多路18B20,GY906,2812LED,舵机
STM32C8T6处理器的定时器2是一个高级定时器,用于精确的时间控制。以下是定时器2的基本初始化步骤以及如何设置1ms的延时,并利用C标准库处理:
1. **初始化定时器2**:
首先,你需要配置定时器2的工作模式和预分频器。假设你想要使用PWM模式并且使用系统的时钟频率作为时钟源。在`stm32f4xx_hal_tim.h`文件中找不到对应的宏,所以我们需要手动操作寄存器。
```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitTypeDef timerInit;
timerInit.TIM_Period = 0x7FF; // 设置周期为2^15 - 1,因为1ms等于系统时钟频率除以1000,减去1微秒误差
timerInit.TIM_Prescaler = SystemCoreClock / (1000 * (clockDividerValue + 1)); // 根据实际系统时钟计算正确的预分频值
timerInit.TIM_ClockDivision = 0;
timerInit.TIM_RepetitionCounter = 0;
TIM_Init(TIM2, &timerInit);
TIM_Cmd(TIM2, ENABLE); // 启动定时器
```
2. **启用计数器和外部中断**:
对于1ms的延时,我们可以使用定时器溢出中断(TIMIER_TIIE)。首先,配置溢出中断并使能它:
```c
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启用更新中断
NVIC_EnableIRQ(TIM2_IRQn); // 开启定时器2中断
```
3. **编写延时函数**:
使用中断服务函数(ISR)实现1ms的延时,这里假设我们有一个全局标志`delayFlag`来检查是否到达了预定时间:
```c
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (!delayFlag) { // 如果延时未完成,再次进入等待
delayFlag = TRUE;
} else {
delayFlag = FALSE; // 延时结束,关闭中断
TIM_Cmd(TIM2, DISABLE); // 关闭定时器
}
}
}
// 延时函数
void delay_ms(uint16_t ms)
{
uint16_t startTick = HAL_GetTick();
while (HAL_GetTick() - startTick < ms * 1000) {} // 循环直到达到指定时间
TIM2_IRQHandler(); // 触发中断完成延时
}
阅读全文