BÀI 08: UART TRONG STM32F103.


  1. Sơ lược về lý thuyết.
  2. UART - Universal synchronous asynchronous receiver transmitter là một ngoại vi cơ bản và thường dùng trong các quá trình giao tiếp với các module như : Xbee, Wifi, Blutooth…. Khi giao tiếp UART kết hợp với các IC giao tiếp như MAX232CP, SP485EEN…. thì sẽ tạo thành các chuẩn giao tiếp RS232, RS485. Đây là các chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.

    Khi ta sử dụng chân UART_CLK thì giao tiếp UART sẽ trở thành giao tiếp đồng bộ và không dùng sẽ là chuẩn giao tiếp không đồng bộ. Các bạn để ý là với bất cứ 1 chuẩn truyền thông nào, khi có sử dụng 1 chân tín hiệu làm chân CLK thì chuẩn giao tiếp đó sẽ là chuẩn giao tiếp đồng bộ và ngược lại. Ở đây mình chỉ đề cập đến giao tiếp UART không đồng bộ.

    Ưu điểm của giao tiếp UART không đồng bộ: tiết kiệm chân vi điều khiển(2 chân), là ngoại vi mà bất kì 1 VĐK nào cũng có, có khá nhiều module, cảm biến dùng UART để truyền nhận data với VĐK. Nhược điểm của loại ngoại vi này là tốc độ khá chậm, tốc độ tối đa tùy thuộc vào từng dòng; quá trình truyền nhận dễ xảy ra lỗi nên trong quá trình truyền nhận cần có các phương pháp để kiểm tra(thông thường là truyền thêm bit hoặc byte kiểm tra lỗi). UART không phải là 1 chuẩn truyền thông, Khi muốn nó là 1 chuẩn truyền thông hoặc truyền data đi xa, chúng ta cần phải sử dụng các IC thông dụng để tạo thành các chuẩn giao tiếp đáng tin cậy như RS485 hay RS232....

    Thông thường chúng ta sẽ dùng ngắt nhận UART để nhận dữ liệu vì sử dụng ngắt sẽ tiện lợi, không tốn thời gian chờ cũng như mất dữ liệu.Các tốc độ thường dùng để giao tiếp với máy tính: 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.

    Một số phần mềm giao tiếp với máy tính: hercules_3-2-5,teraterm, Serial-Oscilloscope-v1.5...Một số modulde dùng để giao tiếp với máy tính: CP2102 USB 2.0, USB ra UART dùng PL2303, USB to UART dùng TTL FT232RL, USB ra UART dùng CH340G…

    STM32F103C8 có 3 bộ UART với nhiều mode hoạt động, với nhiều bộ UART ta có thể sử dụng được nhiều ứng dụng với 1 chip điều khiển so với STM8S. Một số tính năng nổi bật như sau:

    • Đầy đủ các tính năng của bộ giao tiếp không đồng bộ.
    • Điều chỉnh baud rate bằng lập trình và tốc độ tối đa lên đến 4.5Mb/s.
    • Độ dài được lập trình là 8 hoặc 9 bit.
    • Cấu hình bit stop hỗ trợ là 1 hoặc 2.
    • Có chân clock nếu muốn chuyển giao tiếp thành đồng bộ.
    • Cấu hình sử dụng 1 dây hoặc 2 dây.
    • Có bộ DMA nếu muốn đẩy cao thời gian truyền nhận.
    • Bit cho phép truyền nhận riêng biệt.
  3. Cấu hình với thư viện chuẩn của ST.
  4. VD: Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được.

    1. B1- Cấp lock và khai báo các định nghĩa.
    2. B2- cấu hình GPIO cho 2 chân Rx và Tx.
    3. B3- Cấu hình UART với tốc độ Baud, số lượng data, bit chẵn lẻ, bit stop, mode truyền.
    4. B4 – Cấu hình ngắt nhận, enable ngắt UART và UART.
    5. Ở đây là cấu hình ngắt nhận nên cờ cho phép ngắt là USART_IT_RXNE.

    6. B5- chương trình thực thi trong ngắt UART.
    7. Chương trình đợi data được nhận xong if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET), sau đó đảo trạng thái 1 led ở PB9 để biết là đã nhận. Gán data nhận vào biến data, đợi cờ truyền báo rỗi if(USART_GetITStatus(USART2, USART_IT_TXE) == RESET) rồi truyền data đi.

      Lưu ý khi sử dụng các phần mềm giao tiếp với máy tính:

        Phải để đúng tốc độ baund thì mới hiển thị đúng kí tự. Cài đặt đúng cổng COM, datasize, parity. Để đúng mode hex, text... Cho phép CR/LF hay không.
  5. Một số thanh ghi quan trọng.
    1. USART_SR – Status register.
      • TXE : bit báo có data đã truyền hay không, =0 tức là data rỗng, có thể truyền, =1 data đã được truyền đi.
      • RXNE: bit báo data đã nhận hay chưa =1: đã nhận, =0 chưa nhận hoặc nhận chưa xong.
      • TC : cờ báo đã nhận data hoặc data vừa mới truyền xong.
    2. USART_DR – Data register.
    3. Thanh ghi này chứa Data nhận và Data truyền gồm 9bit. Và nó phụ thuộc vào trạng thái truyền hoặc nhận sẽ quyết định đó là data truyền hoặc data nhận.

    4. USART_BRR – Baud rate register.
    5. Thanh ghi này chứa giá trị tốc độ baund được cài đặt. DIV_Mantissa[11:0] là thành phần trước dấu “,” và DIV_Freaction[3:0] là thành phần sau dấu phẩy của tốc độ baud được quy đổi theo bảng sau:

    6. USART_CRx – Control register.
      • UE: bit cho phép UART hoạt động.
      • M: độ dài của data là 8 hay 9 bit.
      • WAKE: phương pháp đáng thức UART là Idle line hoặc Address Mask.
      • PCE : cho phép hoặc k cho phép parity.
      • PS: chọn loại Parity chẵn hoặc lẻ.
      • PEIE: cho phép ngắt PE hay k ngắt.
      • TXEIE: cho phép ngắt truyền hay k.
      • TCIE: cho phép ngắt khi truyền/nhận xong hay k.
      • RXNEIE: cho phép ngắt nhận hay k.
      • TE: cho phép truyền hay k.
      • RE: cho phép nhận hay k.
      • RWU : cho phép thức tỉnh hay không khi nhận dc data từ bên ngoài.
    7. USART_GTPR – Guard time and prescaler register.
    8. Thanh ghi này chúng ta chỉ quan tâm đến PSC[7:0] là những bit cho phép bộ chia clock trong UART từ clock hệ thống để từ đó chia tốc độ baud cho hợp lý.

  6. Bài tập.
    1. Viết chương trình gửi ký tự “A” lên máy tính với tốc độ baund là 9600, sử dụng phần mềm hercules để quan sát và module UART để truyền nhận với máy tính.
    2. Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính với tốc đọ baund 115200. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được.
    3. Sử dụng hàm printf từ thư viện stdio.h để truyền nhiều kí tự và số lên máy tính.
Link tải chương trình truyền nhận kí tự từ máy tính
Link tải chương trình sử dụng hàm printf