小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

STM32CubeMX自動(dòng)生成SYSTICK配置

 Allen 圖書(shū)館 2019-06-17

1.SYSTICK原理及其寄存器

   1.1  SYSTICK原理

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

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

 

   1.2SYSTICK寄存器

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

è?é?????è?°

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

è?é?????è?°

è?é?????è?°

     CURRENT: 每經(jīng)過(guò)一個(gè)Systick時(shí)鐘周期,寄存器值-1 。

è?é?????è?°

 

2.STM32CubeMX配置與代碼生成

如下圖STM32CubeMX配置所示,圖中To Cortex System timer(MHz)就是Systick的時(shí)鐘頻率。

 自動(dòng)代碼生成如下:

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

  3.2 延時(shí)函數(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()的返回值都是無(wú)符號(hào)32位整型,所以HAL_GetTick() - tickstart                                                  =HAL_GetTick() + (~ tickstart) ,如果tickstart > HAL_GetTick(),也可以計(jì)算出兩者之間正確的差值。

 

4.注意事項(xiàng)

1.Systick的中斷函數(shù)一定要在STM32CubeMX中設(shè)置自動(dòng)生成出來(lái);

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

3.當(dāng)處理器在調(diào)試期間被喊停(halt)時(shí),則SysTick定時(shí)器亦將暫停運(yùn)作。

 

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多