Bài 06: UART với STM32F303CC trong MXCUBE

UART với STM32F303CC

  1. Giới thiệu sơ lược về UART.
  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…

    STM32F303CC 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 hơn so 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 9Mb/s.
    • Cấu hình với nhiều mode hoạt động.
    • Có lựa chọn khi cấu hình với RS232 hoặc RS485.
    • Độ dài được lập trình là 7, 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 giảm thời gian truyền nhận.
    • Bit cho phép truyền nhận riêng biệt.
    • Có cờ báo giao tiếp và cớ báo lỗi.
    • Cờ báo ngắt có thể lên đến 14 loại khác nhau.
  3. Cấu hình trên STM32 cubeMx.
  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. Sử dụng UART2, tốc độ baud là 9600, sử dụng ngắt nhận UART. Led ở chân PB9 sẽ đảo trạng thái mỗi khi nhận được 1 kí tự mới.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.
    2. Chọn loại MCU, Double click vào tên MCU được tìm thấy hoặc bấm vào Start project để bắt đầu quá trình cài đặt. Cấu hình thạch anh, chuẩn nạp trước tiên. Bài này sử dụng UART2. Click chuột trái để chọn chức năng cho ngoại vi.Click chuột phải để tạo nhãn cho chân ngoại vi cho dễ nhìn. Ở đây, chân PA2,PA3,PB9 lần lượt là UART2_TX, UART2_RX, led hiển thị trạng thái.
    3. Cấu hình clock ở tab clock configuration. Tùy thuộc vào thạch anh sử dụng và các ứng dụng khác nhau mà chỉnh tốc độ clock ở các mode khác nhau. Ở đây mình đã sử dụng thạch anh 8Mhz nên có thể điều chỉnh tốc độ tối đa của HCLK là 72Mhz. Những chỗ nào mà chương trình cho phép thay đổi giá trị thì chỗ đó được phép thay đổi clock. Chúng ta có thể quan sát được đầu ra của tất cả các ngoại vi. Khá rõ ràng đúng không.
    4. Tab Configuration
      • Connectivity -> click vào UART đã chọn(UART2) để bắt đầu cấu hình. Cấu hình tốc độ baud là 9600, độ dài là 8 bit, không sử dụng bit parity và 1 bit stop, các phần khác để mặc định. Sau khi nhập các thông số, nhấn Ok để đóng bảng.
      • Tab System -> NVIC -> chọn ngắt UART2 và chọn mức ưu tiên cho ngắt. Sau khi nhập các thông số, nhấn Ok để đóng bảng.
    5. Cài đặt file xuất ra cho project : vào Project -> settings.Việc cài đặt tương tự như các bài 02, 03. Và không có gì khác biệt nhiều.
    6. Lưu ý : Tab code generator chọn copy only the necessary library files để chương trình sinh ra chỉ copy những file cần thiết -> chương trình tốn ít bộ nhớ hơn. Tab Advanced Setting để mặc định. Nhấn Ok để kết thúc quá trình.

    7. Xuất code sau khi cài đặt : Project -> code generate hoặc click vào biểu tượng. Sau khi code được sinh ra click vào open project để mở project đó lên.
  5. Chỉnh sửa code trên keil C.
    1. Mở file main.c trong khung project lên để chỉnh sửa code sinh ra.
    2. Thêm dòng code như hình.
      • Khai báo biến nhận data:
      • Cho phép loại ngắt nhận và nhận data.
      • Extern biến data để có thể sử dụng biến này trong file stm32f3xxx_it.c.
      • Chương trình xử lí code trong file file stm32f3xxx_it.c.
      • Hàm HAL_UART_Transmit(&huart2,data_re,1,5); để truyền dữ liệu lên máy tính với số lượng byte là 1, thời gian time out là 5ms(thời gian này phụ thuộc vào thời gian cài đặt system tick timer).
      • HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); : đảo trạng thái LED mỗi khi nhận được 1 ký tự.
      • HAL_UART_Receive_IT(&huart2,data_re,1); : cấu hình để tiếp tục nhận byte tiếp theo.

      Lưu ý: thêm code vào giữa begin và end để generate code lần sau không bị mất code đã thêm vào.

    3. Chọn reset and run trong options of target -> Utilities -> setting -> Flash download để sau khi nạp xong chương trình chạy luôn mà không cần nhấn nút reset.
    4. Biên dịch chương trình(Build) ở lần đầu tiên và Rebuild(F7) cho các lần tiếp theo. Chương trình không báo lỗi. Nhấn nút Load để nạp(F8).
    5. Lưu ý:
      • Sử dụng hàm HAL_UART_Receive_IT thay cho hàm HAL_UART_Receive khi có ngắt đi kèm theo hoặc HAL_UART_Receive_DMA khi sử dụng DMA.
      • Sử dụng hàm __HAL_UART_ENABLE_IT để cài đặt cho phép là ngắt nhận UART. Ngoài ra còn có nhiều kiểu ngắt nữa, tham khảo trong refereance manual.
      • Sử dụng hàm HAL_UART_Transmit để truyền data lên máy tính với các thông số lần lượt là : loại uart được chọn, data gửi, số byte data gửi lên, thời gian time out gửi lên.
      • Mình sử dụng tốc độ baud là 9600 để dễ dàng quan sát, tốc độ nhỏ để hạn chế tối đa các sai xót xảy ra.
      • Hạn chế truyền liên tục lên máy tính với tốc độ baud cao vì điều đó có thể gây treo máy hoặc treo phần mềm đối với các máy có cấu hình yếu.
      • Có thể sử dụng hàm printf trong thư viện stdio.h để truyền lên máy tính – hàm này thường được sử dụng.
  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, bộ UART1 ,sử dụng phần mềm hercules để quan sát và module UART to Com để 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, bộ UART3, nhận data bằng ngắt UART. 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 ví dụ demo ví dụ uart ở trên