CubeMX+FreeRTOS下的USB通信配置

前置说明

  • 开发环境:CubeMX+CLion,Windows
  • 工具链:CMake + Ninja + arm-none-eabi-gcc + JLink
  • 芯片选择:STM32F103CB(T6)
  • 外部晶振:16Hz
  • 串口通讯软件:ComTool

(1).CubeMX相关配置

  1. 在CubeMX中打开项目,进入Pin&Configuration
    • 打开System Core选项,选中RCC子项,将HSE配置为Crystal/Ceramic Resonator
      • RCC全称Reset and Clock Control(复位和时钟控制)
      • 高速外部时钟(HSE):由外部晶体(Crystal)或陶瓷谐振器(Ceramic Resonator) 产生的时钟信号,需要在单片机外部引脚连接对应的元件。
      • “Crystal/Ceramic Resonator” 设置的含义:
        选择外部晶体 / 陶瓷谐振器作为 HSE 的时钟源
    • 打开Connectivity选项,选中USB子选项,勾选USB Device (FS)选项
      • 此举的意图在于,明确将 STM32 配置为USB设备端。即,它是被主机(如电脑)识别和控制的 “外设”,而非主动控制其他设备的 “主机”。(FS)代表fullspeed
      • 当你勾选 “USB Device (FS)” 后,STM32CubeMX 会自动完成以下配置并生成代码:
        1. 配置 USB 外设的时钟(确保 USB 模块能正常工作);

        2. 配置 USB 的硬件引脚(如 D+、D - 引脚的电气特性);

        3. 初始化 USB 设备栈(如端点、描述符、通信协议等);

        4. 生成底层驱动代码(如usbd_core.c、usbd_desc.c等),让开发者可基于此快速实现 USB 设备功能(如自定义设备类、数据收发)。

    • 打开Middleware and Software Packs,选中USB_DEVICE子选项,进入配置页,将Class For FS IP选项更换为Communication Device Class (Virtual Port Com)
      • “Class For FS IP” 的意思是:为 STM32 的 “全速 USB 硬件模块” 选择具体的 USB 设备类。
      • 不同的设备类对应不同的功能场景,例如:
        1. 选 “Communication Device Class (Virtual Port Com)”(通信设备类),则 STM32 可模拟USB 虚拟串口;
        2. 选 “Mass Storage Class”(大容量存储类),则可模拟U 盘;
        3. 选 “HID Class”(人机接口类),则可模拟键盘、鼠标等外设。
    • 设置PA15引脚为输出,并且输出高电平(依个人情况调整)
      • 根据USB2.0硬件规范,全速设备需要在D+线上使用1.5K电阻上拉,STM32F103CB使用的USB ip核没有内部集成这个1.5K上拉电阻,需要外接,我们板上是使用PA15控制外接1.5K电阻上拉的,所以PA15需要先输出高电平,激活这个1.5K上拉电阻,主机才能识别到这个USB全速设备
  2. 进入Clock Configuration,按需配置时钟树
    关注图片中指定的两个数据。这里由于我的外部晶振是16Hz,因此需要配置HSE为16。而USB的48Hz是行业标准。
    在这里插入图片描述

可以借助CubuMX的智能“冲突调整”功能。
3. 生成代码(点击右上角),导入CLion

(2).串口任务生成

参考上一篇博客,可以用CubeMX生成供调度的Task。我们生成一个不断向主机发送“hello”的通信程序,这里直接展示代码:

//在main.c的主循环中:
SerialTaskHandle = osThreadNew(StartSerialTask, NULL, &SerialTask_attributes);

void StartSerialTask(void *argument)
{
  char msg[] = "Hello from STM32 via USB!\r\n";
  uint32_t counter = 0;
  char buffer[64];

  for(;;)
  {
    // 方法1:发送固定消息
    CDC_Transmit_FS((uint8_t*)msg, strlen(msg));

    // 方法2:发送带计数器的消息
    sprintf(buffer, "Message count: %lu\r\n", counter++);
    CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));

    osDelay(1000); // 每秒发送一次
  }
}

编译、烧录程序。

(3).串口通信

1.下载comtool串口通信软件
  • 网站:https://github.com/Neutree/COMTool/releases
2.将usb接入电脑,在comtool里打开串口,准备通讯

在这里插入图片描述
在这里插入图片描述
成功接收到信息,实验成功。

(4)补充

1.USB到底是什么

USB,Universal Serial Bus,中文名通用串行总线。USB【是】一套完整的工业标准,其核心是一个为外设连接而专门设计的【通信协议栈】。这个协议栈自上而下地定义了:

  1. 设备的逻辑行为(如描述符和枚举)
  2. 通信的数据格式与规则(如数据包和传输类型)
  3. 底层的物理与电气连接(如接口和信号)

定义了:

  1. 设备的逻辑行为(如描述符和枚举)
  2. 通信的数据格式与规则(如数据包和传输类型)
  3. 底层的物理与电气连接(如接口和信号)

通过这种统一标准,USB得以建构出一套旨在通过简单的串行方式,为各种各样设备提供通用连接的总线系统。


TODO:搞清楚串口到底是什么,研究FreeRTOS的多线程机制。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值