Tạo driver USB_HOST_CDC cho module truyền thông ME909s-821ap bằng STM32CubeMX

I. Môi trường kiểm tra:

  • MCU: STM32F429IGT6
  • Công cụ: Phần mềm STM32CubeMX
  • Phần mềm biên dịch: MDK

II. Các bước cấu hình

  1. Mở phần mềm STM32CubeMX và tạo dự án mới, bắt đầu với một ví dụ UART1 đơn giản không sử dụng hệ điều hành. Việc tạo ví dụ UART sẽ không được trình bày chi tiết ở đây.
  2. Khi kiểm tra module truyền thông, cần gửi lệnh AT từ máy tính. Vì vậy, UART1 sẽ được kết nối với máy tính để nhận các lệnh AT qua phần mềm UART. Sau khi UART1 nhận được dữ liệu thông qua ngắt, dữ liệu này sẽ được chuyển tiếp qua giao thức USB tới module 4G. Các lệnh AT thường kết thúc bằng chuỗi 0x0D 0x0A, do đó khi nhận được byte 0x0A, toàn bộ dữ liệu được coi là hoàn thành và sẽ được chuyển tiếp đến module 4G.
  3. Viết hàm ngắt nhận UART1 để xử lý việc nhận dữ liệu kết thúc bằng 0x0A, sau đó trả lại dữ liệu cho phần mềm UART trên máy tính. Trong dự án được tạo bởi STM32CubeMX, ngắt UART1 chưa được kích hoạt, nên cần thêm dòng lệnh:
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    

Thêm các hàm gửi và nhận UART1:

/// Định hướng hàm printf sang USART1
int fputc(int ch, FILE *f)
{
    unsigned char bCh = (unsigned char)ch;
    HAL_UART_Transmit(&huart1, &bCh, 1, 10);
    return ch;
}

#define UART_BUF_LEN 256
#define USB_BUF_LEN 256

unsigned char TxdData[UART_BUF_LEN];
unsigned char bRxdFinishFlag = 0;
unsigned char RxdData[UART_BUF_LEN];
unsigned char bRxLen = 0;
unsigned char UsbRxdData[USB_BUF_LEN];

void Test_USART_TXRX(void)
{
    if (1 == bRxdFinishFlag)
    {
        bRxdFinishFlag = 0;
        HAL_UART_Transmit(&huart1, RxdData, bRxLen, 100);
    }
}

Hàm xử lý ngắt UART1:

void USART1_IRQHandler(void)
{
    uint8_t bData = 0;
    static uint8_t bCnt = 0;

    if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
    {
        bData = (uint8_t)READ_REG(huart1.Instance->DR);
        RxdData[bCnt++] = bData;
        if (RxdData[bCnt - 1] == 0x0A)
        {
            bRxLen = bCnt;
            bCnt = 0;
            bRxdFinishFlag = 1;
        }
    }
}
  1. Kiểm tra chức năng nhận và gửi của UART1. Khi gửi lệnh AT kết thúc bằng 0x0A từ phần mềm UART trên máy tính, UART1 có thể nhận đúng lệnh.
  2. Cấu hình USB_OTG: Do chân USB trên bo mạch là PB14 và PB15, nên cần cấu hình USB_OTG_HS. Vì bo mạch không có Phy bên ngoài, nên chọn Internal FS Phy với chế độ Host Only, đồng thời cấu hình ngắt.
  3. Cấu hình USB_HOST: Vì module 4G thuộc loại thiết bị CDC, nên chọn Communication Host Class (Virtual Port Com) trong phần Class For HS IP. Sau khi kết nối module ME909s, trong descriptor có 5 interface và mỗi interface tối đa 3 endpoint, nên cần cấu hình USBH_MAX_NUM_ENDPOINTS lớn hơn 3 và USBH_MAX_NUM_INTERFACES lớn hơn 5.
  4. Sau khi sinh mã nguồn, chỉnh sửa class code: Module ME909s sử dụng class code tùy chỉnh là 0xFF, vì vậy cần sửa định nghĩa macro USB_CDC_CLASS từ 0x02 thành 0xFF:
    #define USB_CDC_CLASS 0x02
    #define USB_CDC_CLASS 0xFF // Class code tùy chỉnh của nhà sản xuất
    

Thẻ: STM32CubeMX USB_HOST CDC ME909s 4G_module

Đăng vào ngày 3 tháng 7 lúc 13:40