Xin chào, chào mừng trở lại. 1
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
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
Vì vậy, chúng tôi sẽ sử dụng bộ đếm thời gian systick. 4
Chúng tôi sẽ thiết lập nó và hãy bắt đầu làm điều đó 5
hiện nay. 6
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
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
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
nguyên mẫu ở phía trên. 10
Sau đó, chức năng có thể được gọi. 11
Đúng. 12
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
đồng hồ trong cùng một chức năng init. 14
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
hoặc API CMSIS để truy cập bộ đếm thời gian systick, hãy nhớ bộ đếm thời gian systick 16
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
Vì vậy, cho dù bạn có vi điều khiển ST 18
THEN, NXP 19
tất cả họ đều có bộ đếm thời gian 20
và cùng một dòng mã có thể được sử dụng để khởi tạo chúng 21
Đây là nét đẹp của việc sử dụng CMSIS 22
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
để cho tôi đồng hồ hệ thống hiện tại. Và sau đó, 24
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
chúng ta chỉ có thể nhấp vào đây như thế này và sau đó đi đến định nghĩa. 26
Và như bạn có thể thấy nó tồn tại trong lõi cm4 dot h 27
Đ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
Ban như vậy 29
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
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
chia cho 1000. Bởi vì 32
hãy nhớ rằng đồng hồ của chúng tôi đang chạy trong 33
phạm vi megahertz. 34
Đúng. 35
So. 36
Vâng. 37
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
Nó sử dụng ngắt. 39
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
đây không phải là một hướng dẫn về systick 41
Chúng ta sẽ đi sâu hơn so với tâm thu 42
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
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
để hiển thị cho bạn những thay đổi diễn ra khi kernel đang chạy. 45
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
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
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
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
gạch dưới gạch dưới cho phép 50
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
chúng tôi cấu hình hệ thống là tốt. 52
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
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
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
để 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
xa 57
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
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
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
Vâng, vì vậy tôi sẽ tuyên bố điều này là không ổn định 61
và nó sẽ thuộc kiểu int 32 gạch dưới 62
Tôi sẽ gọi tick 63
Vâng, tôi sẽ tuyên bố một cái khác. 64
Điều này sẽ được đánh dấu gạch dưới. 65
Đúng. 66
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
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
Vâng. 69
Vì vậy, những gì tôi sẽ làm là gọi trình xử lý systick 70
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
Chúng ta hãy gọi nó là systic, xử lý gạch dưới và sau đó là void. 72
Đ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
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
chúng ta sẽ tính toán sự khác biệt để có được độ trễ mà chúng ta muốn. 75
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
API 77
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
đánh dấu Nếu bạn chạy chậm stm32 HAL 79
đó 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
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
Sự khác biệt. 82
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
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
Dòng này phải là nguyên tử, nó phải chạy theo kiểu nguyên tử. 85
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
Hãy nhớ việc thực hiện dòng này không chỉ là một hướng dẫn. 87
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
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
và cái cuối cùng phải lưu trữ biến trở lại vào bộ nhớ. 90
Vì vậy, phải mất ba bước và chúng tôi muốn ba bước này để 91
xảy ra 92
tiếp giáp nhau Chúng tôi không muốn bước 1 đến 93
xảy ra 94
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
Chúng tôi không muốn điều đó. 96
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
HĐH. Đó là một điều rất phổ biến. 98
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
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
Vì vậy, những gì chúng ta sẽ làm là. 101
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
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
tạm thời 104
bằng 105
đá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
Nó có nghĩa là chu kỳ CPU chỉ là bạn biết chạy mà không làm gì cả. 107
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
Hãy nhớ chức năng này hoạt động theo đơn vị số lượng bọ ve. 109
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
chuyển đổi nó trở lại thành tick. 111
Đúng. 112
Vì vậy, đây là nó, những gì tôi sẽ làm tiếp theo là 113
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
Tôi sẽ giữ nó ở đây như thế này. 115
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
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
và sau đó 118
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
và như bạn có thể thấy nó đang nhấp nháy. 120
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
thứ hai.