這個定時器是倒數的,數字大的,功能少。
我找到了一段比我形象的解讀。

不管多復雜,都是這三個寄存器

可以看到是和TIM1的中斷重疊的,需要程序里面判斷

在NVIC里面確實是這樣的

這個是使能

Bit0就是管這個的

輸入模式是使用這個內置的這個時鐘

參數沒幾個,下面是時鐘進來太快,會分頻一下

其實就是配置這個結構體

GUI選好的

就把這個htim9傳給這個函數來啟動

這些是TIM可以傳入的定時器源,在這里

時鐘也OK

有著豐富的中斷事件

也就是這個圖里面最小的定時器部分,進來以后到CK_PSC,往后:

就是要這些事件

注意,HAL庫里面這個定時器的中斷沒有寫,需要自己寫上
開始運行以后,有事件產生,然后就可以編程控制了。

這些就是我們感興趣的中斷事件

在HAL庫

所有的回調函數,在這里都是弱定義

需要復制一個函數頭過來重新寫
每個回調函數在特定的定時器事件發生時被調用。
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
就是這里
HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef htim)HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef htim)HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef htim)HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef htim)HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef htim)HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef htim)HAL_TIM_TriggerCallback(TIM_HandleTypeDef htim)HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef htim)HAL_TIM_ErrorCallback(TIM_HandleTypeDef htim)
因為我們上面寫了,TIM1的中斷和9的在一起,所以要判斷

有點像Python里面的self的感覺

通過定時器 TIM9 的溢出事件,每 500ms 切換一次 GPIO 引腳的狀態。
如果寫程序的話,其實已經完美了。但是我們靠這個東西吃飯,那就需要繼續挖。

寄存器這些都沒有看見,怎么做到的?

這個函數

上面函數的返回值是這個的時候才證明可以繼續執行

確定上面OK,就是用一個宏打開我們感興趣的中斷

正是我們感興趣的

使用宏的效率更高

繼續看看這個初始化的函數


如果啟用了回調機制(USE_HAL_TIM_REGISTER_CALLBACKS == 1),則會使用回調函數來初始化硬件。
否則,直接調用 HAL_TIM_Base_MspInit 函數進行硬件初始化。
State?=?HAL_TIM_STATE_BUSY;在初始化過程中,定時器的狀態設置為 BUSY,表示當前正在執行初始化操作。

這行代碼是核心操作,它調用 TIM_Base_SetConfig 函數來配置定時器的基本設置,傳入定時器實例和定時器初始化參數(包括計數模式、周期、時鐘分頻等)。
以上就是初始化過程。
其實說了這么多,中斷的寄存器這部分還是沒有摸到。

在這里


函數核心在此
HAL_TIM_IRQHandler 是一個通用的中斷處理函數,處理與定時器相關的所有中斷事件。
它會根據不同的中斷標志來調用對應的回調函數,從而完成特定的任務,例如捕獲比較(input capture)、輸出比較(output compare)、PWM脈沖完成等。


如果定時器溢出或達到了自動重載值(即定時器周期),則會觸發更新事件,調用 PeriodElapsedCallback。
上面是回調,下面是非常細節的細節。
用于處理中斷標志 TIM_FLAG_UPDATE,它檢查是否發生了定時器的 更新事件(比如定時器溢出或者達到自動重載值)。當這種事件發生時,代碼會清除該中斷標志,并調用一個回調函數 PeriodElapsedCallback。

檢查定時器是否發生了 更新事件(如溢出或計數器到達自動重載值)。

確保 更新中斷 被使能(即相關的中斷被允許觸發)。

清除中斷標志,防止中斷重復觸發。

htim 是定時器句柄,包含定時器的配置和狀態。回調函數通過句柄傳遞,以便訪問和操作相關的定時器信息。
void (*PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim);
在這里
大概就是這樣了。