有些时候在一个现有的工程中系统时钟被占用,用做其它功能,此时又想实现精确延时并且又不想使用中断怎么办?
以TIM4为例:
void delay_us(unsigned int nus)
{
TIM4->CNT = nus - 1; // 向计数器装要递减的数,减到0后会触发定时器的TIM_FLAG_UpDate标志位
TIM4->CR1 |= TIM_CR1_CEN; // 使能计数器, 计数器开始递减
while((TIM4->SR & TIM_FLAG_Update) != SET); // 等到计数器减到0
TIM4-CR1 &= (~TIM_CR1_CEN); //关闭计数器
TIM4->SR &= ~TIM_FLAG_UpDate; // 清除定时器变为0的标志位
}
有了微秒延时,毫秒级延时就好办了:
void delay_ms(unsigned int nms)
{
delay_us(nms * 1000);
}
当然,定时器的初始化:注意,使用向下计数模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseI