stm32f429學習記錄

Sun_Shine_999發表於2018-04-21

1.串列埠uart包含三個知識點:
(1)物理層(電氣層:介面決定
(2)資料格式(資料層:晶片決定)
(3)通訊協議(協議層:程式決定,)


**HAL庫中中斷呼叫流程大體相似:啟動檔案中定義了中斷向量表,包含了各個中斷服務函式,然後中斷服務函式中呼叫hal中斷函式,然後hal中斷函式再呼叫相關的回撥函式,也就是使用者需要編寫的函式。
除此之外對於外設結構體的定義也有共性。首先是一個XXX_HandleTypeDef的型別,可以定義外設控制程式碼的結構體,其包含所用外設暫存器的基地址XXX_TypeDef *,然後是初始化結構體 _InitTypeDef ,還有_LockTypeDef LOCK,和__IO HAL_IWDG_StateTypeDef State這兩個幾乎每個控制程式碼結構體都有,還有其他各自的成員
掌握了這兩點對於hal庫的學習會很有幫助。**

2.串列埠中斷(接受)呼叫過程:
這裡寫圖片描述

經過上面6個步驟,我們就可以寫完整的串列埠接收實驗。我們就可以在中斷服務函式中編寫中斷處理過程。
HAL庫提供了詳細的中斷處理函式HAL_UART_IRQHandler
我們在中斷服務函式中會呼叫此函式處理中斷。
這裡寫圖片描述
這裡寫圖片描述

總結:
(1)串列埠中斷服務函式USARTx_IRQHandler中呼叫HAL庫串列埠中斷通用處理函式:
HAL_UART_IRQHandler();
該函式會對中斷來源進行分析,呼叫相應函式,如接受,傳送等函式。
(2)而此函式最終會呼叫相應的回撥函式,也就是需要我們真正編寫的中斷函式。

3.外部中斷函式呼叫過程:
這裡寫圖片描述
和串列埠中斷 流程相似:
void EXTI0_IRQHandler(void) //中斷服務函式,在啟動檔案,中斷向量表定義
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//呼叫中斷處理公用函式
}
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);//回撥函式
}
}

4.獨立看門狗

所謂看門狗就是微控制器內部檢測程式是否正常執行的模組或者晶片,一般是一個帶計數器的模組,它一直倒計數固定時間(時間由頻率和過載值決定),在計數到零之前要喂狗(即給暫存器寫固定值),否則會產生復位,使程式重新執行。

操作步驟:
(1)初始化看門狗:預分頻係數,重灌載值。
HAL_IWDG_Init();
該函式在操作PR和RLR暫存器之前會取消
防寫。
(2)啟動看門狗
HAL_IWDG_Start();
(3) 喂狗:
HAL_IWDG_Refresh();

5.視窗看門狗

之所以稱為視窗就是因為其喂狗時間是一個有上下限的範圍內(視窗),你可以通過設定相關暫存器,設定其上限時間(下限固定)。喂狗的時間不能過早也不能過晚。

為什麼要視窗看門狗?
對於一般的看門狗,程式可以在它產生復位前的任意時刻重新整理看門狗,但這有一個隱患,有可能程式跑亂了又跑回到正常的地方,或跑亂的程式正好執行了重新整理看門狗操作,這樣的情況下一般的看門狗就檢測不出來了;
如果使用視窗看門狗,程式設計師可以根據程式正常執行的時間設定重新整理看門狗的一個時間視窗,保證不會提前重新整理看門狗也不會滯後重新整理看門狗,這樣可以檢測出程式沒有按照正常的路徑執行非正常地跳過了某些程式段的情況

5.通用定時器

1.定時中斷功能
① 初始化定時器,配置ARR,PSC。
HAL_TIM_Base_Init();
② 使能定時器時鐘。
__HAL_RCC_TIM3_CLK_ENABLE();
③ 開啟定時器/中斷。
HAL_TIM_Base_Start();
HAL_TIM_Base_Start_IT();//使能定時器中斷並開啟更新中斷。
④ 設定中斷優先順序。
HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();
⑤ 編寫中斷服務函式。
TIMx_IRQHandler();//中斷服務函式
HAL_TIM_IRQHandler();//中斷處理入口函式
HAL_TIM_PeriodElapsedCallback();//定時器更新中斷回撥函式

Tout(溢位時間)=(ARR+1)(PSC+1)/Tclk

在規範的寫法中應該在MSPInit和callback中判斷是哪個具體的外設,因為這些外設是公用這兩個函式的
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn,1,3);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
}

void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
LED1=!LED1;
}
}