1. Trang chủ
  2. » Tất cả

đọc giá trị nhiệt độ, độ ẩm hiện thị lcd20x4 làm đồng hồ bấm giờ dùng rtc stm32f103 trên hệ điều hành thời gian thực freertos

20 24 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 1,27 MB
File đính kèm file dinh kem.rar (11 MB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG BÁO CÁO BTL MÔN ĐỒ ÁN HỆ THỐNG NHÚNG Giảng viên giảng dạy Nguyễn Ngọc Minh LỜI MỞ ĐẦU Lời đầu tiên nhóm em xin cảm ơn thầy Minh đã.

Trang 1

BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG



-BÁO CÁO BTL MÔN: ĐỒ ÁN HỆ THỐNG NHÚNG

Giảng viên giảng dạy:Nguyễn Ngọc Minh

Trang 2

LỜI MỞ ĐẦU

Lời đầu tiên nhóm em xin cảm ơn thầy Minh đã giảng dạy và giúp đỡ cả lớp trong suốt quá trình kì học vừa qua, để chúng em có thể tiếp cận gần hơn với chuyên ngành, đặc biệt là về mảng điện tử Qua những bài giảng, bài tập và bài tập lớn, chúng em đã được tiếp cận gần gửi hơn về chuyên ngành trong thực tế hiện tại.

Trong quá trình làm đồ án chắc chắn em còn mắc phải nhiều sai sót rất mong các thầy cô bỏ qua Đồng thời, với kinh nghiệm và kiến thức còn hạn chế em xin sự đóng góp từ thầy cô để đồ án của em được hoàn thiện hơn.

Chúng em xin chân thành cảm ơn ạ !!!

Trang 3

MỤC LỤC

A ĐỀ TÀI VÀ TRIỂN KHAI ĐỀ TÀI 4

I Các task vụ 4

II Sơ đồ thực hiện 5

B Tìm Hiểu về Hệ điều hành Thời gian thực FREERTOS 5

I Mở đầu 5

II Rtos là gì? 5

III Hệ điều hành thời gian thực FREERTOS với hệ điều hành thông thường khác nhau ở đâu ? 5

VI Một số khái niệm về Hệ điều hành thời gian thực FreeRTOS 6

V.Cách tạo ra 1 task trong keilCV5 7

VI Tiện Ích của FREERTOS 9

VII Thực hiện tác vụ 9

VIII.Tin nhắn hàng đợi 9

IX Semaphore và Mutex 10

X TIMER 10

XI Nhóm EVENT 10

C Giới thiệu về các module dùng Trong đề tài 11

I DHT11 11

II Đồng Hồ RTC trong STM32 12

1 RTC là gì ? 12

2 Ưu nhược điểm của RTC on chip so với các IC RTC khác như DS3231, DS1307 12

3 Các thông số chính của STM32 RTC 12

4 Các chức năng cơ bản của bộ RTC: 13

5 Cấu tạo trong lòng RTC và các nguồn 13

6 Một Số thanh ghi quan trọng 14

D ĐÚC KẾT ĐỀ TÀI VÀ DEMO SẢN PHẨM 15

Trang 4

A ĐỀ TÀI VÀ TRIỂN KHAI ĐỀ TÀI

I Các task vụ

Gồm 2 task Vụ :

- Task 1: Hiện thị đồng hồ thời gian ( Giờ phút giây ) Lên LCD 20x4 :

- Task 2: Hiện Thị nhiệt độ Độ ẩm lên LCD 20x4

( 2 task Sử dụng chung 1 LCD20x4)

Lập trình trên KID STM32F103 Trên Hệ Điều Hành thời gian thực FREERTOS

II Sơ đồ thực hiện

B Tìm Hiểu về Hệ điều hành Thời gian thực FREERTOS

I Mở đầu

Có rất nhiều hệ điều hành thời gian thực được phát triển như RxTiny 8051, uRTOS, TI RTOS, Sau một thời gian dài tìm hiểu và làm project nhóm mình nhận thấy sử dụng và làm quen FreeRTOS rất dễ, support có sẵn example tài liệu khá đầy đủ Vì vậy, hôm nay mình giới thiệu hệ điều hành FreeRTOS và chia sẻ kinh nghiệm để FreeRTOS hoạt động ổn định

LCD_20x4

RTC : Đồng hồ

Hẹn giờ

DHT11

STM32F103 (FREERTOS)

Trang 5

FreeRTOS được tạo ra khá lâu rồi và hỗ trợ port sang STM32, AVR, PIC, TI… (TI cũng có hệ điều hành riêng xây dựng dựa trên các hàm nhân Linux nhưng về cơ bản các hàm hoạt động giống nhau) Gần đây FreeRTOS được Amazon mua lại Licence và phát triển thêm tính năng và giữ nguyên Kernel

do FreeRTOS dần phổ biến và ổn định hơn

II Rtos là gì?

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) Để hiểu rõ ràng nó là gì trước hết hãy làm rõ khái niệm về hệ điều hành đã

Hệ điều hành (tiếng Anh: Operating System – viết tắt: OS) là một phần

mềm dùng để điều hành, quản lý toàn bộ tất cả thành phần (bao gồm cả phần cứng và phần mềm) của thiết bị điện tử

Nói đơn giản, hệ điều hành giống như hội đồng quản trị vậy Họ có quyền quyết định ai làm gì và thời gian như thế nào Các nhân viên cũng như các ứng dụng, nhận lệnh của cấp trên và thực thi các công việc theo đúng chức năng của mình.

III Hệ điều hành thời gian thực FREERTOS với hệ điều hành thông thường khác nhau ở đâu ?

 Hệ điều hành thông thường (non-realtime): như Window, linux, android, ios… chính là thứ mà chúng ta sử dụng hằng ngày Khi mở một phần mềm trên đó, có thể bạn phải chờ nó tải rất lâu, việc chờ đợi này cũng không ảnh hưởng gì cả Bởi vì đa số phần mềm đó tương tác với con người chứ ít tương tác với các phần mềm hoặc thiết bị khác

 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

Bạn cứ thử tưởng tượng một hệ điều hành đang chạy các tác vụ điều khiển tên lửa mà độ trễ chỉ 2s Với tốc độ của tên lửa cũng có thể bắn lệch từ Hà Nội thành TP Hồ Chí Minh rồi

Trang 6

Thực tế hệ điều hành thời gian thực còn chia thành 2 loại:

 Soft-realtime: Sử dụng cho các ứng dụng cruise control (điều khiển hành trình) trong ô tô và các ứng dụng viễn thông

 Hard-realtime: Sử dụng trong các ứng dụng điều khiển máy bay, động cơ điện

VI Một số khái niệm về Hệ điều hành thời gian thực FreeRTOS

Trước khi bắt đầu làm việc với FreeRTOS ngoài việc nắm rõ các hàm sử dụng nó, chúng ta cũng nên nắm rõ một số cài đặt cơ bản nhưng cực kì quan trọng

HeapSize: là size của data trên RAM cần để lưu trữ khi bạn khai báo biến

hay mảng trong chương trình chính hoặc chương trình con

StackSize: là size của data lưu trữ giá trị back up hiện tại của thanh ghi bao

gồm cả con trở stack pointer(PC) khi chương chình gọi một chương trình con khác và sẽ trả lại bộ nhớ đó khi thực hiện xong chương trình con

Nếu StackSize không đủ nó sẽ ghi data cả vào phần của HeapSize gây ra

stackoverflow và xảy ra lỗi Hardfult tạo ra ngắt nhảy vào Hardfult Handler Lúc này chương trình sẽ bị treo cho đến khi khởi động lại

Cài đặt trong project

Vì project nhóm khá lớn (dùng mảng lớn lưu dữ liệu) vì vậy mình đặt Heap_Size = 0x4000 = 16Kb nên bạn cài đặt dùng hết số RAM này trong FreeRTOS Và được trình dịch compile tính toán sử dụng trong khi biên dịch và được hệ điều hành sử dụng trong runtime Bạn Heap_Size và Stack_Size trong file FreeRTOSConfig.h

Đối với Stask_Size: là stack size được dùng trong mỗi Task thường mình để

mặc định 128byte hoặc lớn hơn tùy vào số chương trình con gọi liên tiếp trong mỗi task. Theo kinh nghiệm của mình mỗi Task sẽ tốn khoảng 800byte Heap +128 byte stack RAM sử dụng

FreeRTOS chia thành các Task  xử lý riêng biệt sử dụng ngắt SystemStick Timer làm xung clock Như vậy cứ mỗi khi xảy ra ngắt SystemStick hệ điều hành sẽ tính toán chuyển task dựa trên mức cài đặt ưu tiên hoặc công việc thực hiện tiếp theo như vậy sẽ không dùng SystemStick để làm delay như bình thường được

Trang 7

Cài đặt xung clock cho hệ điều hành

#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )    

#define configTICK_RATE_HZ ( ( TickType_t ) 100000 ) //100Khz

ConfigCPU_CLOCK_HZ : cài đặt xung clock của CPU chip cấp cho hệ điều hành, mình dùng STM32F103-> xung max 72Mhz

configTICK_RATE_HZ: Tần số chuyển task hay tần số ngắt SystemStick, ở đây mình đặt 100Khz

-> CPU còn 72000000/100000 = 720 xung để xử lý công việc Theo mình mức này là mức cao nhất hệ điều hành có thể chạy được Nếu không có yêu cầu đặc biệt bạn nên  để giá trị configTICK_RATE_HZ = 1000

Lưu ý: Đối với STM32, khi sử dụng ngắt bạn phải config NVIC group 4 như vậy SubPriority = 0 và PreemPriority = 4bit vì bản chất của PreemPriority là

xử lý chương trình ngắt chồng ngắt tức trong khi công việc trong ngắt hiện tại chưa xong(ví dụ chờ delay) chip có thể thực hiện công việc trong ngắt khác mức ưu tiên cao hơn, cho phép hệ điều hành chuyển task xử lý công việc quan trọng hơn

#define configUSE_PREEMPTION 1

Các phần cài đặt sau sử dụng trong hệ điều hành Mục đích chủ yếu giảm bộ nhớ build code, nếu code sử dụng hàm có liên quan bạn đặt giá trị 1 nếu không sử dụng bạn để giá trị 0

#define INCLUDE_vTaskPrioritySet 1 //Sử dụng Task Priority

#define INCLUDE_uxTaskPriorityGet 1 //Sử dụng hàm get Task Priority

#define INCLUDE_vTaskDelete 1 //Sử dụng hàm Delete task ví dụ: vTaskDelete(xStartTaskHandle);

#define INCLUDE_vTaskCleanUpResources 0

#define INCLUDE_vTaskSuspend 1 //Sử dụng hàm vTaskSuspend

#define INCLUDE_vTaskDelayUntil 0

Trang 8

#define INCLUDE_vTaskDelay 1 //Sử dụng hàm vTaskDelay

V.Cách tạo ra 1 task trong keilCV5

Trong ví dụ này nhóm mình tạo 4 task led nháy với tần số khác nhau (tần số xung nhịp của hệ điều hành 1Khz cài đặt tại file FreeRTOSConfig.h)

Ban đầu mình sử dụng 4 task mỗi task điều khiển một led như sau

Tiếp theo trong hàm main,bạn tạo task bằng hàm xTaskCreate  và chạy task

đã tạo sử dụng vTaskStartScheduler();

xTaskCreate(vTaskLed1,( const char * ) “Task LED 1”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT

xTaskCreate(vTaskLed2,( const char * ) “Task LED 2”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT

xTaskCreate(vTaskLed3,( const char * ) “Task LED 3”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT

xTaskCreate(vTaskLed4,( const char * ) “Task LED 4”,configMINIMAL_STACK_SIZE,NULL,mainFLASH_TASK_PRIORIT Y,( xTaskHandle * ) NULL);

Trang 9

Hàm xTaskCreate sẽ gồm các para input:

vTaskLed1: Chương trình mình muốn tạo task mới

( const char * ) “Task LED 1”: Tên task bạn đặt số kí tự max được định

configMAX_TASK_NAME_LEN ( 16 )

configMINIMAL_STACK_SIZE: giá trị stack size bạn sử dụng với task đó

ở đây stack size bằng 128byte Với mỗi byte stack size FreeRTOS sẽ lấy 4byte của RAM để back up giá trị của một trong các thanh ghi R0-R15 32bit

sẽ tốn 128*4 = 512byte RAM Khi sử dụng nhiều Task khác nhau nếu gọi chương trình còn nhiều bạn sẽ cần nhiều stack_size hơn Vì vậy cần tính toán sơ bộ và cài đặt lại stack size trong file startup

mainFLASH_TASK_PRIORITY: Mức ưu tiên của hệ điều hành max là 255 được định nghĩa trong file FreeRTOSConfig.h  #define configKERNEL_INTERRUPT_PRIORITY 255)

( xTaskHandle * ) NULL: Có tác dụng trong việc tạm dừng, xóa task Trong các bài tiếp theo mình sẽ dùng đến biến đầu vào này

Lưu ý: Nếu bạn lấy file startup từ code ví dụ của FreeRTOS build sẽ chạy Nhưng nếu bạn lấy file startup trực tiếp từ thư viện CMSIS StdPeriph_Driver , ta cần phải chỉnh sửa lại một chút

Vấn đề ở chỗ trong file port.c của FreeRTOS dùng 3 ngắt phục vụ cho việc tính toán chuyển task sẽ khác tên 3 ngắt định nghĩa trong bảng vector ngắt file startup

VI Tiện Ích của FREERTOS

Điều gì làm cho một RTOS đáng mong đợi? Nó cung cấp cái gì? Hãy xem xét một số danh mục dịch vụ chính được tìm thấy trong FreeRTOS:

 Đa nhiệm và lập lịch trình

 Hàng đợi tin nhắn (Message queues)

 Semaphoresvà mutex

 Timer

Trang 10

 Nhóm sự kiện (Event groups)

VII Thực hiện tác vụ

Với FreeRTOS (một RTOS), các hàm logic được đặt vào các tác vụ riêng biệt chạy độc lập Một tác vụ có thể chịu trách nhiệm đọc và tính toán nhiệt

độ hiện tại Một tác vụ khác có thể chịu trách nhiệm thể hiện nhiệt độ được tính toán cuối cùng đó Trong thực tế, nó sẽ trở thành một hai chương trình chạy song song cùng một lúc

Đối với các ứng dụng đơn giản, phí tổn của việc lên lịch tác vụ có thể là quá cao Tuy nhiên, khi độ phức tạp tăng lên, lợi ích của việc phân chia vấn đề thành các tác vụ trở nên rõ rệt hơn nhiều

FreeRTOS rất linh hoạt Nó cung cấp hai loại lập lịch trình tác vụ:

 Ưu tiên đa tác vụ

 Hợp nhất đa tác vụ (coroutines)

Với tính năng đa tác vụ ưu tiên, một tác vụ sẽ chạy cho đến khi nó hết thời gian, hoặc bị chặn, hoặc cần kiểm soát rõ ràng Bộ lập lịch trình tác vụ sẽ sắp xếp tác vụ chạy tiếp sau, có tính đến các ưu tiên Đây là loại tác vụ đa nhiệm sẽ được sử dụng trong các dự án của cuốn sách này

Một dạng đa nhiệm khác là coroutines Sự khác biệt là tác vụ hiện tại chạy cho đến khi nó từ bỏ quyền kiểm soát Không có phân chia thời gian hoặc thời gian chờ Nếu không có hàm gọi nào chặn (như một mutex), thì một coroutine phải gọi một hàm yield để chuyển quyền kiểm soát với một tác vụ khác Bộ lập lịch trình tác vụ sau đó sẽ quyết định tác vụ nào sẽ chuyển quyền kiểm soát sang bước tiếp theo Hình thức lập chương trình này là cần phải có cho các ứng dụng yêu cầu an toàn cao sẽ kiểm soát chặt chẽ thời gian CPU

VIII.Tin nhắn hàng đợi

Ngay sau khi bạn áp dụng đa tác vụ, bạn thừa hưởng một vấn đề về giao tiếp Sử dụng ví dụ đọc nhiệt độ, tác vụ đọc nhiệt độ an toàn truyền giá trị đến tác vụ phát nhiệt độ như thế nào? Nếu nhiệt độ được lưu trữ là bốn byte, làm thế nào để bạn truyền giá trị đó mà không bị gián đoạn? Tính đa nhiệm

ưu tiên có nghĩa là việc sao chép bốn byte dữ liệu đến một vị trí khác có thể

bị gián đoạn một phần

Trang 11

Một cách khá thô để giải quyết vấn đề này là ngăn chặn gián đoạn trong khi sao chép nhiệt độ của bạn đến một vị trí được sử dụng bởi tác vụ phát sóng Nhưng cách tiếp cận này có thể không thể chấp nhận được nếu bạn thường xuyên bị gián đoạn Vấn đề trở nên tồi tệ hơn khi các đối tượng được sao chép có kích thước tăng

Hàng đợi tin nhắn trong FreeRTOS cung cấp một cách an toàn để truyền thông tin hoàn chỉnh Hàng đợi tin nhắn đảm bảo rằng chỉ nhận được tin nhắn đầy đủ Ngoài ra, nó giới hạn độ dài của hàng đợi sao cho tác vụ gửi không thể sử dụng hết bộ nhớ Bằng cách sử dụng độ dài hàng đợi được xác định trước, tác vụ thêm thông báo sẽ bị chặn cho đến khi không gian có sẵn Khi một tác vụ bị chặn, công cụ lập lịch trình tác vụ sẽ tự động chuyển sang một tác vụ khác đã sẵn sàng thực thi, thao tác này có thể xóa các tin nhắn khỏi cùng một hàng đợi đó Độ dài cố định cho hàng đợi tin nhắn một dạng điều khiển dòng

IX Semaphore và Mutex

Trong khi thực hiện một hàng đợi, có một thao tác mutex tại đó Quá trình thêm tin nhắn có thể yêu cầu một số hướng dẫn để hoàn thành Tuy nhiên, trong một hệ thống đa tác vụ ưu tiên, có thể một tin nhắn được thêm một nửa trước khi bị gián đoạn để thực hiện một tác vụ khác

Trong FreeRTOS, hàng đợi được thiết kế để có các tin nhắn được thêm vào theo cách nguyên tử Để thực hiện điều này, một số loại thiết bị mutex được

sử dụng đằng sau chương trình Mutex là một thiết bị tất cả hoặc không có

gì Bạn có khóa hay không

Tương tự như mutex, có semaphore Trong một số tình huống mà bạn muốn giới hạn một số yêu cầu nhất định, ví dụ, một semaphore có thể quản lý nó theo cách nguyên tử Ví dụ, nó có thể cho phép một giá trị tối đa là ba Sau

đó, tối đa ba yêu cầu “nhận” sẽ thành công Các yêu cầu “nhận” bổ sung sẽ chặn cho đến khi một hoặc nhiều yêu cầu “cung cấp” đã được thực hiện để trả lại khoảng trống

X TIMER

Timer quan trọng đối với nhiều ứng dụng, bao gồm cả chương trình nhấp nháy Khi bạn có nhiều tác vụ tốn thời gian CPU, một delay không chỉ không đáng tin cậy, mà nó còn lấy đi các tác vụ khác của thời gian CPU, cái

có thể được sử dụng hiệu quả hơn

Trang 12

Trong hệ thống RTOS, thường có một ngắt “systick” giúp quản lý thời gian Cái ngắt systick này không chỉ theo dõi số lượng hiện tại của “ticks” được phát hành cho đến nay, mà còn được sử dụng bởi các bộ lập lịch trình tác vụ

để hoán đổi các tác vụ

Trong FreeRTOS, bạn có thể chọn delay việc thực hiện bằng một số tick được chỉ định Điều này hoạt động bằng cách đánh dấu “thời gian đánh dấu” hiện tại và phát triển cho một tác vụ khác cho đến khi thời gian đánh dấu bắt buộc đã đến Bằng cách này, độ chính xác của delay chỉ giới hạn trong khoảng thời gian được chọn được định cấu hình Nó cũng cho phép các tác

vụ khác thực hiện công việc thực sự cho đến khi đúng thời điểm đến

FreeRTOS cũng có tiện ích timer “ảo” (software timer) có thể được tạo ra Chỉ khi bộ đếm thời gian hết hạn là hàm callback được thực hiện Cách tiếp cận này là bộ nhớ tiết kiệm bởi vì tất cả các bộ định thời gian sẽ sử dụng cùng một ngăn xếp

XI Nhóm EVENT

Một vấn đề thường xảy ra là một tác vụ có thể cần phải theo dõi nhiều hàng đợi cùng một lúc Ví dụ, một tác vụ có thể cần phải chặn cho đến khi một tin nhắn đến từ một trong hai hàng đợi khác nhau FreeRTOS cung cấp cho việc tạo ra “bộ hàng đợi.” Điều này cho phép một tác vụ chặn cho đến khi một tin nhắn từ bất kỳ hàng đợi trong tập hợp có một tin nhắn

Điều gì về các event do người dùng xác định? Các nhóm event có thể được tạo để cho phép các bit nhị phân đại diện cho một event Khi được thiết lập, API FreeRTOS cho phép một tác vụ đợi cho đến khi một sự kiện kết hợp cụ thể xảy ra Các sự kiện có thể được kích hoạt từ code tác vụ thông thường hoặc từ bên trong một ISR (interrupt service routine: dịch vụ ngắt)

C Giới thiệu về các module dùng Trong đề tài

I DHT11

Ngày đăng: 16/11/2022, 21:40

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w