前置说明
- 开发环境:CubeMX+CLion,Windows
- 工具链:CMake + Ninja + arm-none-eabi-gcc + JLink
- 芯片选择:STM32F103CB(T6)
- 外部晶振:16Hz
- 串口通讯软件:ComTool
(1).CubeMX相关配置
- 在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 会自动完成以下配置并生成代码:
-
配置 USB 外设的时钟(确保 USB 模块能正常工作);
-
配置 USB 的硬件引脚(如 D+、D - 引脚的电气特性);
-
初始化 USB 设备栈(如端点、描述符、通信协议等);
-
生成底层驱动代码(如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 设备类。
- 不同的设备类对应不同的功能场景,例如:
- 选 “Communication Device Class (Virtual Port Com)”(通信设备类),则 STM32 可模拟USB 虚拟串口;
- 选 “Mass Storage Class”(大容量存储类),则可模拟U 盘;
- 选 “HID Class”(人机接口类),则可模拟键盘、鼠标等外设。
- 设置PA15引脚为输出,并且输出高电平(依个人情况调整)
- 根据USB2.0硬件规范,全速设备需要在D+线上使用1.5K电阻上拉,STM32F103CB使用的USB ip核没有内部集成这个1.5K上拉电阻,需要外接,我们板上是使用PA15控制外接1.5K电阻上拉的,所以PA15需要先输出高电平,激活这个1.5K上拉电阻,主机才能识别到这个USB全速设备
- 打开System Core选项,选中RCC子项,将HSE配置为
- 进入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【是】一套完整的工业标准,其核心是一个为外设连接而专门设计的【通信协议栈】。这个协议栈自上而下地定义了:
- 设备的逻辑行为(如描述符和枚举)
- 通信的数据格式与规则(如数据包和传输类型)
- 底层的物理与电气连接(如接口和信号)
定义了:
- 设备的逻辑行为(如描述符和枚举)
- 通信的数据格式与规则(如数据包和传输类型)
- 底层的物理与电气连接(如接口和信号)
通过这种统一标准,USB得以建构出一套旨在通过简单的串行方式,为各种各样设备提供通用连接的总线系统。
TODO:搞清楚串口到底是什么,研究FreeRTOS的多线程机制。
3011

被折叠的 条评论
为什么被折叠?



