STM32-CubeMX USB学习
STM32-CubeMX USB学习
1. 虚拟com学习
1.1 开发环境
1.2 使用STM32CubeMX配置代码
1.3 串口自发自收
1.4 串口定向printf
STM32-CubeMX USB学习
1. 虚拟com学习
1.1 开发环境
软件环境:
STM32CubeMX
版本:SetupSTM32CubeMX-6.0.1.exe
Firmware:STM32Cube FM_F1 V1.8.0
keil 5 V5.29—支持并行编译,可以加速编译效率(最新的版本就可以)
keil的固件包版本:
Keil.STM32F1xx_DFP.2.0.0.pack
keil相关资料的下载
https://www.cnblogs.com/armfly/p/12564643.html
java版本–有遇到过java版本太新导致出问题的
jre-8u201-windows-x64.exe
以下版本亲测有问题,请勿使用
jdk-14.0.2_windows-x64_bin.exe
版本的差异会导致各种报错,切记核对相关版本.
路径中不能出现中文空格,出现会报错.
版本问题导致的报错之一
Error: L6218E: Undefined symbol USB_FlushRxFifo (referred from stm32f1xx_hal_pcd.o).
硬件环境
Stm32F103c8t6–淘宝上最便宜的开发板
在这里插入图片描述
1.2 使用STM32CubeMX配置代码
选择芯片型号,我这边是C8t6
在这里插入图片描述
debug选择 SW模式
在这里插入图片描述
配置外部时钟输入
在这里插入图片描述
配置USB device的功能
在这里插入图片描述
将USB的模式配置成COM口的功能在这里插入图片描述
时钟树配置,如果前面没有配置外部晶振输入,这边无法配置成功。正常的话自动会配置成功
在这里插入图片描述
工程配置,配置成对应keil的版本
在这里插入图片描述
框出来的位置有时候因为尺寸太小会出错,有人说默认的也可以,反正我改了,如下图
在这里插入图片描述
第一栏里面选择第一个和第二个都一样的,有问题的话可以换了试一下
第二栏里勾选将文件分为.c和.h
在这里插入图片描述
生成工程文件
在这里插入图片描述
1.3 串口自发自收
实现串口输出ABCD,需要更改的部分
//1.添加头文件
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"
#include "gpio.h"
#include "usbd_cdc_if.h"
1
2
3
4
5
6
更改main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
//2.添加数组
unsigned char buff[4] = {"abcd"};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//3. 在while循环中添加如下代码
HAL_Delay(1000);
CDC_Transmit_FS(buff,sizeof(buff)); //USB 串口发送数据
}
/* USER CODE END 3 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
串口助手
在这里插入图片描述
读取输入的值和上一次是否相同,从而输出不同的值
首先需要将main函数恢复成初始的状态
更改下面的函数
CDC_Receive_FS();这个函数在usbd_cdc_if.c的文件下面的位置
初始代码
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
1
2
3
4
5
6
7
8
将代码改成如下的样子
uint8_t a=0,a1=1;
unsigned char buff1[4] = {"abcd"};
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
a = *Buf;
if(a == a1)
CDC_Transmit_FS(Buf,*Len);//自收自发
else
{
CDC_Transmit_FS(buff1,sizeof(buff1));
a1 = a;
}
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
//CDC_Transmit_FS(Buf,*Len);//自收自发
return (USBD_OK);
/* USER CODE END 6 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
会对比此次的和上一次的差异,如果一样则输出 接收到的值,如果不一样则输出abcd
PS:有一个BUG,数字大了后识别会出错,只能识别发送的第一个数据的差异
在这里插入图片描述
1.4 串口定向printf
参考文档:
文件的配置教程
https://www.jianshu.com/p/579783d28044
1.驱动下载链接
https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-utilities/stsw-stm32102.html
2. 代码操作
https://blog.csdn.net/u010779035/article/details/104369515