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