STM32F103R8t6中的定时器TIM3延时函数
时间: 2024-06-13 19:04:57 浏览: 214
STM32F103R8t6中的定时器TIM3可以用来实现延时函数,可以通过硬件延时实现微秒级和毫秒级的延时。具体实现方法如下:
1. 首先需要对TIM3进行初始化,设置预分频值和比较值,使得TIM3的时钟频率为1MHz,即1个时钟时间为1us。
2. 编写硬件延时微秒级函数delay_us,通过设置TIM3的CNT寄存器和启动计数器实现硬件延时。
3. 编写硬件延时毫秒级函数delay_ms,通过调用delay_us函数实现硬件延时。
代码实现如下:
```c
// 定义TIM3实例
TIM_HandleTypeDef TimHandle;
// 定义时钟频率
#define SYSTEM_CLOCK (SystemCoreClock / 1000000)
// TIM3初始化函数
void delay_init(void) {
// 设置TIM3实例
TimHandle.Instance = TIM3;
// 使能TIM3时钟
__HAL_RCC_TIM3_CLK_ENABLE();
// 设置比较值和预分频值
TimHandle.Init.Period = 100-1; // 比较值
TimHandle.Init.Prescaler = (SYSTEM_CLOCK-1); // 预分频值
TimHandle.Init.ClockDivision = 0;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_DOWN;
TimHandle.Init.RepetitionCounter = 0;
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 初始化TIM3
HAL_StatusTypeDef err_code = HAL_TIM_Base_Init(&TimHandle);
APP_ERROR_CHECK(err_code);
}
// 硬件延时微秒级函数
void delay_us(volatile uint32_t us_cnt) {
// 设置计数器初值
TIM3->CNT = us_cnt-1;
// 启动计数器
TIM3->CR1 |= TIM_CR1_CEN;
// 等待计数完成
while((TIM3->SR & TIM_FLAG_UPDATE) != SET);
// 清除计数完成标志
TIM3->SR = (uint16_t)~TIM_FLAG_UPDATE;
// 停止计数器
TIM3->CR1 &= ~TIM_CR1_CEN;
}
// 硬件延时毫秒级函数
void delay_ms(volatile uint32_t nms) {
volatile uint32_t ms = nms;
while(nms--) {
delay_us(1000);
}
}
```
阅读全文