参考:
https://blog.csdn.net/vonlycn/article/details/103280073
前言:
以前有块STM32的板子,想试试HAL库的功能,经典的点灯程序试验完毕。再搞个串口试验想,通过CUBEMX配置后,简单测试后发现从STM32串口乱码,即从STM32串口发送出来的数据,在PC端的串口调试助手一直乱码。
网络搜索一下,有说是板子晶振问题,这确实是乱码产生的一个因素。但是,经过仔细确认,我的板子不存在这个问题。经仔细看了原理图,是MINI板的问题,串口的RX,TX确实引出来了,但是没有232的电平转换,因此直接用杜邦线将排针上的RX,TX直接与PC的串口对应线连接是不能正确的,必须乱码!
总得通信起来吧,那就USB虚拟串口方式了,于是就有了这篇笔记。
CubeMX配置:
根据选择的芯片,逐步完成配置即可,首先配置debug
时钟:
选中前两个圈后,在第三个圈直接填写板子支持的最大时钟:72MHz即可自动完成配置。
USB:
这个地方可以都是设置0x400,也可以到代码工程里修改。
最后点击:
即可生成工程。
开始添加代码
打开工程
注:添加代码时,贴出代码,方便浏览者复制,同时,给出截图,方便浏览者对照在自己工程中找位置。
首先,在usbd_cdc_if.h 文件添加如下代码:
#define APP_RX_DATA_SIZE 1000 //至43都是自己添加的内容
#define APP_TX_DATA_SIZE 1000
typedef struct
{
volatile uint8_t RecFlag;
volatile uint16_t RecLen;
}RxDef;
extern RxDef USB_COM;
extern uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];//接收缓存
extern uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];//发送缓存
接着,在usbd_cdc_if.c 文件添加如下代码:
USB_COM.RecLen=*Len; // 添加自己
USB_COM.RecFlag=1; //添加自己
最后,在main.c文件添加代码:
#include "usbd_cdc.h" //添加两个头文件
#include "usbd_cdc_if.h"
添加发送数据代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(USB_COM.RecFlag==1)
{
HAL_Delay(500);
USB_COM.RecFlag=0;
CDC_Transmit_FS("ABCDE",5);
}
}
/* USER CODE END 3 */
测试:
PC端随意发数据,每发一次则SMT32回应固定的字符串“ABCDE”,说明通信OK。当然,可以实现自定义协议,来控制板子上做一些操作。
比如PC发一串命令包下来,板子端可以解析PC来的命令包,控制关LED,开LED等等。
备注问题:
USB无法识别:
即cubeMX配置完成时,且未添加任何代码,直接编译,下载到板子后,接USB线后,无法识别。
1、查一下说堆和栈太小了,要大一点,修改堆和栈大小的两种方法:
A、MX时,直接都搞成0x400
B、修改启动汇编代码startup_stm32f103xb.s文件中直接修改
Stack_Size EQU 0x400
Heap_Size EQU 0x400
2、PC安装虚拟USB串口
我试验过程中没有安装,插好USB线后就识别一个COM6出来:
而安装虚拟USB串口在设备管理上识别出来的是:
至此,笔记完成!