单片机
返回首页

STM32CubeMX自动生成SYSTICK配置

2019-06-17 来源:eefocus

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定时器亦将暂停运作。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章