您好，歡迎回來。 1
因此，在我們開始運行實驗本身之前，還有最後一件事要做。我們需要初始化一個 2
最後一件事。我們必須在此處為我們的系統添加時基。 3
因此，我們將使用systick計時器。 4
我們將進行設置，然後開始做 5
現在。 6
在我這樣做之前，我將通過將初始化代碼放在自己的代碼中來對其進行抽像一些 7
功能。我將在這裡創建一個函數，並將其稱為GPIO init和它的void函數。 8
我要做的是，將這兩行納入其中。我將把功能 9
頂部的原型。 10
然後可以調用該函數。 11
對。 12
因此這將為我們初始化GPIO，但我們也想在此處初始化時鐘並獲取系統 13
時鐘在相同的初始化函數中。 14
並且由於我們在CMSIS中使用了cortex M標準，因此我們可以使用CMSIS庫 15
或CMSIS API來訪問systick計時器，請記住systick計時器 16
是所有皮質微控制器上都存在的時基。 17
因此，無論您是否擁有ST微控制器 18
恩智浦 19
他們都有systick計時器 20
並且同一行代碼可以用來初始化它們 21
這就是使用CMSIS的美妙之處 22
所以我要去訪問一個稱為系統時鐘更新的函數 23
給我當前的系統時鐘。然後， 24
完成之後，我將使用另一個API（systick config API）配置systic計時器 25
我們可以像這樣單擊此處，然後進行定義。 26
如您所見，它存在於核心cm4點h中 27
在基於cortex M4的所有設置文件中都存在 28
這樣登 29
我可以在這裡調用此函數並將其除以100，因為我想將時間單位放入 30
秒。如果我希望時間以毫秒為單位，我會去 31
除以1000。因為 32
記住我們的時鐘在 33
兆赫範圍。 34
對。 35
So. 36
是的 37
這樣我們就可以啟用中斷，因為系統性是一個例外。 38
它使用中斷。 39
您必須啟用中斷，以使systick中斷併計時。不用擔心 40
這不是關於systick的教程 41
我們將比systick更深入 42
我們將使用系統計時器來設計調度程序。 43
因此，這只是您所知道的，只需設置良好的GPIO和快速計時器即可。只是運行實驗 44
向您展示內核運行時正在進行的更改。 45
所有這些甚至都沒有從內核開始。我正在嘗試逐步介紹GPIO 46
端口實際上已經初始化，並且正常程序，正常的閃爍程序如何產生。 47
然後，我們將其更進一步，最終我們進行了適當的實驗。 48
因此，我將啟用interrput，並且此其他功能也存在於cortex M核心文件中，因此 49
下劃線下劃線啟用 50
然後，此功能在此處啟用中斷。初始化GPIO時，我們將獲得系統時鐘更新， 51
我們也配置systic。 52
在我們知道已配置systic之後，太好了。 53
現在，我們必須創建一個函數，該函數將從systic中讀取讀數，並給我們帶來延遲。 54
接下來我要做的是首先在這裡創建一個volatile變量 55
叫tick。請記住，變量必須是易失性的，因為我們不希望編譯器對其進行優化 56
遠 57
易失性變量是無需代碼即可更改的變量。因此，一個經常訪問的變量 58
GPIO或中斷處理程序中存在的變量需要是易失性的，以便編譯器知道 59
該變量可以更改，而無需系統中的任何代碼實際更改它。 60
是的，所以我將其聲明為volatile 61
它的類型將是int 32下劃線t 62
我要打勾 63
是的，我要宣布另一個。 64
這將是下劃線。 65
對。 66
所以我要做的是在systick處理程序中，我將增加此變量。 67
因此，每當操縱桿中斷時，它將計算此變量，這將成為時鐘的滴答聲。 68
是的 69
所以我要做的就是調用systick處理程序 70
這也是皮質M中存在的標準功能。 71
讓我們將其稱為systic，下劃線處理程序，然後將其作廢。 72
我想在這裡做的就是...加上這樣的勾號。所以還有另一個功能 73
我們將要編寫的內容，將勾號，然後將其放入另一個變量中，然後使用此變量 74
我們將計算差值以獲得所需的延遲。 75
因此，如果您熟悉stm32 HAL，我將實際調用此函數獲取滴答聲，並實際調用此函數 76
蜜蜂 77
如果您檢入STM32 HAL文件，您會發現它們在此處具有類似的功能，稱為get 78
蜱。如果您運行stm32 HAL延遲 79
這與他們創建延遲的方法相同。 80
他們還使用了systick計時器，並且有一個類似的功能可以獲取刻度線，而另一個功能可以計算 81
區別。 82
他們有一個執行增量的標尺。所以我們在這裡打勾，我們必須將這段代碼放在 83
禁用中斷並啟用中斷，因為此行是關鍵部分。 84
這條線必須是原子的，它必須以原子的方式運行。 85
我們不希望在執行此行期間出現任何中斷。 86
請記住，這一行的執行不僅僅是一條指令。 87
如果將此行帶入編譯器並反彙編為彙編代碼，它將成為三條指令。 88
一條指令實際上必須讀取變量，另一條指令必須執行減量 89
最後一個必須將變量存儲回內存中。 90
所以這需要三個步驟，我們希望這三個步驟能夠 91
發生 92
連續地。我們不希望第一步 93
發生 94
然後出現中斷，然後中斷。那會產生所謂的競爭條件。 95
我們不想要那個。 96
當我們為我們的設計信號燈和標誌時，我們將更多地討論種族狀況 97
操作系統。這是很普通的事情。 98
所以一旦有了這個，我們就可以擁有我們的延遲功能，我稱之為延遲S，意思是延遲 99
秒，然後單元32下劃線t，然後它將採用一個參數，即秒數 100
所以我們要做的是。 101
我要接受這個參數，幾秒鐘，再乘以一百 102
然後從這裡獲取報價，將其存儲在變量中，然後計算差值 103
溫度 104
等於 105
在這裡打勾，延遲提醒功能只是浪費時間。 106
這意味著CPU週期應該只是您知道什麼都不做就運行。 107
因此，我們可以使用while循環來獲得延遲。 108
請記住，此功能以刻度數為單位。 109
刻度線的數量基於我想要的秒數，我必須將其乘以100 110
將其轉換回刻度線。 111
對。 112
就是這樣，我接下來要做的是 113
我將把這個函數的原型保存在那裡，以便我們可以在主文件中訪問它。 114
我會這樣留在這裡。 115
現在，當我來到這裡，我說延遲一秒鐘，我可以更改它 116
操作員更改為toogle操作員，以便可以切換所有LED的亮起和熄滅 117
接著 118
我們重建代碼，錯誤為零，然後下載到板上 119
如您所見，它現在正在閃爍。 120
它在閃爍，如果您使用示波器進行探測，您會意識到它在一次閃爍 121
第二。