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