Chương 1: Giới thiệu Giới thiệu tổng quan về đề tài, lý do chọn đề tài, các vấn đề sẽ được giải quyết trong đề tài, các phương pháp và kết quả đạt được sau khi hoàn tất đề tài. - Chương 2: Cơ sở lý thuyết Trình bày các lý thuyết liên quan đến các chuẩn giao tiếp, kỹ thuật, các linh kiện, phần cứng sử dụng để thực hiện đề tài. - Chương 3: Thiết kế hệ thống Giới thiệu chi tiết về hệ thống, lựa chọn và tính toán giải pháp thiết kế, thiết kế nguyên lý phần cứng và thiết kế phần mềm. - Chương 4: Kết quả Trình bày về những kết quả mà nhóm đã đạt được sau khi thực hiện đề tài, về hệ thống mà nhóm thực hiện.
- Chương 5: Kết luận và hướng phát triển Trình bày về những kết quả mà nhóm đã đạt được sau khi thực hiện đề tài, những hạn chế, từ đó rút ra kết luận và hướng phát triển để giải quyết các vấn đề còn tồn đọng để đồ án hoàn thiện hơn. 5 CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 2. FIRMWARE OVER THE AIR Firmware over the air (FOTA) là một phương pháp cho phép cập nhật và nâng cấp firmware trên thiết bị từ xa thông qua kết nối mạng không dây như Wi-Fi, 4G/5G, Bluetooth hoặc Zigbee mà không cần phải kết nối vật lý trực tiếp. Trong lĩnh vực ô tô, FOTA cho phép các nhà sản xuất và nhà phát triển ô tô cập nhật và nâng cấp phần mềm, cung cấp các bản vá bảo mật, sửa lỗi hệ thống và cập nhật các tính năng mới của các hệ thống điện tử trên xe một cách không dây, thông qua kết nối mạng.
Từ đó làm cho chiếc xe hoạt động an toàn và nhiều tính năng hơn (Hình 2. 1: FOTA trong lĩnh vực ô tô Ưu điểm: - Cải thiện hiệu suất thiết bị: FOTA cho phép cải thiện hiệu suất của thiết bị mà không cần nâng cấp phần cứng đắt đỏ. Người dùng có thể trải nghiệm tốc độ xử lý nhanh hơn, giao diện người dùng mượt mà và truy cập vào các tính năng mới thông qua các bản cập nhật này. - Bảo mật: FOTA giúp khắc phục lỗ hổng bảo mật trong firmware và bảo vệ thiết bị khỏi các mối đe dọa bảo mật.
6 - Tiết kiệm thời gian và công sức: Không cần thực hiện cập nhật thủ công, FOTA tự động cài đặt các bản cập nhật mà không cần sự can thiệp của người dùng. Nhược điểm: - Rủi ro trong quá trình cập nhật: Một số lỗi có thể xảy ra trong quá trình cập nhật FOTA, gây ra tình trạng “brick” (thiết bị không thể hoạt động) hoặc mất dữ liệu. - Phụ thuộc vào kết nối mạng: FOTA yêu cầu kết nối internet để tải và cài đặt các bản cập nhật. Nếu kết nối mạng không ổn định, việc cập nhật có thể gặp khó khăn.
- Khả năng tương thích: Cần đảm bảo rằng các bản cập nhật FOTA tương thích với các phiên bản phần cứng và phần mềm hiện có trên thiết bị. 2: Quá trình cập nhật FOTA [2] Quá trình cập nhật FOTA tổng thể có thể được chia thành nhiều giai đoạn như hình 2. Quá trình cập nhật FOTA bao gồm các bước sau [2]: - Update: Tải xuống bản cập nhật firmware mới từ máy chủ FOTA. - Download: Lưu trữ bản cập nhật firmware tại một vị trí an toàn trên thiết bị.
- Installation: Cài đặt bản cập nhật firmware vào bộ nhớ flash của ECU. 7 - Verification: Kiểm tra tính toàn vẹn của bản cập nhật firmware. - Activation: Kích hoạt bản cập nhật firmware. - Rollback: Trong trường hợp có sự cố, quá trình cập nhật có thể được hoàn tác để trở lại phiên bản firmware trước đó.
BOOTLOADER Bootloader là một chương trình có mục đích chính là cho phép phần mềm hệ thống được cập nhật mà không cần sử dụng phần cứng chuyên dụng như ST-Link, JTAG. Trong một số trường hợp, nó cũng có thể là điểm sớm nhất mà tính toàn vẹn của hệ thống nhúng có thể được kiểm tra. Chúng có thể lấy dữ liệu firmware thông qua nhiều giao thức khác nhau như UART, CAN, I2C, Ethernet, USB và còn rất nhiều giao thức khác nữa. Bootloader ở đây là một phần mềm đặc biệt được nạp vào bộ nhớ của máy tính trước khi khởi động.
Bootloader của ATMEGA328P 2. Tổ chức bộ nhớ flash trong ATMEGA328P Bộ nhớ flash được tổ chức thành hai phần chính, phần ứng dụng và phần bộ nạp khởi động. Kích thước của các phần khác nhau này được cấu hình bởi BOOTSZ [3]. 3: Tổ chức bộ nhớ flash trong ATMEGA328P [3] 8 2.
Cấu hình chương trình Bootloader trên ATMEGA328P Việc vào bộ nạp khởi động (bootloader) được thực hiện thông qua một lệnh nhảy (jump) hoặc gọi (call) từ chương trình ứng dụng. Ngoài ra, việc cấu hình boot reset fuse (BOOTRST) có thể được lập trình sao cho vector reset sẽ trỏ đến địa chỉ bắt đầu của vùng flash của Bootloader hay vùng flash của Application sau khi reset. Dưới đây là bảng giá trị của Boot reset fuse. 1: Bảng Boot reset fuse của ATMEGA328P [3] BOOTRST Reset Address 1 1 Reset vector = application reset (address 0x0000) 0 0 Reset vector = boot loader reset Ngoài ra, để cấu hình size của vùng flash của Bootloader thì ta cần cấu hình các giá trị của bit BOOTSZ1 và BOOTSZ0.2 dưới đây mô tả chi tiết hơn về đặc điểm của từng cầu hình BOOTSZ1 và BOOTSZ0 đối với Bootloader.
2: Bảng cấu hình Boot Size của ATMEGA328P [3] Boot Reset Address BOOT BOOT Application Boot Loader End App Boot Size Pages (Start SZ1 SZ0 Flash Section Flash Section Section Boot Loader Section) 1 1 256 words 4 0x0000 - 0x3EFF 0x3F00 - 0x3FFF 0x3EFF 0x3F00 1 0 512 words 8 0x0000 - 0x3DFF 0x3E00 - 0x3FFF 0x3DFF 0x3E00 0 1 1024 words 16 0x0000 - 0x3BFF 0x3C00 - 0x3FFF 0x3BFF 0x3C00 0 0 2048 words 32 0x0000 - 0x37FF 0x3800 - 0x3FFF 0x37FF 0x3800 Việc cấu hình các bit đã nói bên trên được quản lý thông qua các Fuse Bits. ATMEGA328P có ba loại Fuse Bits: Extended Fuse Byte, Fuse High Byte và Fuse Low Byte được thể hiện ở các bảng dữ liệu 2. 3: Bảng Extended Fuse Byte của ATMEGA328P [3] Extended Fuse Byte Bit No Description Default Value - 7 - 1 - 6 - 1 - 5 - 1 - 4 - 1 - 3 - 1 - 2 - 1 - 1 - 1 SELFPRGEN 0 Self programming enable 1 (unprogrammed) Bảng 2. 4: Bảng High Fuse Byte của ATMEGA328P [3] High Fuse Byte Bit No.
Description Default Value RSTDISBL 7 External reset disable 1 DWEN 6 debugWIRE enable 1 Enable serial program and data SPIEN 5 0 downloading WDTON 4 Watchdog timer always On 1 EEPROM memory is preserved EESAVE 3 1 through the chip erase BOOTSZ1 2 Select boot size 0 BOOTSZ0 1 Select boot size 0 BOOTRST 0 Select reset vector 1 Bảng 2. 5: Bảng Low Fuse Byte của ATMEGA328P [3] Low Fuse Byte Bit No. Description Default Value CKDIV8 7 Divide clock by 8 0 (programmed) CKOUT 6 Clock output 1 (unprogrammed) SUT1 5 Select start-up time 1 (unprogrammed) SUT0 4 Select start-up time 0 (programmed) CKSEL3 3 Select clock source 0 (programmed) CKSEL2 2 Select clock source 0 (programmed) CKSEL1 1 Select clock source 1 (unprogrammed) CKSEL0 0 Select clock source 0 (programmed) 10 2. Bootloader của STM32 2.
Tổ chức bộ nhớ flash trong STM32 STM32 có bộ nhớ flash được tổ chức như bảng 2. 6: Tổ chức bộ nhớ flash của STM32 [3] Block Name Base addresses Size (bytes) Page 0 0x0800 0000 - 0x0800 03FF 1K Page 1 0x0800 0400 - 0x0800 07FF 1K Page 2 0x0800 0800 - 0x0800 0BFF 1K Page 3 0x0800 0C00 - 0x0800 0FFF 1K Main memory Page 4 0x0800 1000 - 0x0800 13FF 1K. Page 127 0x0801 FC00 - 0x0801 FFFF 1K Information System memory 0x1FFF F000 - 0x1FFF F7FF 2K block Option bytes 0x1FFF F800 - 0x1FFF F80F 16 FLASH_ACR 0x4002 2000 - 0x4002 2003 4 FLASH_KEYR 0x4002 2004 - 0x4002 2007 4 FLASH_OPTKEYR 0x4002 2008 - 0x4002 200B 4 Flash memory FLASH_SR 0x4002 200C - 0x4002 200F 4 interface FLASH_CR 0x4002 2010 - 0x4002 2013 4 registers FLASH_AR 0x4002 2014 - 0x4002 2017 4 Reserved 0x4002 2018 - 0x4002 201B 4 FLASH_OBR 0x4002 201C - 0x4002 201F 4 FLASH_WRPR 0x4002 2020 - 0x4002 2023 4 Trong vi điều khiển STM32, mặc dù địa chỉ bộ nhớ Flash bắt đầu từ 0x0000.0000, nhưng vùng nhớ dành cho mã lệnh (code) thực tế được lưu từ địa chỉ 0x0800. Khi chúng ta nạp chương trình xuống vi điều khiển, hệ thống sẽ tự động nạp chương trình vào từ địa chỉ này.
Tại địa chỉ 0x0800.0000, giá trị của MSP (Main Stack Pointer) được lưu trữ, và bảng vector ngắt bắt đầu từ địa chỉ 0x0800.0004, nơi chứa địa chỉ của hàm Reset_Handler [4]. Tác động của Bootloader trong Reset Sequence của STM32 Chúng ta đều biết, địa chỉ khởi đầu của bộ nhớ đối với vi điều khiển STM32, cụ thể là bộ nhớ FLASH, là 0x0000. Phần đầu tiên của bộ nhớ này chứa "Vector Table", nơi lưu trữ các vector ngắt, nổi bật nhất là Vector Reset. Sau khi thực hiện thao tác reset, vi điều khiển sẽ trải qua các bước sau được biểu diễn ở hình 2.
4: Reset Sequence của STM32 CPU sẽ kiểm tra bảng Vector Table của chương trình trong bộ nhớ bằng cách đọc thanh ghi SCB_VTOR. Ở trạng thái reset, SCB_VTOR có giá trị 0, do đó CPU sẽ tìm đến địa chỉ 0x0000. - Bộ xử lý sẽ nạp giá trị tại ô nhớ đầu tiên của Vector Table (0x0000.0000) vào thanh ghi MSP - Main Stack Pointer (ở trạng thái reset MSP). Ví dụ, trong hình minh họa, MSP = 0x2000.
- Tiếp theo, bộ xử lý sẽ lấy địa chỉ của Reset Handler, được lưu tại ô nhớ thứ hai của Vector Table (địa chỉ 0x0000.0004), và nạp vào thanh ghi PC để thực thi hàm Reset Handler. Trong hình minh họa, PC = 0x2000.1000 (giá trị tại ô nhớ 0x0000. Vector Reset cũng là một dạng Exception của hệ thống, đảm nhận nhiệm vụ thiết lập hệ thống ban đầu trước khi gọi đến hàm main [5]. - Sau khi chuyển tới Reset Handler, bộ xử lý sẽ bắt đầu thực thi các lệnh trong Reset Handler.
Reset Handler thường được viết bằng ngôn ngữ Assembly hoặc C, và thực hiện các nhiệm vụ khởi tạo ban đầu của hệ thống. Một số công việc có thể được thực hiện trong Reset Handler bao gồm khởi tạo lại vùng nhớ Stack hoặc cấu hình xung clock cho hệ thống, tùy thuộc vào lập trình viên [5]. 12 - Bước cuối cùng của Reset Handler là gọi đến hàm main(), sau đó thực hiện các tác vụ được định nghĩa trong hàm main() [5]. Từ đó xây dựng được quy trình cơ bản của Bootloader: - Lấy địa chỉ của Firmware cần nhảy đến.
- Disable các ngắt của hệ thống và xóa các Ngắt đang chờ xử lý, nhằm tránh làm chương trình Boot bị gián đoạn. - Set MSP - Main Stack Pointer và thanh ghi SCB_VTOR với tác dụng đã nói ở trên.