日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

STM32CubeMX自動生成SYSTICK配置

 Allen 圖書館 2019-06-17

1.SYSTICK原理及其寄存器

   1.1  SYSTICK原理

SysTick 是一個24位的倒計數(shù)定時器,當計到0時,將從RELOAD寄存器中自動重裝載定時初值并繼續(xù)計數(shù),且同時觸發(fā)中斷。只要不把它在SysTick控制及狀態(tài)寄存器中的使能位清除,就永不停息。

SysTick 的最大使命,就是定期地產(chǎn)生異常請求,作為系統(tǒng)的時基,產(chǎn)生一個周期性的中斷。

 

   1.2SYSTICK寄存器

  CTRL: Systick控制和狀態(tài)寄存器 
  LOAD: Systick重裝載寄存器 
  VAL: Systick當前值寄存器 
  CALIB: Systick校準值寄存器  

è?é?????è?°

  CLKCOURCE-時鐘源  0:外部時鐘源HCLK(AHB總線時鐘)/8 72M/8 = 9M  1:內(nèi)核時鐘(HCLK) 72M 

è?é?????è?°

è?é?????è?°

     CURRENT: 每經(jīng)過一個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.相關(guān)重要的函數(shù)

  3.1中斷處理函數(shù)

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異常中斷后,會執(zhí)行SysTick_Handler() 函數(shù),然后HAL_IncTick()函數(shù)。由于uwTick是                                               無符號32位整型數(shù),所以根據(jù)C語言的定義,當累計到0xFFFFFFFF后,再加1等于0。

  3.2 延時函數(shù)

__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的中斷函數(shù)一定要在STM32CubeMX中設置自動生成出來;

2.由于Systick中斷每次累加值uwTickFreq是在stm32f1xx_hal.c定義,且默認是1U(以1kHz為默認頻率)。而Systick配置函數(shù)是在stm32f1xx_hal_cortex.c和core_cm3.h定義,各自完全獨立。因此,如果Systck配置頻率不是1kHz時,需要利用stm32f1xx_hal.c的HAL_SetTickFreq()函數(shù)重新配置累計值uwTickFreq;

3.當處理器在調(diào)試期間被喊停(halt)時,則SysTick定時器亦將暫停運作。

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多