- Giao tiếp nối tiếp trên STM8S103F3P6
- Các chân giao tiếp nối tiếp trên STM8S103F3P6
- Sơ đồ mạch cho giao tiếp nối tiếp STM8S
- Thiết lập STVD cho giao tiếp nối tiếp
- Lập trình STM8S cho giao tiếp nối tiếp
- Điều khiển đèn LED từ màn hình nối tiếp
- Thư viện nối tiếp STM8S Giao diện sâu hơn
Lập trình một bộ vi điều khiển mới thường mất nhiều thời gian hơn do các phương pháp xử lý thanh ghi mới và không biết bit nào thực hiện chính xác những gì. Điều tương tự cũng xảy ra đối với việc gỡ lỗi mà không cần nói. Đây là lý do tại sao các lập trình viên thường sử dụng các điểm ngắt trong mã của họ và bước qua nó bằng cách sử dụng trình gỡ lỗi. Nhưng sử dụng trình gỡ lỗi có thể cần phần cứng bổ sung (đắt tiền nhất) và cũng cần thêm thời gian. Là một cậu bé hâm mộ Arduino, một điều mà tất cả chúng ta có thể đồng ý là sử dụng các câu lệnh in nối tiếp để gỡ lỗi và hiểu mã của chúng ta giúp cuộc sống dễ dàng hơn rất nhiều. Điều gì chúng ta có thể sao chép giống nhau trên STM8s với trình biên dịch C vũ trụ và thư viện SPL? Chà, rất có thể, và đó chính xác là những gì chúng ta sẽ làm trong hướng dẫn thứ ba này của loạt bài hướng dẫn của chúng ta.Bạn cũng kiểm tra cách bắt đầu với STM8S (hướng dẫn 1) và STM8S GPIO điều khiển (hướng dẫn 2) nếu bạn hoàn toàn mới ở đây. Ngoài ra, chúng tôi cũng đã khám phá khả năng Lập trình STM8S với Arduino để bắt đầu nhanh. Tất cả những gì đang được nói hãy đi vào hướng dẫn.
Giao tiếp nối tiếp trên STM8S103F3P6
Từ biểu dữ liệu của STM8S103F3P6, chúng ta có thể thấy rằng bộ điều khiển 8 bit của chúng tôi hỗ trợ giao tiếp UART ở nhiều chế độ khác nhau. Bộ điều khiển cũng có một chân đầu ra xung nhịp cho giao tiếp UART đồng bộ và cũng có thể hỗ trợ SmarCard, IrDA và LIN. Nhưng chúng tôi sẽ không khám phá điều đó trong hướng dẫn này chỉ để tránh xa sự phức tạp. Chúng ta sẽ học cách đọc và ghi UART đơn giản.
Hướng dẫn này cũng cung cấp một tệp tiêu đề được gọi là stm8s103 serial.h bằng cách sử dụng nó, bạn có thể thực hiện các lệnh UART đơn giản như Serial begin, Serial read, serial print, v.v. Về cơ bản, bạn sẽ có thể in char, int và string vào màn hình nối tiếp và cũng đọc ký tự từ màn hình nối tiếp. Ở cuối hướng dẫn này, bạn sẽ có thể điều khiển đèn LED từ màn hình nối tiếp và nhận phản hồi về trạng thái của đèn LED. Tệp tiêu đề được đề cập ở trên phụ thuộc vào các thư viện SPL, vì vậy hãy đảm bảo rằng bạn đã làm theo hướng dẫn bắt đầu.
Các chân giao tiếp nối tiếp trên STM8S103F3P6
Hãy bắt đầu từ phía phần cứng. Nhìn sơ qua các sơ đồ chân trên vi điều khiển STM8S103F3P6 dưới đây, chúng ta có thể thấy rằng các chân 1, 2 và 3 sẽ được sử dụng cho giao tiếp UART.
Trong số ba, chân 1 là chân đồng hồ UART sẽ chỉ được sử dụng trong giao tiếp UART đồng bộ, vì vậy chúng ta sẽ không cần nó ở đây. Chân 2 là chân Bộ phát UART và Chân 3 là chân Bộ thu UART. Lưu ý rằng các chân này cũng có thể tăng gấp đôi như một chân analog hoặc chân GPIO thông thường.
Sơ đồ mạch cho giao tiếp nối tiếp STM8S
Sơ đồ mạch ở đây rất đơn giản, chúng ta cần kết nối ST-LINK 2 để lập trình và bộ chuyển đổi USB sang TTL để đọc dữ liệu nối tiếp. Xin lưu ý rằng bộ điều khiển STM8S của chúng tôi hoạt động ở mức logic 3.3V, vì vậy hãy đảm bảo rằng bộ chuyển đổi USB sang TTL của bạn cũng hỗ trợ logic 3.3V. Sơ đồ mạch hoàn chỉnh được hiển thị bên dưới.
Bạn phải kết nối ST-link của mình trong một cổng USB và bộ chuyển đổi USB sang TTL trong một cổng USB khác của máy tính xách tay để bạn có thể lập trình và giám sát dữ liệu cùng một lúc. Kết nối UART rất đơn giản, chỉ cần kết nối mặt đất và chân Rx / Tx của vi điều khiển STM8S của bạn với chân Tx / Rx của bộ chuyển đổi USB sang TTL. Ở đây tôi đã cấp nguồn cho bộ điều khiển bằng chân Vcc của ST-Link và để chân vss của bộ chuyển đổi TTL mở, bạn cũng có thể làm điều này theo cách khác. Có nhiều loại bộ chuyển đổi USB sang TTL trên thị trường, chỉ cần đảm bảo rằng nó có thể hoạt động trên tín hiệu Logic 3.3V và tìm kiếm các chân Tx, Rx và GND đơn giản và thực hiện kết nối như hình trên. Thiết lập phần cứng của tôi được hiển thị bên dưới.
Để thực hiện một cách giao tiếp nối tiếp, chúng tôi đã cung cấp tệp tiêu đề STM8S_Serial.h . Sử dụng tệp tiêu đề này, bạn có thể thực hiện các chức năng đơn giản như Arduino để giao tiếp nối tiếp.
Bạn có thể tìm thấy tất cả các tệp cần thiết cho dự án này trên trang STM8S103F3_SPL Github của chúng tôi. Nếu bạn chỉ cần tệp tiêu đề cụ thể này, bạn có thể tải xuống từ liên kết bên dưới.
Tải xuống STM8S_Serial.h
Thiết lập STVD cho giao tiếp nối tiếp
Để làm việc với giao tiếp nối tiếp, chúng ta sẽ sử dụng nhiều hàm bằng cách sử dụng hàm tệp tiêu đề STM8S_Serial.h mà chúng ta đã thảo luận trước đó. Nhưng thư viện có các phụ thuộc khác, nhiều tệp tiêu đề và C liên quan đến SPL UART và Clock. Vì vậy, từ thời điểm này, tốt hơn là nên bao gồm tất cả các tệp tiêu đề và C vào dự án của chúng tôi để tránh lỗi biên dịch. Môi trường làm việc STVD của tôi trông như thế này.
Đảm bảo rằng bạn đã bao gồm tất cả các tệp nguồn SPL và Bao gồm tệp như chúng tôi đã làm trong hướng dẫn đầu tiên của mình. Và cũng đảm bảo rằng bạn đã thêm tệp tiêu đề stm8s103_serial.h . Không có tệp C cho tiêu đề này.
Lập trình STM8S cho giao tiếp nối tiếp
Khi thiết lập dự án STVD đã sẵn sàng, chúng ta có thể bắt đầu viết mã của mình trong tệp main.c. Có thể tìm thấy mã hoàn chỉnh cho hướng dẫn này ở cuối trang này. Lời giải thích như sau.
Bước đầu tiên là bao gồm các tệp tiêu đề bắt buộc, ở đây tôi đã thêm tệp tiêu đề chính (stm8s) và tệp tiêu đề stm8s_103_serial mà chúng ta vừa tải xuống.
// Tiêu đề Bắt buộc #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Tiếp theo, chúng tôi đang sử dụng macro thiết kế để chỉ định các chân đầu vào và đầu ra. Ở đây sẽ chỉ điều khiển đèn LED trên bo mạch được kết nối với chân 5 của cổng B, vì vậy chúng tôi đặt tên cho nó là test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // đèn LED kiểm tra được kết nối với PB5
Tiếp tục bên trong hàm chính, chúng ta sẽ xác định chân như một đầu ra. Nếu bạn chưa quen với các chức năng GPIO cơ bản, hãy quay lại hướng dẫn GPIO STM8S.
// Pin defanitions // Khai báo PB5 dưới dạng push pull Chân đầu ra GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Sau đó, chúng tôi khởi tạo các cổng giao tiếp nối tiếp của mình ở tốc độ 9600 baud. Đối với những người mới, 9600 là tốc độ truyền các bit dữ liệu trong quá trình giao tiếp. Nếu bạn đặt 9600 ở đây, bạn cũng phải đặt tương tự trên phần mềm giám sát. Sau đó, chúng tôi cũng in một chuỗi “Nhập lệnh” và chuyển sang dòng tiếp theo.
Serial_begin (9600); // Khởi tạo giao tiếp Serial ở tốc độ 9600 baud Serial_print_string ("Nhập lệnh"); // in ra một chuỗi Serial_newline (); // chuyển sang dòng tiếp theo
Chuyển sang vòng lặp while vô hạn, chúng tôi sử dụng hàm Serial_available để kiểm tra xem có bất kỳ dữ liệu nối tiếp nào đến không. Nếu có, chúng tôi đọc và lưu nó trong một biến gọi là ch và cũng in tương tự bằng cách sử dụng Serial_print . Sau đó, nếu giá trị nhận được là 0, chúng tôi sẽ tắt đèn LED và nếu là 1, chúng tôi sẽ bật đèn LED
if (Serial_available ()) {Serial_print_string ("Bạn đã nhấn:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED TẮT if (ch == '1') GPIO_WriteLow (test_LED); // BẬT LED}
Với điều này, lập trình cho hướng dẫn này đã hoàn tất, chỉ cần tải lên mã được cung cấp ở cuối trang này và bạn sẽ có thể điều khiển đèn LED từ màn hình nối tiếp.
Điều khiển đèn LED từ màn hình nối tiếp
Khi bạn đã tải lên mã, bạn có thể mở bất kỳ màn hình nối tiếp nào với tốc độ 9600 baud. Tôi đã sử dụng màn hình nối tiếp Arduino để dễ sử dụng. Nhấn nút đặt lại và bạn sẽ thấy thông báo “Nhập lệnh”. Sau đó, nếu bạn nhập 1 và nhấn enter, đèn led trên bo mạch sẽ bật, tương tự với số 0, nó sẽ tắt.
Hoạt động hoàn chỉnh có thể được tìm thấy trong video được liên kết ở cuối trang này. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại trong phần bình luận. Bạn cũng có thể sử dụng diễn đàn của chúng tôi để đăng các câu hỏi kỹ thuật khác.
Thư viện nối tiếp STM8S Giao diện sâu hơn
Đối với những người tò mò muốn biết điều gì thực sự xảy ra bên trong tệp tiêu đề STM8S103F3_Serial, hãy đọc tiếp….
Tệp tiêu đề này hoạt động tốt cho lập trình ở cấp độ mới bắt đầu, nhưng nếu bạn đang sử dụng phiên bản khác của bộ điều khiển STM8S hoặc đang tìm kiếm một số tùy chọn nâng cao, bạn có thể muốn chỉnh sửa tiêu đề này một chút hoặc trực tiếp làm việc với các thư viện SPL. Tôi đã viết tệp tiêu đề này giống như một bản tóm tắt từ tệp tiêu đề UART1, giải thích về tệp tiêu đề của tôi như sau.
Đọc một ký tự từ Serial Monitor
Chức năng này giúp đọc một ký tự đơn lẻ đã được gửi đến vi điều khiển từ màn hình nối tiếp.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); return (UART1_ReceiveData8 ()); }
Chúng tôi đợi cho đến khi cờ RXE được SET để hoàn thành việc tiếp nhận và sau đó xóa cờ để xác nhận việc tiếp nhận. Cuối cùng, chúng tôi gửi dữ liệu 8-bit nhận được là kết quả của hàm này.
In một ký tự vào Serial Monitor
Chức năng này truyền một ký tự đơn lẻ từ bộ vi điều khiển đến màn hình nối tiếp.
void Serial_print_char (char value) {UART1_SendData8 (value); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ĐẶT LẠI); // đợi gửi}
Hàm chỉ cần ghi giá trị 8-bit và đợi cho đến khi quá trình truyền hoàn tất bằng cách kiểm tra UART1_FLAG_TXE thành SET
Khởi tạo giao tiếp nối tiếp
Chức năng này khởi tạo giao tiếp nối tiếp ở tốc độ truyền yêu cầu.
void Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // Khởi động hóa thiết bị ngoại vi UART UART1_Init (baud_rate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
Ngoài tốc độ truyền, có các tham số khác phải được đặt cho giao tiếp nối tiếp, như số bit dữ liệu, số bit dừng, chẵn lẻ, v.v. Thông số phổ biến nhất (tương tự như Arduino) là dữ liệu 8 bit với một bit dừng và không có tính chẵn lẻ và do đó đó sẽ là cài đặt mặc định. Bạn có thể thay đổi nó nếu cần.
In một số nguyên sang màn hình nối tiếp
Thông thường, nếu chúng ta đang sử dụng màn hình nối tiếp để gỡ lỗi hoặc theo dõi, chúng ta có thể muốn in một biến kiểu int vào màn hình nối tiếp. Chức năng này thực hiện chính xác điều đó
void Serial_print_int (int number) // Funtion in giá trị int ra màn hình nối tiếp {char count = 0; char chữ số = ""; while (number! = 0) // chia int thành mảng char {digit = number% 10; tính ++; number = số / 10; } while (count! = 0) // in mảng char theo đúng hướng {UART1_SendData8 (digit + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ĐẶT LẠI); // đợi số lượng gửi--; }}
Nó nhận một giá trị số nguyên và chuyển nó thành mảng ký tự trong vòng lặp while đầu tiên, sau đó trong vòng lặp while thứ hai, chúng ta sẽ gửi từng ký tự tương tự như hàm print char của chúng ta.
In một dòng mới
Đây là một chức năng đơn giản để in một dòng mới. Giá trị hex để làm điều đó là “0x0a”, chúng tôi chỉ gửi nó qua bằng cách sử dụng lệnh truyền 8 bit.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ĐẶT LẠI); // đợi gửi}
In một chuỗi vào màn hình nối tiếp
Một chức năng hữu ích khác là thực sự in các chuỗi trên màn hình nối tiếp.
void Serial_print_string (char string) {. char i = 0; while (string! = 0x00) {UART1_SendData8 (string); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ĐẶT LẠI); i ++; }}
Một lần nữa, hàm này cũng chuyển đổi chuỗi thành mảng char và gửi từng ký tự. Như chúng ta biết tất cả các chuỗi kết thúc sẽ rỗng. Vì vậy, chúng tôi chỉ cần tiếp tục duyệt và truyền các ký tự cho đến khi chúng tôi đạt đến giá trị rỗng 0x00.
Kiểm tra xem dữ liệu nối tiếp có sẵn để đọc không
Chức năng này kiểm tra xem có bất kỳ dữ liệu nối tiếp nào trong bộ đệm sẵn sàng để đọc hay không.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) trả về TRUE; khác trả về FALSE; }
Nó kiểm tra cờ UART1_FLAG_RXNE , nếu đúng, nó trả về true và nếu không, nó trả về false.