0
1
00:00:02,760 --> 00:00:04,480
Xin chào, chào mừng trở lại.
1

2
00:00:04,530 --> 00:00:10,490
Vì vậy, có một điều cuối cùng phải làm trước khi chúng tôi bắt đầu chạy thử nghiệm. Chúng ta cần khởi tạo một
2

3
00:00:10,500 --> 00:00:15,420
thứ cuối cùng. Chúng tôi phải thêm một cơ sở thời gian cho hệ thống của chúng tôi ở đây.
3

4
00:00:15,450 --> 00:00:17,690
Vì vậy, chúng tôi sẽ sử dụng bộ đếm thời gian systick.
4

5
00:00:18,160 --> 00:00:21,810
Chúng tôi sẽ thiết lập nó và hãy bắt đầu làm điều đó
5

6
00:00:21,810 --> 00:00:22,390
hiện nay.
6

7
00:00:22,560 --> 00:00:29,280
Trước khi tôi làm điều đó, tôi sẽ chỉ trừu tượng hóa điều này một chút bằng cách đặt mã khởi tạo vào chính nó
7

8
00:00:29,280 --> 00:00:41,810
chức năng. Tôi sẽ tạo một hàm ở đây và gọi nó là GPIO init và hàm void-void.
8

9
00:00:42,720 --> 00:00:52,200
Những gì tôi sẽ làm là, tôi sẽ mang hai dòng này vào đó. Và tôi sẽ đặt chức năng
9

10
00:00:52,200 --> 00:00:53,690
nguyên mẫu ở phía trên.
10

11
00:00:59,130 --> 00:01:06,440
Sau đó, chức năng có thể được gọi.
11

12
00:01:07,020 --> 00:01:07,790
Đúng.
12

13
00:01:08,100 --> 00:01:14,370
Vì vậy, điều này sẽ khởi tạo GPIO của chúng tôi cho chúng tôi nhưng chúng tôi cũng muốn khởi tạo đồng hồ ở đây và có được một hệ thống
13

14
00:01:14,400 --> 00:01:17,460
đồng hồ trong cùng một chức năng init.
14

15
00:01:17,520 --> 00:01:25,860
Và bởi vì chúng tôi đang sử dụng tiêu chuẩn vỏ não M với CMSIS, nên chúng tôi có thể sử dụng danh sách CMSIS
15

16
00:01:25,860 --> 00:01:31,530
hoặc API CMSIS để truy cập bộ đếm thời gian systick, hãy nhớ bộ đếm thời gian systick
16

17
00:01:31,590 --> 00:01:36,150
là một cơ sở thời gian tồn tại trên tất cả các bộ vi điều khiển vỏ não.
17

18
00:01:36,290 --> 00:01:39,090
Vì vậy, cho dù bạn có vi điều khiển ST
18

19
00:01:39,230 --> 00:01:40,080
THEN, NXP
19

20
00:01:40,110 --> 00:01:41,620
tất cả họ đều có bộ đếm thời gian
20

21
00:01:41,630 --> 00:01:46,050
và cùng một dòng mã có thể được sử dụng để khởi tạo chúng
21

22
00:01:46,080 --> 00:01:49,260
Đây là nét đẹp của việc sử dụng CMSIS
22

23
00:01:49,500 --> 00:01:55,950
Vì vậy, tôi sẽ truy cập một chức năng được gọi là cập nhật đồng hồ hệ thống và nó sẽ hoạt động
23

24
00:01:55,950 --> 00:01:59,640
để cho tôi đồng hồ hệ thống hiện tại. Và sau đó,
24

25
00:01:59,880 --> 00:02:07,350
sau khi hoàn thành, tôi sẽ định cấu hình bộ đếm thời gian tâm thu với một API khác, API cấu hình systick
25

26
00:02:07,620 --> 00:02:12,330
chúng ta chỉ có thể nhấp vào đây như thế này và sau đó đi đến định nghĩa.
26

27
00:02:12,420 --> 00:02:15,240
Và như bạn có thể thấy nó tồn tại trong lõi cm4 dot h
27

28
00:02:15,270 --> 00:02:21,050
Điều này tồn tại trong tất cả các tập tin thiết lập cho cortex M4 dựa
28

29
00:02:21,270 --> 00:02:22,370
Ban như vậy
29

30
00:02:22,650 --> 00:02:28,560
Tôi chỉ có thể gọi hàm này và chia cho 100 ở đây vì tôi muốn đặt đơn vị thời gian vào
30

31
00:02:28,560 --> 00:02:35,380
giây Nếu tôi muốn thời gian tính bằng đơn vị mili giây tôi sẽ đi
31

32
00:02:35,490 --> 00:02:37,320
chia cho 1000. Bởi vì
32

33
00:02:37,320 --> 00:02:39,870
hãy nhớ rằng đồng hồ của chúng tôi đang chạy trong
33

34
00:02:40,150 --> 00:02:42,610
phạm vi megahertz.
34

35
00:02:42,820 --> 00:02:43,380
Đúng.
35

36
00:02:43,390 --> 00:02:44,110
So.
36

37
00:02:44,320 --> 00:02:44,560
Vâng.
37

38
00:02:44,680 --> 00:02:50,260
Với điều này sau đó chúng ta có thể kích hoạt gián đoạn gây ra tâm thu là một ngoại lệ.
38

39
00:02:50,260 --> 00:02:51,720
Nó sử dụng ngắt.
39

40
00:02:51,880 --> 00:02:57,190
Bạn phải kích hoạt các ngắt để cho phép hệ thống bị gián đoạn và đếm thời gian. Và đừng lo lắng
40

41
00:02:57,190 --> 00:02:59,450
đây không phải là một hướng dẫn về systick
41

42
00:02:59,500 --> 00:03:01,820
Chúng ta sẽ đi sâu hơn so với tâm thu
42

43
00:03:02,050 --> 00:03:05,720
Chúng tôi sẽ thiết kế lịch trình của chúng tôi bằng cách sử dụng bộ đếm thời gian hệ thống.
43

44
00:03:05,740 --> 00:03:12,010
Vì vậy, đây chỉ là để bạn biết chỉ cần thiết lập GPIO tốt và hẹn giờ nhanh. Để chạy thử nghiệm chỉ
44

45
00:03:12,010 --> 00:03:16,050
để hiển thị cho bạn những thay đổi diễn ra khi kernel đang chạy.
45

46
00:03:16,240 --> 00:03:21,800
Tất cả điều này trong khi chúng ta thậm chí không bắt đầu với kernel. Tôi đang cố gắng thực hiện từng bước để cho bạn thấy GPIO như thế nào
46

47
00:03:21,940 --> 00:03:28,770
các cổng thực sự được khởi tạo và làm thế nào các chương trình bình thường, các chương trình blinky bình thường xuất hiện.
47

48
00:03:28,840 --> 00:03:34,260
Sau đó, chúng tôi tiến thêm một bước và cuối cùng chúng tôi chạy thử nghiệm thích hợp của mình.
48

49
00:03:34,300 --> 00:03:41,210
Vì vậy, tôi sẽ kích hoạt tính năng xen kẽ và chức năng khác này cũng tồn tại trong tệp lõi của vỏ não M vì vậy nó
49

50
00:03:41,220 --> 00:03:43,060
gạch dưới gạch dưới cho phép
50

51
00:03:43,560 --> 00:03:50,920
Và sau đó chức năng này ở đây cho phép ngắt. Khi chúng tôi khởi tạo GPIO, chúng tôi nhận được cập nhật đồng hồ hệ thống và
51

52
00:03:50,920 --> 00:03:52,680
chúng tôi cấu hình hệ thống là tốt.
52

53
00:03:52,840 --> 00:03:56,220
Rất tốt sau khi chúng tôi biết rằng chúng tôi đã cấu hình hệ thống.
53

54
00:03:56,350 --> 00:04:02,740
Bây giờ chúng ta phải tạo ra chức năng lấy các bài đọc từ hệ thống và tạo độ trễ cho chúng ta.
54

55
00:04:02,740 --> 00:04:11,180
Và điều tôi sẽ làm tiếp theo là trước tiên tôi sẽ tạo ra một biến số dễ bay hơi ở đây mà tôi sẽ
55

56
00:04:11,180 --> 00:04:19,790
để gọi tick. Hãy nhớ rằng biến phải biến động vì chúng tôi không muốn trình biên dịch sắp xếp tối ưu hóa nó
56

57
00:04:19,790 --> 00:04:20,450
xa
57

58
00:04:20,750 --> 00:04:27,290
Và các biến dễ bay hơi là các biến thay đổi mà không cần mã thay đổi. Vì vậy, một biến thường truy cập
58

59
00:04:27,290 --> 00:04:34,700
GPIO hoặc một biến tồn tại trong một trình xử lý ngắt cần phải biến động để trình biên dịch biết
59

60
00:04:34,700 --> 00:04:39,680
rằng biến này có thể thay đổi mà không có bất kỳ mã nào trong hệ thống thực sự thay đổi nó.
60

61
00:04:39,920 --> 00:04:42,750
Vâng, vì vậy tôi sẽ tuyên bố điều này là không ổn định
61

62
00:04:42,850 --> 00:04:46,700
và nó sẽ thuộc kiểu int 32 gạch dưới
62

63
00:04:47,660 --> 00:04:51,060
Tôi sẽ gọi tick
63

64
00:04:51,310 --> 00:04:53,480
Vâng, tôi sẽ tuyên bố một cái khác.
64

65
00:04:58,250 --> 00:05:00,450
Điều này sẽ được đánh dấu gạch dưới.
65

66
00:05:01,280 --> 00:05:02,030
Đúng.
66

67
00:05:02,060 --> 00:05:06,820
Vì vậy, những gì tôi sẽ làm là trong trình xử lý systick, tôi sẽ tăng biến này.
67

68
00:05:06,910 --> 00:05:13,590
Vì vậy, bất cứ khi nào hệ thống bị gián đoạn, nó sẽ đếm biến này và đây sẽ là tiếng tích tắc của đồng hồ.
68

69
00:05:13,770 --> 00:05:14,440
Vâng.
69

70
00:05:14,800 --> 00:05:18,780
Vì vậy, những gì tôi sẽ làm là gọi trình xử lý systick
70

71
00:05:19,240 --> 00:05:23,430
Và đây cũng là một chức năng tiêu chuẩn tồn tại trong vỏ não M.
71

72
00:05:23,470 --> 00:05:32,540
Chúng ta hãy gọi nó là systic, xử lý gạch dưới và sau đó là void.
72

73
00:05:33,300 --> 00:05:43,790
Điều tôi muốn làm ở đây là ... cộng với tích tắc như thế này. Vì vậy, sau đó có một chức năng khác
73

74
00:05:44,460 --> 00:05:52,920
rằng chúng ta sẽ viết, sẽ đánh dấu và sau đó đặt nó vào một biến khác và sau đó với biến này
74

75
00:05:52,960 --> 00:05:58,300
chúng ta sẽ tính toán sự khác biệt để có được độ trễ mà chúng ta muốn.
75

76
00:05:58,320 --> 00:06:05,040
Vì vậy, tôi sẽ gọi hàm này là tick và hàm này thực sự nếu bạn quen với stm32 HAL
76

77
00:06:05,080 --> 00:06:07,610
API
77

78
00:06:07,650 --> 00:06:13,560
nếu bạn kiểm tra các tệp STM32 HAL, bạn sẽ thấy rằng chúng có một chức năng tương tự ở đây được gọi là get
78

79
00:06:13,590 --> 00:06:16,900
đánh dấu Nếu bạn chạy chậm stm32 HAL
79

80
00:06:17,010 --> 00:06:19,940
đó là cùng một phương pháp mà họ sử dụng để tạo ra sự chậm trễ của họ.
80

81
00:06:19,940 --> 00:06:27,360
Họ cũng sử dụng bộ đếm thời gian systick và họ đã có một chức năng tương tự là đánh dấu và một chức năng khác tính toán
81

82
00:06:27,360 --> 00:06:27,950
Sự khác biệt.
82

83
00:06:27,960 --> 00:06:36,090
Và họ đã có một hệ thống tăng dần. Vì vậy, chúng tôi nhận được một đánh dấu ở đây và chúng tôi phải đặt mã này ở đây giữa
83

84
00:06:36,090 --> 00:06:42,560
vô hiệu hóa ngắt và kích hoạt ngắt vì dòng này là phần được gọi là phần quan trọng.
84

85
00:06:42,570 --> 00:06:46,410
Dòng này phải là nguyên tử, nó phải chạy theo kiểu nguyên tử.
85

86
00:06:46,410 --> 00:06:51,890
Chúng tôi không muốn bất kỳ sự gián đoạn nào đến và làm gián đoạn trong quá trình thực hiện dòng này.
86

87
00:06:51,960 --> 00:06:56,290
Hãy nhớ việc thực hiện dòng này không chỉ là một hướng dẫn.
87

88
00:06:56,310 --> 00:07:04,600
Nếu dòng này được đưa vào trình biên dịch và phân tách thành mã lắp ráp, nó trở thành ba hướng dẫn.
88

89
00:07:04,620 --> 00:07:09,470
Một lệnh thực sự phải đọc biến khác, một lệnh khác phải thực hiện giảm dần
89

90
00:07:09,480 --> 00:07:12,350
và cái cuối cùng phải lưu trữ biến trở lại vào bộ nhớ.
90

91
00:07:12,450 --> 00:07:16,190
Vì vậy, phải mất ba bước và chúng tôi muốn ba bước này để
91

92
00:07:16,300 --> 00:07:16,700
xảy ra
92

93
00:07:16,710 --> 00:07:19,370
tiếp giáp nhau Chúng tôi không muốn bước 1 đến
93

94
00:07:19,380 --> 00:07:19,740
xảy ra
94

95
00:07:19,760 --> 00:07:25,970
và sau đó một ngắt đến và sau đó nó ngắt. Điều đó sẽ tạo ra cái được gọi là điều kiện chủng tộc.
95

96
00:07:26,040 --> 00:07:27,060
Chúng tôi không muốn điều đó.
96

97
00:07:27,330 --> 00:07:32,730
Và chúng ta sẽ nói nhiều hơn về điều kiện cuộc đua khi chúng ta thiết kế các biểu tượng và cờ cho
97

98
00:07:32,810 --> 00:07:35,150
HĐH. Đó là một điều rất phổ biến.
98

99
00:07:35,460 --> 00:07:44,660
Vì vậy, một khi chúng ta đã có được điều này thì chúng ta có thể có chức năng trì hoãn của mình, tôi sẽ gọi nó là trì hoãn S, nghĩa là trì hoãn
99

100
00:07:44,730 --> 00:07:51,990
giây và sau đó đơn vị 32 gạch dưới t và sau đó nó sẽ lấy một đối số là số giây
100

101
00:07:52,560 --> 00:07:53,660
Vì vậy, những gì chúng ta sẽ làm là.
101

102
00:07:53,700 --> 00:07:58,380
Tôi sẽ đưa ra lập luận này, vài giây và nhân nó với một trăm
102

103
00:08:01,460 --> 00:08:11,340
và sau đó chúng ta sẽ đánh dấu vào đây, lưu trữ nó trong một biến và sau đó tính toán sự khác biệt
103

104
00:08:12,030 --> 00:08:13,720
tạm thời
104

105
00:08:18,110 --> 00:08:18,630
bằng
105

106
00:08:22,410 --> 00:08:27,580
đánh dấu vào đây, các chức năng trì hoãn của người gửi chỉ là một sự lãng phí thời gian.
106

107
00:08:27,580 --> 00:08:32,790
Nó có nghĩa là chu kỳ CPU chỉ là bạn biết chạy mà không làm gì cả.
107

108
00:08:32,970 --> 00:08:37,340
Vì vậy, chúng ta có thể sử dụng một vòng lặp while như thế này để có được độ trễ.
108

109
00:08:37,410 --> 00:08:41,770
Hãy nhớ chức năng này hoạt động theo đơn vị số lượng bọ ve.
109

110
00:08:41,850 --> 00:08:47,910
Số lượng systick cung cấp dựa trên số giây tôi muốn, tôi phải nhân nó với hàng trăm đến
110

111
00:08:47,910 --> 00:08:50,260
chuyển đổi nó trở lại thành tick.
111

112
00:08:50,370 --> 00:08:50,780
Đúng.
112

113
00:08:50,820 --> 00:08:53,170
Vì vậy, đây là nó, những gì tôi sẽ làm tiếp theo là
113

114
00:08:53,250 --> 00:08:58,890
Tôi sẽ giữ nguyên mẫu của chức năng này ở đó để chúng ta có thể truy cập nó trong tệp chính.
114

115
00:08:58,890 --> 00:09:01,780
Tôi sẽ giữ nó ở đây như thế này.
115

116
00:09:01,820 --> 00:09:11,690
Và bây giờ khi tôi đến đây và tôi nói trì hoãn một giây và tôi có thể thay đổi điều này
116

117
00:09:11,700 --> 00:09:21,160
Toán tử cho toán tử toogle để nó có thể tắt tất cả các đèn LED bật và tắt
117

118
00:09:21,160 --> 00:09:22,120
và sau đó
118

119
00:09:22,330 --> 00:09:28,760
chúng tôi xây dựng lại mã của chúng tôi, chúng tôi không có lỗi và sau đó chúng tôi tải xuống bảng
119

120
00:09:34,720 --> 00:09:36,770
và như bạn có thể thấy nó đang nhấp nháy.
120

121
00:09:36,940 --> 00:09:43,690
nó đang nhấp nháy và nếu bạn thăm dò bằng máy hiện sóng, bạn sẽ nhận ra rằng nó đang nhấp nháy
121

122
00:09:43,690 --> 00:09:44,260
thứ hai.
