Chúng ta có thể dễ dàng tìm thấy các hệ thống nhúng (tên tiếng Anh là Embedded System) ở khắp mọi nơi trong cuộc sống hàng ngày. Hệ thống nhúng đang làm cho thế giới thông minh hơn và tiện lợi hơn. Số lượng các hệ thống nhúng đang phát triển nhanh chóng, đặc biệt là trong các ứng dụng vạn vật kết nối Internet IoT (viết tắt của cụm từ tiếng Anh Internet-of-Things) và truyền thông không dây. Thị trường hệ thống nhúng là một trong những lĩnh vực phát triển nhanh nhất trên thế giới. Như tên gọi, hệ thống nhúng là một hệ thống máy tính có mục đích đặc biệt được thiết kế để thực hiện các chức năng chuyên dụng. Một số hệ thống nhúng có ràng buộc thời gian thực được gọi là hệ thống nhúng thời gian thực (tên tiếng Anh là Real-time Embedded System). Một hệ thống nhúng bao gồm phần cứng và phần mềm đi kèm. Phần cứng bao gồm một bộ vi xử lý hoặc vi điều khiển với bộ nhớ ngoài gắn thêm, I/O và các thành phần khác như cảm biến, bàn phím, đèn LED, màn hình LCD và bất kỳ loại thiết bị truyền động nào. Phần mềm nhúng là trí não của một hệ thống nhúng. Hầu hết phần mềm hệ thống nhúng thời gian thực có các chương trình ứng dụng cụ thể được hỗ trợ bởi hệ điều hành thời gian thực RTOS (viết tắt của cụm từ tiếng Anh Real-time Operating System). Phần mềm nhúng thường được gọi là “firmware” vì phần mềm loại này được nạp vào bộ nhớ ROM, EPROM hoặc Flash, và sau khi được nạp vào hệ thống nhúng nó sẽ không bao giờ bị thay đổi trừ khi cần phải cập nhật lại hoặc thay thế.
Đối với một máy tính đa năng, người dùng có thể cài đặt bất kỳ phần mềm nào để thực hiện tất cả các loại công việc như xử lý văn bản, lướt web, quản lý cơ sở dữ liệu và những công việc khác tùy theo mục đích của mình. Trái lại, hệ thống nhúng chỉ được sử dụng để thực hiện lặp đi lặp lại các chức năng được chỉ định cụ thể. Hệ thống nhúng đã được sử dụng trong hơn nửa thế kỷ kể từ khi bộ vi xử lý được phát triển. Chip vi xử lý Intel đầu tiên được thiết kế cho máy tính và các hệ thống đơn giản khác vào năm 1960. Kể từ đó, khi chi phí của bộ vi xử lý và vi điều khiển giảm xuống và năng lực chức năng được tăng cường, việc thay thế nhiều sản phẩm và hệ thống đắt tiền bằng các hệ thống nhúng trên cơ sở bộ vi xử lý hoặc vi điều khiển trở nên khả thi.
Kể từ đầu những năm 2000, hàng trăm công ty đã được cấp phép sử dụng kiến trúc vi xử lý ARM trong các sản phẩm của họ. Hiện nay, số lượng các công ty được cấp phép đang tăng lên rất nhanh. Mặc dù người được cấp phép phải tuân theo tập lệnh và kiến trúc vi xử lý ARM, họ có thể tự do triển khai các thiết bị ngoại vi như cổng I/O, ADC, Timers, DAC, SPI, I2C và UART, … khi họ muốn. Từ góc độ lập trình, trong khi chúng ta có thể viết chương trình bằng hợp ngữ cho lõi vi xử lý ARM và chạy nó trên bất kỳ chip ARM nào, thì chương trình được viết cho các cổng I/O của chip ARM cho công ty A sẽ không chạy trên chip ARM từ công ty B. Điều này là do các thanh ghi chức năng đặc biệt và vị trí địa chỉ vật lý của chúng để truy cập các cổng I/O không được chuẩn hóa và mỗi người được cấp phép thực hiện nó khác nhau.
ARM lần đầu tiên giới thiệu dòng vi xử lý Cortex-M vào năm 2004. Kể từ đó, bộ xử lý Cortex-M đã nhận được sự chấp nhận rộng rãi như một bộ xử lý đa năng có khả năng mở rộng cao cho các vi điều khiển nhỏ. Tại thời điểm viết cuốn sách này, ARM tiếp tục là kiến trúc hàng đầu cho IoT và các thiết bị nhúng với kỷ lục 4,4 tỷ chip dựa trên vi xử lý Cortex-M được xuất xưởng trong quý 4 năm 2020 (Theo “Record Shipments” trên trang web https://www.arm.com/). Chúng có sẵn từ nhiều nhà cung cấp linh kiện bán dẫn hàng đầu và tốc độ phát triển không có dấu hiệu chậm lại. Dòng vi xử lý Cortex-M hiện đã trở thành một tiêu chuẩn công nghiệp. Vì vậy, kiến thức về cách sử dụng nó đang trở thành một kỹ năng cần thiết cho các nhà phát triển hệ thống nhúng chuyên nghiệp.
Cuốn sách này nhằm mục đích vừa giới thiệu về các bộ xử lý ARM Cortex-M vừa hướng dẫn các nguyên tắc và kỹ thuật cơ bản về thiết kế và phát triển phần mềm ứng dụng chạy trên chúng. Trọng tâm được nhấn mạnh vào khía cạnh phát triển phần mềm của hệ thống nhúng. Cuốn sách được viết như một tài liệu hướng dẫn và các chương được sắp xếp theo trình tự từ các vấn đề đơn giản đến phức tạp. Mỗi chương có một số ví dụ trình bày các nguyên tắc chính được nêu trong cuốn sách này bằng cách sử dụng một lượng mã tối thiểu. Mỗi ví dụ được thiết kế để chạy trên bo mạch phát triển FRDM-KL46Z được trang bị bộ vi xử lý Cortex-M0. Người đọc sẽ được trải nghiệm thực tế về việc tự xây dựng các hệ thống nhúng qua các ví dụ cụ thể với cuốn sách này.
Kết cấu của cuốn sách
Cuốn sách gồm 2 phần được chia làm 15 chương.
PHẦN I CƠ BẢN
Chương 1 Giới thiệu về hệ thống máy tính nhúng
Chương 2 Ngôn ngữ lập trình C cho các hệ thống nhúng ARM
Chương 3 Giới thiệu về nền tảng máy tính nhúng FRDM-KL46Z
Chương 4 Vi xử lý ARM Cortex-M
Chương 5 Ghép nối ngoại vi số qua cổng GPIO
Chương 6 Ghép nối với thiết bị hiển thị
Chương 7 Ghép nối với cổng nối tiếp UART
Chương 8 Lập trình Timer
PHẦN II NÂNG CAO
Chương 9 Ghép nối ngoại vi sử dụng cơ chế ngắt
Chương 10 Ghép nối ngoại vi qua ADC và DAC
Chương 11 Ghép nối với thanh trượt cảm biến điện dung
Chương 12 Ghép nối ngoại vi qua chuẩn giao tiếp I2C
Chương 13 Ghép nối ngoại vi qua chuẩn giao tiếp SPI
Chương 14 Ghép nối với cơ cấu chấp hành
Chương 15 Hệ điều hành thời gian thực
Nội dung mỗi chương đều được minh họa bằng các ví dụ cụ thể và sinh động với phần lớn lấy từ các tình huống ứng dụng thực tế nhằm giúp người đọc nhanh chóng nắm bắt được kiến thức và có thể áp dụng dễ dàng kiến thức đó vào trong thực tiễn.
Cuốn sách này hữu ích cho sinh viên, người mới bắt đầu cũng như các nhà phát triển chuyên nghiệp và có kinh nghiệm về hệ thống nhúng với vi xử lý Cortex-M của ARM. Tuy nhiên, khi viết cuốn sách này người viết cũng giả định rằng bạn đọc đã có kiến thức cơ bản về cách sử dụng vi điều khiển và đã quen với việc lập trình bằng ngôn ngữ C. Ngoài ra, sẽ rất hữu ích nếu bạn đọc có kiến thức cơ bản về cách sử dụng trình gỡ lỗi Keil μVision và IDE.
Các chương trình và ví dụ được trình bày trong cuốn sách đã được kiểm tra kỹ nhưng không thể tránh khỏi còn mắc lỗi. Rất mong bạn đọc góp ý để tác giả hoàn thiện cuốn sách. Mọi góp ý xin gửi về địa chỉ email hungnvnu@gmail.com.
MỤC LỤC
Chương 1 Giới thiệu về hệ thống máy tính nhúng. 15
1.1. Khái niệm tổng quát về hệ thống máy tính. 15
1.2. Phân biệt hệ thống máy tính nhúng và hệ thống máy tính thông dụng. 16
1.3. Các đặc tính của hệ thống máy tính nhúng. 19
1.4. Các thách thức trong thiết kế hệ thống máy tính nhúng. 20
1.5. Các thành phần phần cứng của hệ thống máy tính nhúng. 21
1.5.2. Các mạch tích hợp chuyên dụng ASIC.. 27
1.5.5. Giao diện ghép nối I/O.. 32
1.5.8. Các bộ định thời và bộ đếm.. 35
1.6. Các thành phần phần mềm và công cụ phát triển. 38
1.6.1. Các thành phần phần mềm.. 38
1.7. Công cụ và kỹ thuật gỡ lỗi 42
Chương 2 Ngôn ngữ lập trình C cho các hệ thống nhúng ARM… 44
2.1. Lập trình các hệ thống nhúng. 44
2.3. Chương trình C nhúng mẫu. 46
2.6.2. Biên dịch có điều kiện. 55
2.6.3. Bao gồm các tệp (#include) 57
2.7. Các toán tử xử lý theo từng bit Bitwise. 58
2.9.1. Khai báo biến con trỏ. 74
2.9.2. Cách sử dụng biến con trỏ. 75
2.10.1. Định nghĩa một cấu trúc. 76
2.10.2. Truy cập các thành viên của một cấu trúc. 77
2.11.1. Truyền tham số bằng giá trị 79
2.11.2. Truyền tham số bằng tham chiếu. 81
Chương 3 Giới thiệu về nền tảng máy tính nhúng FRDM-KL46Z 85
3.1. Các đặc tính chính của kit FRMD-Kl46Z. 85
3.2. Vi điều khiển Freesacle KL46Z256VLL4. 88
3.3. Giao diện nạp chương trình OpenSDA tích hợp sẵn trên Kit 90
Chương 4 Vi xử lý ARM Cortex-M… 98
4.1. Tổng quan về vi xử lý ARM.. 98
4.2. Dòng vi xử lý Cortex-M.. 100
4.2.1. Các tính năng phổ biến trong bộ vi xử lý Cortex-M… 102
4.2.2. Tính tương thích giữa các bộ vi xử lý Cortex-M… 104
4.4. Kiến trúc vi xử lý Cortex-M.. 119
4.4.4. Bản đồ bộ nhớ Cortex-M và Bus. 131
Chương 5 Ghép nối ngoại vi số qua cổng GPIO.. 134
5.1. Các chân I/O trên kit FRDM-KL46Z. 134
5.2. Mạch cấp clock cho các cổng I/O.. 137
5.3.1. Địa chỉ của các khối GPIO.. 139
5.3.2. Các thanh ghi bên trong mỗi cổng GPIO.. 140
5.4. Ghép nối LED với cổng GPIO trên bo mạch FRDM-KL46Z. 145
5.4.1. Điều khiển bật/tắt đèn LED xanh trên bo mạch FRDM-KL46Z 146
5.4.2. Điều khiển bật/tắt hai đèn LED ở tốc độ khác nhau. 152
5.4.3. Điều khiển LED ba màu (tri-color LED) 154
5.5. Ghép nối đèn LED 7-đoạn với cổng GPIO.. 157
5.6. Ghép nối phím bấm với cổng GPIO trên bo mạch FRDM-KL46Z 162
5.6.1. Lập trình đọc trạng thái phím bấm.. 163
5.6.2. Ghép nối với bàn phím.. 166
Chương 6 Ghép nối với thiết bị hiển thị 174
6.1. Một số ưu điểm của LCD.. 174
6.2. Lập trình ghép nối với LCD.. 174
6.2.2. Gửi dữ liệu lên màn hình LCD.. 180
6.2.3. Kiểm tra cờ trạng thái bận của LCD.. 183
6.2.4. Giao diện ghép nối LCD 4 bit 186
6.2.5. Vị trí con trỏ trên LCD.. 190
6.3. Lập trình ghép nối với LCD đồ họa. 190
6.3.2. Hiển thị văn bản trên LCD đồ họa. 197
6.4. Lập trình ghép nối với LCD phân đoạn. 203
6.4.1. Mô-đun LCD phân đoạn và bộ điều khiển. 203
Chương 7 Ghép nối với cổng nối tiếp UART.. 221
7.1. Khái niệm cơ bản về giao tiếp nối tiếp. 221
7.1.1. Truyền song công toàn phần và bán song công. 223
7.1.2. Giao tiếp nối tiếp không đồng bộ và khung dữ liệu. 224
7.1.3. RS232 và các tiêu chuẩn I/O nối tiếp khác. 226
8.1. Giới thiệu về bộ đếm và bộ định thời 261
8.1.3. Đo thời gian giữa hai sự kiện. 263
8.1.4. Bộ đếm và bộ định thời trong các vi điều khiển. 264
8.2. Bộ định thời System tick timer. 264
8.3. Các bộ định thời của vi điều khiển KL46Z. 273
8.4. Các kênh TPM và chức năng so sánh đầu ra. 288
8.5. Sử dụng bộ định thời trong chế độ chụp đầu vào. 300
8.6. Sử dụng bộ định thời làm bộ đếm sự kiện. 304
Chương 9 Ghép nối ngoại vi sử dụng cơ chế ngắt 309
9.1. Khái niệm ngắt và ngoại lệ trong ARM Cortex-M.. 309
9.1.1. Cơ chế ngắt và hỏi vòng. 309
9.1.2. Ngắt và các chế độ hoạt động của ARM Cortex-M… 312
9.2. Lập trình ngắt cho cổng I/O.. 323
9.3. Lập trình ngắt cổng nối tiếp UART. 336
9.4. Lập trình ngắt của bộ định thời 341
9.5. Lập trình ngắt của bộ định thời SysTick. 343
9.6. Lập trình mức ưu tiên ngắt trong vi điều khiển NXP KL46Z. 346
Chương 10 Ghép nối ngoại vi qua ADC và DAC.. 353
10.1. Các đặc trưng của ADC.. 353
10.2. Lập trình ADC trên bo mạch FRDM-KL46Z. 361
10.3. Ghép nối với cảm biến. 378
10.3.1. Ghép nối với cảm biến nhiệt độ. 378
10.3.2. Ghép nối với cảm biến ánh sáng. 385
10.4. Lập trình ghép nối với DAC.. 387
10.4.1. Tạo tín hiệu răng cưa. 394
Chương 11 Ghép nối với thanh trượt cảm biến điện dung. 401
11.1.1. Tổng quan về mô-đun TSI 401
11.1.2. Hoạt động chức năng. 403
11.2. Lập trình ghép nối mô-đun TSI với thanh trượt cảm biến điện dung 409
Chương 12 Ghép nối ngoại vi qua chuẩn giao tiếp I2C.. 412
12.1. Giao diện ghép nối I2C.. 412
12.1.1. Kết nối trên bus I2C.. 412
12.1.2. Các nút trên bus I2C.. 414
12.1.3. Chuỗi báo hiệu cho truyền dữ liệu. 415
12.1.5. Định dạng khung truyền trong I2C.. 418
12.1.6. Định dạng Byte địa chỉ 418
12.1.7. Định dạng byte dữ liệu. 420
12.1.8. Kết hợp địa chỉ và byte dữ liệu. 420
12.1.9. Kéo dài xung nhịp. 422
12.1.10. Hoạt động trọng tài 422
12.1.11. Ghi nhiều byte theo loạt 423
12.1.12. Đọc nhiều byte theo loạt 424
12.2. Mô-đun I2C trên bo mạch FRDM-KL46Z. 425
12.2.1. Cấp xung nhịp clock cho mô-đun I2C.. 425
12.2.2. Thiết lập tốc độ xung nhịp. 426
12.2.3. Thiết lập Master hay Slave. 429
12.2.4. Quy trình các bước lập trình mô-đun I2C.. 433
12.3. Lập trình ghép nối đồng hồ thời gian thực DS1337 qua bus I2C 436
12.3.1. Bản đồ địa chỉ của DS1337. 437
12.3.2. Các chế độ và vị trí địa chỉ cho thời gian và ngày. 439
12.3.3. Thanh ghi điều khiển của DS1337. 440
12.3.4. Thao tác ghi tới DS1337. 442
12.3.5. Thao tác đọc từ DS1337. 442
12.3.6. Thiết lập thời gian cho DS1337. 443
12.3.7. Đặt ngày của DS1337. 445
12.3.8. Đọc ngày và giờ của DS1337. 448
Chương 13 Ghép nối ngoại vi qua chuẩn giao tiếp SPI. 453
13.1.1. Các tín hiệu trên bus SPI 453
13.1.2. Nguyên lý làm việc của SPI 458
13.1.3. Phân cực và pha của xung nhịp trong giao thức SPI 459
13.2. Lập trình SPI trên NXP ARM KL46Z. 462
13.3. Bộ điều khiển LED 7-đoạn MAX7221. 473
13.3.1. Sơ đồ chân và kết nối MAX7221. 474
13.3.2. Định dạng gói dữ liệu của MAX7221. 476
Chương 14 Ghép nối với cơ cấu chấp hành. 486
14.1. Rơle và Bộ cách ly quang. 486
14.1.2. Rơ-le trạng thái rắn. 489
14.1.3. Chuyển mạch lưỡi gà. 490
14.2. Ghép nối với mô-tơ bước. 493
14.2.2. Điều khiển động cơ bước qua bộ cách ly quang. 500
14.3. Ghép nối với động cơ DC và điều chế độ rộng xung PWM.. 502
14.3.2. Điều chế độ rộng xung (PWM) 509
14.3.3. Điều khiển động cơ DC với bộ cách ly quang. 510
14.4. Lập trình điều chế độ rộng xung PWM với vi điều khiển ARM KL46Z 511
14.4.1. Nguồn xung nhịp cho mô-đun PWM… 511
14.4.2. PWM được căn chỉnh theo sườn. 515
14.4.3. Điều chế PWM được căn chỉnh trung tâm.. 524
14.4.4. Chế độ căn theo sườn so với chế độ căn giữa. 528
14.4.5. Tạo dải chết (Dead-Band) 529
Chương 15 Hệ điều hành thời gian thực. 532
15.1. Các chức năng chính của một hệ điều hành đa năng. 533
15.1.1. Quản lý tiến trình. 534
15.1.5. Quản lý hệ thống tệp. 541
15.2. Các đặc trưng của nhân RTOS. 543
15.2.1. Đồng hồ và bộ đếm thời gian. 545
15.2.3. Truyền thông giữa các nhiệm vụ và chia sẻ tài nguyên. 547
15.2.4. Hoạt động I/O không đồng bộ. 549
15.3. Hệ điều hành CMSIS-RTOS RTX.. 551
15.4. Điều khiển đèn LED bằng hệ điều hành CMIS-RTOS RTX.. 557
15.4.2. Tùy chỉnh nhân CMSIS-RTOS RTX.. 559
15.4.3. Tạo các tệp mã nguồn. 560
Phụ Lục A Hướng dẫn sử dụng Kit FRDM-KL46Z.. 564
A.2 Chạy chương trình demo. 564
Phụ Lục B Cài đặt và sử dụng phần mềm Keil MDK-ARM… 571
B.1 Cài đặt phần mềm Keil MDK-ARM… 571
B.2 Tạo project với Keil MDK-ARM… 572