Mỗi khi thiết bị được cấp nguồn, hoặc khi người dùng nhấn nút khởi động lại trên thiết bị hoặc trong một số trường hợp hoạt động của chương trình như khi chương trình ứng dụng phát hiện có phiên bản cập nhật mới thì vi điều khiển sẽ được yêu cầu thực hiện khởi động lại. Bài viết này sẽ giúp các bạn làm rõ các hoạt động diễn ra khi vi điều khiển khởi động.
Việc đầu tiên khi vi điều khiển khởi động đó là thanh ghi Program Counter (PC) sẽ được nạp giá trị 0x0000_0000. Tiếp theo vi xử lý sẽ khởi tạo Stack Pointer bằng cách đọc giá trị bộ nhớ tại địa chỉ bộ nhớ chương trình 0x0000_0000 và nạp cho thanh ghi Main Stack Pointer. Sau đó vi xử lý sẽ đọc giá trị bộ nhớ tại địa chỉ 0x0000_0004 để nạp cho thanh ghi PC. Giá trị đọc được chính là địa chỉ của Reset_Handler. Lúc này PC nhảy tới Reset_Handler. Reset_Handler có chức năng thực hiện một số khởi tạo và từ Reset_Handler sẽ gọi hàm main() của chương trình. Đó là cách mà hàm main() được thực khi mỗi khi reset vi xử lý [*].
Cấu trúc một chương trình trong bộ nhớ vi điều khiển
Trong các chương trình, nếu người sử dụng muốn phát triển 1 bootloader để phục vụ cho chức năng cập nhật chương trình từ xa thì bootloader tự phát triển nằm tại vị trí bắt đầu của bộ nhớ Flash, nên mỗi khi vi điều khiển khởi động thì các giá trị khởi tạo MSP và địa chỉ Reset_Handler được tự động nạp lên các thanh ghi MSP, PC của vi xử lý một cách chính xác để Bootloader có thể thực thi được.
Trong trường hợp đó, chương trình ứng dụng được bố trí nằm ở các vị trí khác của bộ nhớ Flash nên để vi xử lý có thể thực thi được một trong các chương trình này mỗi khi khởi động thì nội dung chương trình của Bootloader phải gồm các lệnh thực hiện nạp giá trị Main Stack Pointer và giá trị của thanh ghi PC tương ứng với chương trình mong muốn thực thi để điều khiển vi xử lý nhảy đến và thực thi chương trình này.
Các bạn có thể tham khảo video dưới đây để hình dung rõ hơn về quá trình này. Nếu các bạn thấy hay, nhấn like ? subcribe ? để theo dõi các video mới nhất đến từ Cộng đồng Kỹ thuật TAPIT nhé!
Chúc các bạn thành công!
Thuong Nguyen
Tham khảo:
[*] Noviello, Carmine. “Mastering STM32.”