2.Systick 系统定时器

发布时间 2023-06-27 15:35:49作者: 面筋玄师

-系统定时器一般用于单片机操作系统产生时间,维持OS的心跳和实现任务分时调度等。

-中断向量表中有个专属的Systick_Handler

-Systick是24位的向下递减的计数器,时钟源每来一个时钟,其值就会减一。一般将Systick的时钟源设置为系统时钟,当计数器值减为0时,系统定时器就会产生一次终端,之后CPU循环往复重新装载计数器实现循环

-可以选择外部或者内部的时钟源,cpu上电首先默认使用MSI时钟源

 

通过Systick实现毫秒级别延时:

思路:如果想要实现一毫秒的计时,32mHZ情况下,把LOAD寄存器的值设置为32000(32m/32000 = 0.001s)

 

stm32L433中除了通用的Systick定时器,还有6个定时器,1,2,6,7,15,16; TIM6/TIM7是两个16位自装载基本定时器,只能用于定时;其余的还能作PWM输出

实现延时的大致思路:时钟源——>预分频——>装载寄存器(reload)

 

 

 


微秒级别的延时使用中断方式会频繁打断CPU正常执行程序,因此不使用中断模式

在tim.c中定义函数

/* USER CODE BEGIN 1 */
void delay_us(uint16_t us)
{
	/*中断会打断微秒延时函数但是计数器计数不会停止,防止计数器增加到最大值后重新开始计数*/

  uint16_t differ = 60000-us; //tim616位最大到65535,这里定义us级别延时最大到60000 __HAL_TIM_SET_COUNTER(&htim6,differ); //设置counter值 HAL_TIM_Base_Start(&htim6); //开启TIM6 while(differ < 60000) { differ = __HAL_TIM_GET_COUNTER(&htim6); } HAL_TIM_Base_Stop(&htim6); } /* USER CODE END 1 */

  

main函数测试:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  int i = 0;
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,RESET);
	  do
	  {
		  delay_us(1000);
		  i++;
	  }while(i<1000);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,SET);

	  for(i =0;i<1000;i++)
		  delay_us(1000);

  }

  以上能够实现每隔1s的熄灭能有1s的亮灯