×
单片机 > 单片机程序设计 > 详情

STM32CubeMX自动生成SYSTICK配置

发布时间:2020-06-01 发布时间:
|

1.SYSTICK原理及其寄存器


   1.1  SYSTICK原理


SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。


SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。


   1.2SYSTICK寄存器


  CTRL: Systick控制和状态寄存器 

  LOAD: Systick重装载寄存器 

  VAL: Systick当前值寄存器 

  CALIB: Systick校准值寄存器  



  CLKCOURCE-时钟源  0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M  1:内核时钟(HCLK) 72M 



     CURRENT: 每经过一个Systick时钟周期,寄存器值-1 。


2.STM32CubeMX配置与代码生成


如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。



 自动代码生成如下:


    /**Configure the Systick interrupt time */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000);   //  = /8/1000 :1000 is 1ms ;1000000 is 1us


    /**Configure the Systick */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);


  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);


 


3.相关重要的函数


  3.1中断处理函数


void SysTick_Handler(void)

{

  /* USER CODE BEGIN SysTick_IRQn 0 */


  /* USER CODE END SysTick_IRQn 0 */

  HAL_IncTick();

  HAL_SYSTICK_IRQHandler();

  /* USER CODE BEGIN SysTick_IRQn 1 */


  /* USER CODE END SysTick_IRQn 1 */

}


__IO uint32_t uwTick;


__weak void HAL_IncTick(void)

{

  uwTick += uwTickFreq;

}


每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。由于uwTick是                                               无符号32位整型数,所以根据C语言的定义,当累计到0xFFFFFFFF后,再加1等于0。


  3.2 延时函数


__weak void HAL_Delay(uint32_t Delay)

{

  uint32_t tickstart = HAL_GetTick();

  uint32_t wait = Delay;


  /* Add a freq to guarantee minimum wait */

  if (wait < HAL_MAX_DELAY)

  {

    wait += (uint32_t)(uwTickFreq);

  }


  while ((HAL_GetTick() - tickstart) < wait)

  {

  }

}


__weak uint32_t HAL_GetTick(void)

{

  return uwTick;

}


由于tickstart和HAL_GetTick()的返回值都是无符号32位整型,所以HAL_GetTick() - tickstart                                                  =HAL_GetTick() + (~ tickstart) ,如果tickstart > HAL_GetTick(),也可以计算出两者之间正确的差值。


 


4.注意事项


1.Systick的中断函数一定要在STM32CubeMX中设置自动生成出来;


2.由于Systick中断每次累加值uwTickFreq是在stm32f1xx_hal.c定义,且默认是1U(以1kHz为默认频率)。而Systick配置函数是在stm32f1xx_hal_cortex.c和core_cm3.h定义,各自完全独立。因此,如果Systck配置频率不是1kHz时,需要利用stm32f1xx_hal.c的HAL_SetTickFreq()函数重新配置累计值uwTickFreq;


3.当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式