HAL——學習SysTick


開始:

1.嵌套向量中斷寄存器 (NVIC):

嵌套向量中斷控制器 (NVIC) 和處理器內核接口緊密配合,可以實現低延遲的中斷處理和晚到中斷的高效處理。包括內核異常在內的所有中斷均通過 NVIC 進行管理。
在CMSIS\Include\core_cm4.h頭文件中,給出了NVIC結構體以及一些基本函數。
詳細介紹以及寄存器、基層配置查詢參考資料ST-《Cortex™-M4內核編程手冊》


2.外部中斷/事件控制器 (EXTI):
外部中斷/事件控制器包含多達 23 個用於產生事件/中斷請求的邊沿檢測器。每根輸入線都可單獨進行配置,以選擇類型(中斷或事件)和相應的觸發事件(上升沿觸發、下降沿觸發或邊沿觸發)。每根輸入線還可單獨屏蔽。掛起寄存器用於保持中斷請求的狀態線
在CMSIS\Device\ST\STM32F4xx\Include 芯片對應的頭文件中,定義了IRQn_Type枚舉體,包含了F4系列全部異常聲明以及其編號 (編號在中斷編程中起到了標識的作用)
詳細介紹參考資料ST-《STM32F4xx中文參考手冊》,更為詳細的教程參閱《零死角玩轉STM32-F429》[16.STM32中斷應用概覽,17.EXTI-外部中斷]


3.HAL_Init()
此函數用來初始化HAL庫,應當作為主函數中第一個被調用的函數。其主要功能:
1.配置FLASH預取,指令以及Data緩存
2.配置好SysTick,使其每1ms產生一次中斷
3.設置NVIC優先級分組為第四組(主優先級[0~15],子優先級[0])
4.調用回調函數 HAL_MspInit() 來進行全局低級硬件初始化(MSP:MCU Support Package).
詳細代碼實現參考文件stm32f4xx_hal.c


4.HAL_Delay(__IO uint32_t Delay )
 此函數為HAL庫中定義的延遲函數,使用前需開啟SysTick。
通過調用 HAL_GetTick() 函數獲取時間,若未達到時間,則在一死循環內。
HAL_GetTick() 返回一個HAL庫中變量 uwTick (static __IO uint32_t uwTick)。
為了使 uwTick 變量在每進行一次SysTick中斷時自增,需在SysTick_Handler() 中調用 HAL_IncTick()。
HAL_IncTick() 是一個WEAK定義的函數,默認是使每被調用一次便讓uwTick 自增1.
詳細代碼實現參考文件stm32f4xx_hal.c

 

補充:
  1.產生中斷后,程序自動跳轉到相應中斷處理函數 ( 例如SysTick計時到點后則跳轉到SysTick_Handler() 中斷函數中),在用戶未自行定義的情況下,默認進入由啟動文件匯編語言編寫的同名稱死循環內。

2.SysTick被用作 HAL_Delay() 的時間基准,若要使其運算ms延時精確,需保證SysTick設置為1ms

3.在HAL庫中,沒有了NVIC以及EXTI的初始化結構體函數,而是將EXTI的初始化設置歸納在GPIO_InitTypeDef 結構體中。在該結構體的Mode中,可設置某GPIO為中斷或者事件。中斷 (IT) 與事件 (EVT)都各有三種可選模式。

4.HAL_GPIO_Init 函數起到了引腳參數設置以及中斷/事件的基層配置,用戶使用后需要進行NVIC的對應中斷優先級設置以及使能。詳細代碼參考stm32f4xx_hal_gpio.c

5.HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority ) , 函數進行對應IRQn中斷的 主優先級(PreemptPriority) 以及 子優先級(SubPriority) 配置。
IRQn參考在 CMSIS\Device\ST\STM32F4xx\Include 芯片對應的頭文件中,IRQn_Type枚舉體中的所需的枚舉量
主優先級與子優先級可設置范圍由優先級組決定,HAL_NVIC_SetPriorityGrouping() 可對優先級組進行配置
注意,調用 HAL_Init() 后,則已經設置好優先級組為Group4.


流程:
中斷:
   某中斷產生后,進入對應中斷函數 ( 例如SysTick計時到點后,進入其對應 SysTick_Handler() 中斷函數中)
自實現(定義)對應中斷函數,若為外部中斷則一般在該中斷函數中調用 HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 函數,該函數中進行判斷看中斷掛起寄存器上對應GPIO_Pin 位上是否被置1(發生了中斷)。若有,則調用一個WEAK函數HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin), 用戶一般在該回調函數中進行自己中斷配置操作。


SysTick延時:
   SysTick計時到點后,產生中斷,跳轉到SysTick_Handler() 中斷函數中。
在自實現的該中斷函數中,調用 HAL_IncTick() 使得uwTick 變量自增
使用 HAL_Delay() 或類似自定義的延遲函數進行延遲

實現:
中斷:
   配置GPIO(Pin、Mode[中斷/事件]、無上拉)
開啟對應GPIO時鍾,使用 HAL_GPIO_Init() 進行初始化
HAL_NVIC_SetPriority(IRQn,PreemptPriority,SubPriority )//設置對應中斷優先級
HAL_NVIC_EnableIRQ(IRQn )//使能對應中斷,參數IRQn同參考 IRQn_Type 枚舉體

GPIO_InitTypeDef s_GPIO;
s_GPIO.Pin = EXTIGPIO_PIN;
s_GPIO.Mode = GPIO_MODE_IT_XXXXXX;
s_GPIO.Pull = GPIO_NOPULL;

EXTIGPIO_CLK_ENABLE(); //使能時鍾

HAL_GPIO_Init(EXTIGPIO_PIN,&s_GPIO);

HAL_NVIC_SetPriority(EXTIx_IRQn,i,j);//EXTIx_IRQn 參考IRQn編號 i-主優先級 j-子優先級
HAL_NVIC_EnableIRQ(EXTIx_IRQn);

將將要用到的中斷函數進行自實現
void EXTIx_IRQHandler()
{
HAL_GPIO_EXTI_IRQHandler(EXTIGPIO_PIN);
}

定義回調函數HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//TODO:自己的代碼
}


SysTick延時:
   HAL_Init()已經開啟了SysTick,使其每1ms產生一次中斷
自實現SysTick中斷函數 SysTick_Handler() ,在該函數內調用HAL_IncTick( )使 uwTick 變量自增
void SysTick_Handler()
{
HAL_IncTick();
}

在需要ms延遲的地方調用HAL_Delay函數進行延遲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM