Ngày nay, các hệ thống nhúng trở nên phổ biến và đóng vai trò quan trọng trong đời sống con người. Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lò vi sóng, nồi cơm điện, điều hòa, điện thoại di động, ô tô, xe máy, máy bay, tàu thủy, các đầu đo, cơ cấu chấp hành thông minh, robot v.v… Ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi nơi trong cuộc sống quanh chúng ta.
Trang 1BỘ THÔNG TIN VÀ TRUYỀN THÔNG
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Trang 2LỜI MỞ ĐẦU 3
I, Tổng quan về RTOS: 4
1.1 Khái niệm về RTOS: 4
1.2 Các thành phần trong RTOS và phương thức hoạt động: 4
II, FreeRTOS 9
2.1 Tổng quan về FreeRTOS 9
2.2 Các Task trong FreeRTOS 12
III, STM32F103C8T6 14
3.1 Giới thiệu sơ lược: 14
3.2 Cấu hình chi tiết của STM32F103C8T6: 15
3.3 Thông số kỹ thuật: 18
IV, Màn hình LCD 16x2 20
V, Cảm biến vật cản hồng ngoại 23
VI, Giao tiếp STM32F103C8T6 với LCD 16×2 thông qua moudle I2C 23
6.1 Kết nối MCU STM32 với LCD 23
6.2 Địa chỉ của Module I2C PCF8574 24
VII, Mạch nguyên lý, PCB, mạch thực tế 25
Trang 3LỜI MỞ ĐẦU
Ngày nay, các hệ thống nhúng trở nên phổ biến và đóng vai trò quan trọng trong đời sống con người Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lò vi sóng, nồi cơm điện, điều hòa, điện thoại di động, ô tô, xe máy, máy bay, tàu thủy, các đầu đo, cơ cấu chấp hành thông minh, robot v.v… Ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi nơi trong cuộc sống quanh chúng ta
Qua môn học hệ thống nhúng, chúng em đã hiểu thêm về các hệ thống nhúng trong thực tế, về đặc điểm, tính ưu việt cũng như tính ứng dụng của chúng đối với con người Với mong muốn làm rõ các kiến thức đã học và giới thiệu các ứng dụng cơ bản của hệ thống nhúng, nhóm chúng em đưa ra mô hình mạch đếm số người ra vào phòng tự động – một sản phẩm rất quen thuộc và có tính ứng dụng cao trong thực tế
Do thời tian thực hiện và kiến thức còn hạn chế nên còn nhiều sai sót trong quá trình thực hiện đề tài, nhóm chúng em rất mong nhận được sự bổ sung đóng góp của thầy và các bạn để đề tài hoàn thiện hơn
Chúng em xin chân thành cảm ơn thầy đã tận tình hướng dẫn, giảng dạy và giúp đỡ chúng em thực hiện đề tài này!
Sinh viên thực hiện đề tài
Nhóm 8
Trang 4I, Tổng quan về RTOS:
1.1 Khái niệm về RTOS:
+ RTOS là viết tắt của cụm từ Real-time operating system hay hệ điều hành thời gian thực
thường được nhúng trong các dòng vi điều khiển dùng để điều khiển thiết bị một cách nhanh chóng và đa nhiệm (multi tasking)
+ Hệ điều hành thời gian thực (realtime): sinh ra cho các tác vụ cần sự phản hồi nhanh của
hệ thống, thường được nhúng trong các loại vi điều khiển và không có giao diện (GUI) tương tác với người dùng Chúng cần phản hồi nhanh bởi vì đa số các tác vụ tương tác với thiết bị, máy móc khác chứ không phải con người Các tài nguyên bên trong rất hữu hạn nên chỉ một sự chậm trễ cũng có thể làm hệ thống làm việc hoàn toàn sai lệch
1.2 Các thành phần trong RTOS và phương thức hoạt động:
+ Kernel hay còn gọi là Nhân có nhiệm vụ quản lý và điều phối các Task Mọi sự kiện
(Even) như ngắt, Timer, data truyền tới… đều qua Kernel xử lý để quyết định xem nên làm
gì tiếp theo Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp
+ Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì đó, được Kernel quản
lý Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của task sắp bị hủy và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:
• Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt systick)
• Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue, semaphore,…)
• Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải chờ cho hết time slice
Trang 5• Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task
Một task trong RTOS thường có các trạng thái như sau:
• RUNNING: đang thực thi
• READY: sẵn sàng để thực hiện
• WAITING: chờ sự kiện
• INACTIVE: không được kích hoạt
+ Scheduler – Lập lịch: Đây là 1 thành phần của kernel quyết định task nào được thực thi
Có một số luật cho scheduling như:
Cooperative: giống với lập trình thông thường, mỗi task chỉ có thể thực thi khi task
đang chạy dừng lại, nhược điểm của nó là task này có thể dùng hết tất cả tài nguyên của CPU
Round-robin: mỗi task được thực hiện trong thời gian định trước (time slice) và
không có ưu tiên
Priority base: Task được phân quyền cao nhất sẽ được thực hiện trước, nếu các task
có cùng quyền như nhau thì sẽ giống với round-robin, các task có mức ưu tiên thấp hơn sẽ được thực hiện cho đến cuối time slice
Priority-based pre-emptive: Các task có mức ưu tiên cao nhất luôn nhường các task
có mức ưu tiên thấp hơn thực thi trước
+ Kết nối Inter-task & Chia sẻ tài nguyên: để hệ thống hoạt động ổn định các task cần
phải kết nối và trao đổi dữ liệu với nhau để có thể chia sẻ tài nguyên, một số khái niệm cần lưu ý:
Trang 6Với Inter-task Communication:
• Signal Events – Đồng bộ các task
• Message queue – Trao đổi tin nhắn giữa các task trong hoạt động giống như FIFO
• Mail queue – Trao đổi dữ liệu giữa các task sử dụng hằng đợi của khối bộ nhớ Với Resource Sharing:
• Semaphores – Truy xuất tài nguyên liên tục từ các task khác nhau
• Mutex – Đồng bộ hóa truy cập tài nguyên sử dụng Mutual Exclusion
+ Signal event được dùng để đồng bộ các task, ví dụ như bắt task phải thực thi tại một sự
kiện nào đó được định sẵn Mỗi task có thể được gán tối đa là 32 signal event
+ Message queue – Hàng đợi tin nhắn là cơ chế cho phép các task có thể kết nối với nhau,
nó là một FIFO ( First In First Out) buffer được định nghĩa bởi độ dài (số phần tử mà buffer
có thể lưu trữ) và kích thước dữ liệu (kích thước của các thành phần trong buffer)
Task có thể ghi vào hằng đợi (queue)
• Task sẽ bị khóa (block) khi gửi dữ liệu tới một message queue đầy đủ
• Task sẽ hết bị khóa (unblock) khi bộ nhớ trong message queue trống
• Trường hợp nhiều task mà bị block thì task với mức ưu tiên cao nhất sẽ được unblock trước
Task có thể đọc từ hằng đợi (queue)
• Task sẽ bị block nếu message queue trống
• Task sẽ được unblock nếu có dữ liệu trong message queue
• Tương tự ghi thì task được unblock dựa trên mức độ ưu tiên
Trang 7+ Mail queue truyền dữ liệu sẽ được truyền dưới dạng khối(memory block) thay vì dạng
đơn Mỗi memory block thì cần phải cấp phát trước khi đưa dữ liệu vào và giải phóng sau khi đưa dữ liệu ra
Thao tác gửi dữ liệu với mail queue
1 Cấp phát bộ nhớ từ mail queue cho dữ liệu được đặt trong mail queue
2 Lưu dữ liệu cần gửi vào bộ nhớ đã được cấp phát
3 Đưa dữ liệu vào mail queue
Thao tác nhận dữ liệu trong mail queue bởi task khác
1 Lấy dữ liệu từ mail queue, sẽ có một hàm để trả lại cấu trúc/ đối tượng
2 Lấy con trỏ chứa dữ liệu
3 Giải phóng bộ nhớ sau khi sử dụng dữ liệu
Trang 8+ Semaphore Được sử dụng để đồng bộ task với các sự kiện khác trong hệ thống Có 2
loại:
Binary semaphore: Semaphore là một mã thông báo giống như một mã thông báo cho phép
một tác vụ thực hiện việc thực thi nếu tác vụ nhận được semaphore Nếu không, tác vụ vẫn
ở trạng thái khối và không thể thực thi trừ khi nó có được semaphore nhị phân
• Có duy nhất 1 token
• Chỉ có 1 hoạt động đồng bộ
Counting semaphore: đưa ra các Token cho các Task sử dụng tài nguyên, nếu tài nguyên
được sử dụng hết thì các Task còn lại sẽ phải chờ đến khi Tài nguyên được giải phóng trở lại Couting semaphore được dùng để:
• Count value là khác nhau giữa số sự kiện xảy ra và số sự kiện được thực thi
• Trong trường hợp counting event thì semaphore được khởi tạo giá trị đếm bằng 0 Resource management
• Count value sẽ chỉ ra số resource sẵn có
Trang 9• Để điều khiển và kiểm soát được resource của task dựa trên count value của semaphore(giá trị giảm), nếu count value giảm xuống bằng 0 nghĩa là không có resource nào free
• Khi một task finish với resource thì nó sẽ give semaphore trở lại để tăng count value của semaphore
• Trong trường hợp resouce management thì count value sẽ bằng với giá trị max của count value khi semaphore được tạo
+ Mutex: Sử dụng cho việc loại trừ (mutial exclution), hoạt động như là một token để bảo
vệ tài nguyên được chia sẻ Một task nếu muốn truy cập vào tài nguyên chia sẻ
• Cần yêu cầu (đợi) mutex trước khi truy cập vào tài nguyên chia sẻ (Sharing Resourse)
• Đưa ra token khi kết thúc với tài nguyên
Tại mỗi một thời điểm thì chỉ có 1 task có được mutex Những task khác muốn cùng mutex thì phải block cho đến khi task cũ thả mutex ra Về cơ bản thì Mutex giống như binary semaphore nhưng được sử dụng cho việc loại trừ chứ không phải đồng bộ
II, FreeRTOS
2.1 Tổng quan về FreeRTOS
- Để sử dụng được FreeRTOS, cách cơ bản nhất là bạn phải biết sử dụng các API(nói dễ
hiểu là các hàm được cung cấp sẵn) của nó, dưới đây là bảng tổng quan về các API của
FreeRTOS và mô tả cụ thể
Phân loại API FreeRTOS API Mô tả
Control task vTaskDelay Delay task
Trang 10Phân loại API FreeRTOS API Mô tả
vTaskPrioritySet Set quyền cho task
vTaskSuspend Suspend task
vTaskResume Tiếp tục task
Control kernel vTaskStartScheduler Start kernel scheduler
vTaskSuspendAll Suspend taats cả task
xTaskResumeAll Tiếp tục taất cả task
taskYIELD Foce chuyển đổi context
taskENTER_CRITICAL Vào critical section(dùng context switching)
taskEXIT_CRITICAL Thoát khỏi critical section
Messagequeues xQueueCreate Tạo một queue
xQueueSend Gửi data vào queue
xQueueReceive Nhận data từ queue
Semaphores xSemaphoreCreateBinary Tạo một binary semaphore
xSemaphoreCreateCounting Tạo một counting semaphore
xSemaphoreCreateMutex Tạo một mutex semaphore
xSemaphoreTake Take semaphore
xSemaphoreGive Give semaphore
Trang 11Phân loại API FreeRTOS API Mô tả
xTimerStart Start timer
Download thư viện FreeRTOS tại đây: https://freertos.org/
Link hướng dẫn cài đặt và cấu hình cơ bản kèm ví dụ:
https://laubugs.wordpress.com/2019/06/09/su-dung-rtos-phan-2/
- Một số cấu hình quan trọng:
Config option Mô tả
configUSE_PREEMPTION Enable Preemption
configTICK_RATE_HZ Tick rate (Hz)
configMAX_PRIORITIES Số lượng priority task tối đa
configTOTAL_HEAP_SIZE Tổng heap size cho dynamic allocation
Trang 12• Thẻ Config parameters cho phép ta có thể cấu hình cài đặt ban đầu những thứ liên
quan tới kernel và memory
• Thẻ Include parameters cho phép bật/tắt một số define về Task,Queue,
Semaphore,…
• Thẻ Tasks and Queue giúp ta có thể tạo/ thêm các task và queue
• Thẻ Timers and semaphores cho phép thêm Timers, Mutexes, Semaphore, có
Mutex và Binary Semaphore mặc định là có thể add thêm mới, với Recursive Mutexes cũng như Binary Semaphore để hiện được nút add thì cần phải enable các define ở thẻ Include parameters
• Thẻ User Constants để có thể thêm các constant của user có thể tự định nghĩa vào
- Khái niệm pre-emptive scheduling và co-operatieve scheduling: đây là 2 thuật toán dùng
để lập lịch, với các hệ thống hiện đại thì đều phụ thuộc vào các thuật toán lập lịch để thực hiện các tác vụ đa nhiệm hoặc ghép kênh(multiplexing) hiệu quả Những thuật toán này sẽ thực hiện thỏa hiệp để hoàn thành các mục tiêu cụ thể trong thời gian hạn hẹp
Với pre-emptive scheduling khi start hệ thống thì task sẽ tiếp tục chạy cho tới khi nó từ bỏ quyền kiểm soát, thường là ở thời điểm đồng bộ hóa của nó
Với co-operatieve scheduling thì sẽ giữ lại các thuộc tính như task, trạng thái của tas/ queue
và mức ưu tiên, task sẽ tiếp tục cho tới khi nó hoàn toàn từ bỏ quyền kiểm soát CPU, tuy nhiên task có thể bị ép phải dừng (suspend) bằng cách dùng ngắt của CPU
2.2 Các Task trong FreeRTOS
Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của task sắp bị hủy
và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:
• Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt systick)
• Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue, semaphore,…)
• Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải chờ cho hết time slice
Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task
- Task Switch: Kernel sẽ đảm nhiệm nhiệm vụ switch task, nó sẽ lưu lại context(trạng thái) hiện tại của task bị suspend và khôi phục lại context của task đang được tiếp tục Kernel
Trang 13• Sau khi có định nghĩa trước về thời gian thực thi (execution time), thời gian time slide được lấy bởi systick interrupt
• Khi có event unblock quyền ưu tiên cao hơn (higher priority) xảy ra như signal,queue, semaphore,
• Khi task gọi hàm osThreadYield () để thông báo kernel chuyển sang task khác mà không đợi tới kết thúc của time slice
- FreeRTOS OS interrupt: Với các core Cortex đã implement một số tính năng giúp hỗ trợ can thiệp trực tiếp vào os hệ thống, 2 ngắt chuyên dụng cho os là
+ PendSV interrupt:
• Trong interrupt này là một scheduler
• Quyền ngắt NVIC sẽ ở mức thấp nhất
• Không bị trigger bởi bất kì ngoại vi nào
• Trạng thái chờ xử lý từ các ngắt khác hoặc từ các task muốn kết thúc sớm(non MPU version)
+ SVC interrupt
• Interrupt sẽ được gọi bởi các tập lệnh SVC
• Được gọi nếu task muốn kết thúc sớm (MPU version)
• Trong ngắt này sẽ set pending state (MPU version)
- Stack pointer: 2 stack pointer là
+ Process stack pointer
• Được sử dụng trong các interrupt
• Cấp phát bởi linker trong quá trình compile
+ Main stack pointer
• Mỗi task sẽ có stack pointer của chính nó
• Trong quá trình switch context thì stack pointer sẽ khởi tạo task chính xác
- Mức độ ưu tiên của task có thể được thay đổi bằng cách dùng hàm osThreadSetPriority() Với CMSIS-RTOS thì sẽ có một số priority level như sau:
Trang 143.1 Giới thiệu sơ lược:
- STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng như F0,F1,F2,F3,F4… Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3 STM32F103 là
vi điều khiển 32 bit, tốc độ tối đa là 72Mhz
- Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng dụng thông thường, máy tính và thiết bị ngoại vi chơi game, GPS cơ bản, các ứng dụng trong công nghiệp, thiết bị lập trình PLC, biến tần, máy in, máy quét, hệ thống cảnh báo, thiết bị liên lạc nội bộ…
- Phần mềm lập trình: có khá nhiều trình biên dịch cho STM32 như IAR Embedded Workbench, Keil C…
- Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như: STM32snippets, STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries, Mbed core
- Mạch nạp: có khá nhiều loại mạch nạp như : ULINK, J-LINK , CMSIS-DAP, STLINK…
- Sơ lược về Board trên:
• 1 cổng Mini USB dùng để cấp nguồn, nạp cũng như debug
Trang 15• 2 MCU bao gồm 1 MCU nạp và 1 MCU dùng để lập trình
• Có chân Output riêng cho các chân mạch nạp trên MCU1
• Có chân Output đầy đủ cho các chân MCU2
• Chân cấp nguồn ngoài riêng cho MCU2 nếu không sử dụng nguồn từ USB
• Thạch anh 32,768khz dùng cho RTC và Backup
• Chân nạp dùng cho chế độ nạp boot loader
• Nút Reset ngoài và 1 led hiển thị trên chân PB9, 1 led báo nguồn cho MCU2
3.2 Cấu hình chi tiết của STM32F103C8T6:
Minh họa các chân nối quanh các cạnh của PCB, bao gồm cả nguồn
Trang 16Nguồn có thể được cấp vào các chân +5V, +3.3V hoặc cổng USB, với điện áp phù hợp
Chân được đánh dấu là “5V” (không có dấu cộng) là các chân input chịu được áp 5V Chân được đánh dấu bằng dấu cộng là chân input nguồn
Bốn chân ở đầu trên cùng của board (màu xanh đậm) được dùng để lập trình thiết bị Lưu
ý rằng chân lập trình DIO cũng có khả năng là một chân GPIO PA13 Tương tự như vậy, DCLK có khả năng trở thành một chân GPIO PA14 Xuyên suốt quyển sách này, bạn sẽ học cách cấu hình cho chip STM32
Ở chân lập trình, lưu ý rằng điện áp cấp vào là +3.3V Về mặt điện, chân này tương tự như các chân khác có nhãn “+3.3V” Trong hình trên, chúng có màu cam nhạt
Power USB/+5V khi được cấp nguồn bằng cáp USB, nguồn sẽ đến bằng đầu nối
Micro-USB B Nguồn cấp 5V này được điều chỉnh thành +3.3V mà MCU cần Tương tự, một chân có nhãn “+5V” (với dấu cộng), có thể được sử dụng như một chân nguồn vào Dòng này cũng đến cùng bộ điều áp như dòng được cấp qua cổng USB
Nếu có Nguồn cấp +3.3V, có thể để ngỏ các chân input +5V Nối trực tiếp nguồn cấp +3.3V với chân input +3.3V (đảm bảo rằng không cắm cáp USB) Cách này dùng được vì bộ điều
áp tự vô hiệu hóa khi không có gì cấp vào chân input 5V
Khi cấp nguồn cho vào chân input +3.3V, chính là đang nối nguồn với đầu VOUT của bộ điều áp Trong trường hợp này, không có nguồn 5V nào chạy vào VIN của bộ điều áp Chân CE cũng được nối với VIN, nhưng khi VIN để hở, chân CE sẽ được nối đất qua một
tụ điện Mức áp thấp trên CE làm cho bộ điều áp tắt các hệ thống con bên trong nó
Sơ đồ khối của bộ điều áp 5V sang 3.3V
Tuy nhiên, có một dòng điện nhỏ đi vào bộ chiết áp của bộ điều áp Dòng điện này sẽ đi từ +3.3V của bạn xuống đất, thông qua các điện trở nội R1 và R2 của bộ điều áp Các điện