STM32 HAL库学习系列第3篇 常使用的几种延时方式

1   自带的hal_delay 函数    毫秒级延迟

 

 1 void HAL_Delay(__IO uint32_t Delay)
 2 {
 3   uint32_t tickstart = HAL_GetTick(); //获取tick值(毫秒)
 4   uint32_t wait = Delay;
 5  
 6   /* Add a period to guarantee minimum wait */
 7   if (wait < HAL_MAX_DELAY)
 8   {
 9      wait++;//传参,延时的时间
10   }
11  
12   while((HAL_GetTick() - tickstart) < wait)
13   {
14   }
15 }

 

也可以配置为us延时,改变函数参数

配置方法:也可以配置为1us

1 // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次,即HAL_Delay函数延时基准为1ms
2 // HAL_RCC_GetHCLKFreq()/100000  10us中断一次,即HAL_Delay函数延时基准为10us
3 // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1us
4 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);  // 配置并启动系统滴答定时器

2 中断延时----利用定时器计时

 1 int main(void)
 2 {
 3   HAL_Init();
 4   SystemClock_Config();
 5   LED_GPIO_Init();
 6   /* 基本定时器初始化:1ms中断一次 */
 7   BASIC_TIMx_Init();
 8   /* 在中断模式下启动定时器 */
 9   HAL_TIM_Base_Start_IT(&htimx);
10  
11   while (1)
12   {
13     if(timer_count==1000)
14     {
15       timer_count=0;
16       LED1_TOGGLE;
17     }
18   }
19 }
20  
21 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
22 {
23   timer_count++;  //回调函数
24 }

3 优选方式------获取系统时钟计时,非阻塞式延时

 1  void delay_ms(int32_t nms) 
 2  {
 3   int32_t temp; 
 4   SysTick->LOAD = 8000*nms; 
 5   SysTick->VAL=0X00;//清空计数器 
 6   SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 
 7   do 
 8   { 
 9        temp=SysTick->CTRL;//读取当前倒计数值 
10   }
11      while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 
12      
13      SysTick->CTRL=0x00; //关闭计数器 
14      SysTick->VAL =0X00; //清空计数器 
15  } 

 

posted @ 2019-03-27 21:33  CodeAllen  阅读(9909)  评论(0编辑  收藏  举报