为了获取精确延时,STM32芯片中往往会使用内核中的嘀嗒时钟Systick作为参考时钟。当嘀嗒时钟被占用做其他用途时,比如RTOS中的节拍器;就需要采用其他方法进行延时。
这里提出一种采用通用定时器作为延时的参考时钟的方法。
首先选择基础定时器即可,配置定时器参数,主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位,由于TIM2的时钟为84MHz,所有TIM2_PSC设置为84,即每一次计数对应1us。另外,这里计数器采用向下计数,便于程序判断。
void Delay_Timer_Init(void)
2 {
3 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
4
5 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
6
7 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
8 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
9 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
10 TIM_TimeBaseInitStruct.TIM_Period = 100-1;
11 TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1);
12 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
13
14 while((TIM3-》SR & TIM_FLAG_Update)!=SET);
15 TIM3-》SR = (uint16_t)~TIM_FLAG_Update;
16 }
延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。
1 void Delay_us(uint32_t us_cnt)
2 {
3 TIM3-》CNT = us_cnt-1;
4 TIM3-》CR1 |= TIM_CR1_CEN;
5 while((TIM3-》SR & TIM_FLAG_Update)!=SET);
6 TIM3-》SR = (uint16_t)~TIM_FLAG_Update;
7 TIM3-》CR1 &= ~TIM_CR1_CEN;
8 }
在没有外部中断的情况下,对延时精度进行测试。测试方法是周期性控制GPIO管脚的输出电平:
1 while(1)
2 {
3 PEOUT_REG(1) = 1;
4 Delay_us(1);
5 PEOUT_REG(1) = 0;
6 Delay_us(1);
7 }
为了获取精确延时,STM32芯片中往往会使用内核中的嘀嗒时钟Systick作为参考时钟。当嘀嗒时钟被占用做其他用途时,比如RTOS中的节拍器;就需要采用其他方法进行延时。
这里提出一种采用通用定时器作为延时的参考时钟的方法。
首先选择基础定时器即可,配置定时器参数,主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位,由于TIM2的时钟为84MHz,所有TIM2_PSC设置为84,即每一次计数对应1us。另外,这里计数器采用向下计数,便于程序判断。
void Delay_Timer_Init(void)
2 {
3 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
4
5 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
6
7 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
8 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
9 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
10 TIM_TimeBaseInitStruct.TIM_Period = 100-1;
11 TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1);
12 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
13
14 while((TIM3-》SR & TIM_FLAG_Update)!=SET);
15 TIM3-》SR = (uint16_t)~TIM_FLAG_Update;
16 }
延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。
1 void Delay_us(uint32_t us_cnt)
2 {
3 TIM3-》CNT = us_cnt-1;
4 TIM3-》CR1 |= TIM_CR1_CEN;
5 while((TIM3-》SR & TIM_FLAG_Update)!=SET);
6 TIM3-》SR = (uint16_t)~TIM_FLAG_Update;
7 TIM3-》CR1 &= ~TIM_CR1_CEN;
8 }
在没有外部中断的情况下,对延时精度进行测试。测试方法是周期性控制GPIO管脚的输出电平:
1 while(1)
2 {
3 PEOUT_REG(1) = 1;
4 Delay_us(1);
5 PEOUT_REG(1) = 0;
6 Delay_us(1);
7 }
举报