- Khái niệm cơ bản về giao tiếp UART
- Yêu cầu phần cứng và thiết lập
- Sơ đồ mạch cho giao tiếp UART Nuvoton N76E003
- Các chân UART trên Vi điều khiển Nuvoton N76E003
- Thanh ghi UART trong Vi điều khiển Nuvoton N76E003
- Chế độ hoạt động UART trong N76E003
- Lập trình Nuvoton N76E003 cho giao tiếp UART
UART là viết tắt của Universal Asynchronous Receiver / Transmitter và nó là một tính năng phần cứng hữu ích trong bất kỳ bộ vi điều khiển nào. Một bộ vi điều khiển cần nhận dữ liệu, xử lý và gửi dữ liệu đến các thiết bị khác. Có nhiều loại giao thức truyền thông khác nhau có sẵn trong vi điều khiển, tuy nhiên, UART là loại được sử dụng nhiều nhất trong số các giao thức truyền thông khác như SPI và I2C. Nếu ai đó cần nhận hoặc truyền dữ liệu nối tiếp, UART luôn là lựa chọn phổ biến và đơn giản nhất. Ưu điểm của UART là chỉ cần hai dây để truyền dữ liệu giữa các thiết bị. Tiếp tục với Hướng dẫn vi điều khiển Nuvoton của chúng tôi, trong bài viết này, chúng ta sẽ tìm hiểu cách thực hiện giao tiếp nối tiếp bằng vi điều khiển N76E003.
Khái niệm cơ bản về giao tiếp UART
Bây giờ, như chúng ta biết UART là gì, điều quan trọng là phải biết các tham số liên quan của UART.
Hai thiết bị UART nhận và truyền dữ liệu ở cùng tần số. Khi thiết bị UART nhận phát hiện một bit bắt đầu, nó sẽ bắt đầu đọc các bit đến ở một tần số cụ thể được gọi là tốc độ truyền. Tốc độ truyền là một điều quan trọng đối với giao tiếp UART và nó được sử dụng để đo tốc độ truyền dữ liệu tính bằng bit trên giây (bps). Tốc độ truyền này, đối với truyền và nhận, phải ở cùng tốc độ truyền. Chênh lệch tốc độ truyền giữa các UART truyền và nhận chỉ có thể là khoảng 10% trước khi thời gian của các bit bị lệch quá xa. Hầu hết các tốc độ truyền phổ biến là 4800, 9600, 115200 bps, v.v. Trước đây chúng tôi đã sử dụng giao tiếp UART trong nhiều bộ vi điều khiển khác được liệt kê dưới đây.
- Giao tiếp UART giữa ATmega8 và Arduino Uno
- Giao tiếp UART giữa hai vi điều khiển ATmega8
- Giao tiếp UART sử dụng Vi điều khiển PIC
- Giao tiếp UART trên Vi điều khiển STM8S
N76E003 có hai UART - UART0 và UART1. Trong hướng dẫn này, chúng tôi sẽ sử dụng thiết bị ngoại vi UART trên bộ vi điều khiển N76E003. Không lãng phí nhiều thời gian, hãy đánh giá loại thiết lập phần cứng mà chúng tôi yêu cầu cho ứng dụng này.
Yêu cầu phần cứng và thiết lập
Thành phần chính cần thiết cho dự án này là mô-đun chuyển đổi USB sang UART hoặc TTL sẽ tạo giao diện cần thiết giữa PC hoặc Máy tính xách tay với mô-đun vi điều khiển. Đối với dự án này, chúng tôi sẽ sử dụng mô-đun USB to UART dựa trên CP2102 được hiển thị bên dưới.
Chưa kể, ngoài thành phần trên, chúng ta cần board phát triển dựa trên vi điều khiển N76E003 cũng như Nu-Link Programmer. Có thể cần thêm bộ cấp nguồn 5V nếu bộ lập trình không được sử dụng làm nguồn điện.
Sơ đồ mạch cho giao tiếp UART Nuvoton N76E003
Như chúng ta có thể thấy trong sơ đồ bảng phát triển bên dưới, chân thứ 2 và thứ 3 của bộ vi điều khiển được sử dụng làm UART0 Tx và Rx tương ứng. Ở phía bên trái, kết nối giao diện lập trình được hiển thị.
Các chân UART trên Vi điều khiển Nuvoton N76E003
N76E003 có 20 chân, trong đó 4 chân có thể được sử dụng cho giao tiếp UART. Hình ảnh dưới đây cho thấy các chân UART được đánh dấu trong hộp hình vuông màu đỏ (Rx) và hộp hình vuông màu xanh lam (Tx).
Đối với UART0, chân 2 và 3 được sử dụng cho giao tiếp UART và đối với UART1, chân 8 và chân 18 được sử dụng cho giao tiếp.
Thanh ghi UART trong Vi điều khiển Nuvoton N76E003
N76E003 có hai UART song công nâng cao với nhận dạng địa chỉ tự động và phát hiện lỗi đóng khung - UART0 và UART1. Hai UART này được điều khiển bằng cách sử dụng các thanh ghi được phân loại thành hai UART khác nhau. Có hai cặp chân RX và TX có sẵn trong N76E003 cho các hoạt động UART. Vì vậy, bước đầu tiên là chọn cổng UART mong muốn cho các hoạt động.
Trong hướng dẫn này, chúng tôi sẽ sử dụng UART0, do đó cấu hình sẽ chỉ được hiển thị cho UART0. UART1 sẽ có cấu hình giống nhau nhưng các thanh ghi sẽ khác nhau.
Sau khi chọn một UART (trong trường hợp này là UART0), các chân I / O cần được sử dụng cho giao tiếp RX và TX cần được cấu hình làm đầu vào và đầu ra. Chân RX của UART0 là chân 3 của bộ vi điều khiển là Cổng 0.7. Vì đây là chân nhận cổng nối tiếp nên cần đặt Cổng 0,7 làm đầu vào. Mặt khác, Cổng 0.6 là chân thứ 2 của bộ vi điều khiển là chân truyền hoặc chân ra. Nó cần được đặt làm chế độ hai chiều Quasi. Chúng có thể được chọn bằng cách sử dụng thanh ghi PxM1 và PxM2. Hai thanh ghi này thiết lập các chế độ I / O trong đó x là viết tắt của số Cổng (Ví dụ: Cổng P1.0 thì thanh ghi sẽ là P1M1 và P1M2, đối với P3.0 sẽ là P3M1 và P3M2, v.v.) được nhìn thấy trong hình ảnh dưới đây-
Chế độ hoạt động UART trong N76E003
Sau đó, bước tiếp theo là xác định phương thức hoạt động của UART. Hai UART có thể hoạt động ở 4 chế độ. Các chế độ là-
Như chúng ta thấy, SM0 và SM1 (bit thứ 7 và thứ 6 của thanh ghi SCON) chọn chế độ hoạt động của UART. Chế độ 0 là hoạt động đồng bộ và ba chế độ khác là hoạt động không đồng bộ. Tuy nhiên, bộ tạo Baud Rate và các bit Frame khác nhau đối với mỗi chế độ cổng nối tiếp. Bất kỳ chế độ nào cũng có thể được chọn theo yêu cầu của ứng dụng và điều này cũng tương tự đối với UART1. Đối với hướng dẫn này, hoạt động 10 bit với tốc độ tràn bộ định thời 3 chia cho 32 hoặc 16 được sử dụng.
Bây giờ, đã đến lúc lấy thông tin và định cấu hình thanh ghi SCON (SCON_1 cho UART1) cho UART0.
Bit thứ 6 và thứ 7 sẽ thiết lập chế độ UART như đã thảo luận trước đó. Bit 5 được sử dụng để đặt chế độ giao tiếp Đa xử lý để kích hoạt các tùy chọn. Tuy nhiên, quá trình này phụ thuộc vào chế độ UART nào được chọn. Khác với những điều này, bit REN sẽ được đặt thành 1 để cho phép nhận và cờ TI sẽ được đặt thành 1 cho chức năng printf được sử dụng thay vì chức năng truyền UART0 tùy chỉnh.
Thanh ghi quan trọng tiếp theo là thanh ghi Power control (PCON) (Timer 3 bit 7 và 6 for UART1). Nếu bạn chưa quen với bộ định thời, hãy xem hướng dẫn Bộ hẹn giờ Nuvoton N76E003 để hiểu cách sử dụng bộ định thời trên Vi điều khiển N76E003.
Bit SMOD rất quan trọng để chọn tốc độ truyền kép trong chế độ UART0 1. Bây giờ, khi chúng ta đang sử dụng bộ định thời 3, thanh ghi điều khiển T3CON của bộ định thời 3 cần được cấu hình. Tuy nhiên, bit thứ 7 và thứ 6 được dành riêng cho cài đặt tốc độ dữ liệu kép cho UART1.
Và giá trị mở rộng quy mô trước của Bộ hẹn giờ 3-
BRCK bit thứ 5 sẽ đặt Timer 3 làm nguồn đồng hồ tốc độ truyền cho UART1. Bây giờ, biểu dữ liệu của N76E003 được cung cấp công thức tính tốc độ Baud mong muốn cũng như giá trị đặt mẫu cho thanh ghi Cao và Thấp của Timer 3 (16-bit).
Giá trị mẫu cho nguồn xung nhịp 16 Mhz-
Do đó tốc độ truyền cần được cấu hình trong thanh ghi Timer 3 bằng công thức trên. Đối với trường hợp của chúng ta, nó sẽ là Công thức 4. Sau đó, khởi động Bộ định thời 3 bằng cách đặt thanh ghi TR3 thành 1 sẽ kết thúc Bộ định thời khởi tạo UART0 3. Để nhận và gửi dữ liệu UART0, hãy sử dụng thanh ghi bên dưới-
Thanh ghi SBUF tự động được cấu hình để Nhận và Truyền. Để nhận dữ liệu từ UART, đợi cờ RI đặt 1 và đọc thanh ghi SBUF và để gửi dữ liệu đến UART0, gửi dữ liệu đến SBUF và đợi cờ TI lấy 1 để xác nhận truyền dữ liệu thành công.
Lập trình Nuvoton N76E003 cho giao tiếp UART
Phần viết mã rất đơn giản và bạn có thể tìm thấy mã hoàn chỉnh được sử dụng trong hướng dẫn này ở cuối trang này. Giải thích về mã như sau, UART0 được khởi tạo ở tốc độ 9600 baud bằng cách sử dụng câu lệnh trong hàm chính-
Ban đầuUART0_Timer3 (9600);
Hàm trên được định nghĩa trong tệp common.c và nó đang định cấu hình UART0 với Bộ hẹn giờ 3 làm nguồn tốc độ truyền, ở chế độ 1 và với tốc độ truyền là 9600. Định nghĩa hàm như sau-
void InitialUART0_Timer3 (UINT32 u32Baudrate) // sử dụng timer3 làm trình tạo Baudrate { P06_Quasi_Mode; // Đặt chân UART làm chế độ Quasi để truyền P07_Input_Mode; // Đặt chân UART làm chế độ đầu vào để nhận SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // Nguồn xung nhịp tốc độ truyền UART0 = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / #endif set_TR3; // Kích hoạt Timer3 set_TI; // Đối với hàm printf phải đặt TI = 1 }
Việc khai báo được thực hiện từng bước như đã thảo luận trước đó và các thanh ghi được cấu hình tương ứng. Tuy nhiên, trong thư viện BSP của N76E003, có một lỗi thay vì P07_Input_Mode; có P07_Quasi_Mode . Do đó, chức năng Nhận UART sẽ không hoạt động.
Tốc độ truyền cũng được định cấu hình theo đầu vào tốc độ truyền và sử dụng công thức được đưa ra bởi biểu dữ liệu. Bây giờ, trong hàm main hoặc vòng lặp while , hàm printf được sử dụng. Để sử dụng hàm printf , TI cần được đặt là 1. Khác với điều này, trong vòng lặp while , một trường hợp chuyển mạch được sử dụng và theo dữ liệu UART nhận được, giá trị được in.
while (1) { printf ("\ r \ nNhấn 1 hoặc Nhấn 2 hoặc Nhấn 3 hoặc Nhấn 4"); oper = Nhận_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 được nhấn"); phá vỡ; case '2': printf ("\ r \ n2 được nhấn"); phá vỡ; case '3': printf ("\ r \ n3 được nhấn"); phá vỡ; case '4': printf ("\ r \ n4 được nhấn"); phá vỡ; default: printf ("\ r \ nNhấn sai phím"); } Timer0_Delay1ms (300); } }
Vâng, đối với UART0, hãy nhận nhận_Data_From_UART0 (); chức năng được sử dụng. Nó cũng được định nghĩa trong thư viện common.c .
UINT8 Nhận_Data_From_UART0 (vô hiệu) { UINT8 c; trong khi (! RI); c = SBUF; RI = 0; trở lại (c); }
Nó sẽ đợi cờ RI nhận 1 và trả về dữ liệu nhận bằng cách sử dụng biến c.
Nhấp nháy mã và đầu ra
Mã trả về 0 cảnh báo và 0 Lỗi và nhấp nháy bằng phương pháp nhấp nháy mặc định của Keil. Nếu bạn không chắc chắn về cách biên dịch và tải lên mã, hãy xem bài viết bắt đầu với nuvoton. Các dòng dưới đây xác nhận rằng mã của chúng tôi đã được tải lên thành công.
Bắt đầu xây dựng lại: Dự án: printf_UART0 Xây dựng lại mục tiêu 'GPIO' biên dịch PUTCHAR.C… biên dịch Print_UART0.C… biên dịch Delay.c… biên dịch Common.c… lắp ráp STARTUP.A51… liên kết… Kích thước chương trình: data = 54,2 xdata = 0 code = 2341 tạo tệp hex từ ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Lỗi, 0 Cảnh báo. Thời gian xây dựng đã trôi qua: 00:00:02 Tải phần mềm "G: \\ n76E003 \\ \\ \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Đã hoàn thành xóa Flash. Flash Write Done: 2341 byte được lập trình. Flash Verify Done: Đã xác minh 2341 byte. Tải Flash xong lúc 15:48:08
Bảng Phát triển được kết nối với nguồn điện thông qua bộ lập trình và máy tính xách tay bằng mô-đun USB to UART. Để hiển thị hoặc gửi dữ liệu UART, cần có phần mềm theo dõi nối tiếp. Tôi đang sử dụng thuật ngữ tera cho quá trình này.
Như bạn có thể thấy trong hình ảnh dưới đây, tôi đã có thể hiển thị các chuỗi được gửi từ bộ điều khiển nuvoton của chúng tôi và hiển thị nó trên phần mềm theo dõi nối tiếp. Cũng có thể đọc các giá trị từ màn hình nối tiếp.
Bạn có thể xem video được liên kết bên dưới để xem hướng dẫn này. Hy vọng bạn thích bài viết và học được một cái gì đó hữu ích. Nếu bạn có bất kỳ câu hỏi nào, bạn có thể để lại trong phần bình luận bên dưới hoặc sử dụng diễn đàn của chúng tôi để đăng các câu hỏi kỹ thuật khác.