MCU:STM32F103VET6
開發(fā)環(huán)境:STM32CubeMX+MDK5
?
實(shí)現(xiàn)USB的虛擬串口不需要去理解USB的底層驅(qū)動(dòng),只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是沒有這一類的視頻和示例的,博主使用這款開發(fā)板實(shí)現(xiàn)USB虛擬串口。
首先需要打開STM32CubeMX工具。輸入開發(fā)板MCU對(duì)應(yīng)型號(hào),找到開發(fā)板對(duì)應(yīng)封裝的MCU型號(hào),雙擊打開(圖中第三)。
?
此時(shí),雙擊完后會(huì)關(guān)閉此界面,然后打開一個(gè)新界面。
?
然后,我們開始基本配置。
?
現(xiàn)在我們選擇一個(gè)LED作為系統(tǒng)LED,該步驟可以忽略,只是本人喜歡這樣子。以硬件原理圖的綠燈為例子。
?
基本配置除了時(shí)鐘樹外,基本上已經(jīng)配置好了。
現(xiàn)在來(lái)配置USB_Device。STM32F1系列USB只支持USB_Device。
?
選中USB類型后,還需要細(xì)化其中的類型。
?
一切配置都是基于硬件原理圖的。硬件配置除常規(guī)配置外,還是需要看硬件原理圖的。在硬件原理圖中,可以看到只有PD6拉低時(shí),USB才使能。(針對(duì)野火指南者開發(fā)板)
?
現(xiàn)在配置時(shí)鐘樹
?
配置完成,完善工程,生成工程。
到此,STM32CubeMX工具的使用結(jié)束!可以發(fā)現(xiàn)在桌面已經(jīng)生成了USB_VPC工程。
?
USB虛擬串口還需要裝驅(qū)動(dòng)才能被是識(shí)別到,在Win7、Win8機(jī)型PC中需要到ST官網(wǎng)下載。win10及以上機(jī)型在本地已有驅(qū)動(dòng),無(wú)需安裝。
使用MDK5打開USB_VPC工程打開。點(diǎn)擊魔法棒,勾選微庫(kù)。選擇對(duì)應(yīng)的下載器,勾選下載完復(fù)位允許。USB線一端接開發(fā)板USB_Device,一端接PC。
?
現(xiàn)在可以開始實(shí)驗(yàn)了,實(shí)現(xiàn)VPC的發(fā)送與回傳,并重定向printf函數(shù)。
在此之前,簡(jiǎn)單描述一下生成的USB文件以及重要函數(shù)。
然后再插播一條,看帖子說(shuō)是,剛下載完程序時(shí),是識(shí)別不出端口的。需要在上電的情況下從PC那拔插一次USB線。然后可以使用一個(gè)函數(shù)解決這個(gè)問(wèn)題??梢栽趃pio.c中寫入函數(shù),然后記得在頭文件聲明。使用要在MX_USB_DEVICE_Iint()之前。
(我沒遇到這個(gè)問(wèn)題,但是我還是放到工程了,但是我沒用這函數(shù)。)
1 /* USER CODE BEGIN 2 */ 2 /*USB 重新枚舉函數(shù)*/ 3 void USB_Reset(void) 4 { 5 GPIO_InitTypeDef GPIO_InitStruct = {0}; 6 7 __HAL_RCC_GPIOA_CLK_ENABLE(); 8 9 GPIO_InitStruct.Pin = GPIO_PIN_12; 10 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 11 GPIO_InitStruct.Pull = GPIO_NOPULL; 12 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 13 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 14 15 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET); 16 HAL_Delay(100); 17 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET); 18 } 19 /* USER CODE END 2 */
?
實(shí)驗(yàn)環(huán)節(jié):發(fā)送與回傳
在main.c中(截取片段,修改部分)
1 /* Private includes ----------------------------------------------------------*/ 2 /* USER CODE BEGIN Includes */ 3 #include "usbd_cdc_if.h" 4 /* USER CODE END Includes */ 5 6 /* Private typedef -----------------------------------------------------------*/ 7 /* USER CODE BEGIN PTD */ 8 9 /* USER CODE END PTD */ 10 11 /* Private define ------------------------------------------------------------*/ 12 /* USER CODE BEGIN PD */ 13 /* USER CODE END PD */ 14 15 /* Private macro -------------------------------------------------------------*/ 16 /* USER CODE BEGIN PM */ 17 18 /* USER CODE END PM */ 19 20 /* Private variables ---------------------------------------------------------*/ 21 22 /* USER CODE BEGIN PV */ 23 24 /* USER CODE END PV */ 25 26 /* Private function prototypes -----------------------------------------------*/ 27 void SystemClock_Config(void); 28 /* USER CODE BEGIN PFP */ 29 30 /* USER CODE END PFP */ 31 32 /* Private user code ---------------------------------------------------------*/ 33 /* USER CODE BEGIN 0 */ 34 35 /* USER CODE END 0 */ 36 37 /** 38 * @brief The application entry point. 39 * @retval int 40 */ 41 int main(void) 42 { 43 /* USER CODE BEGIN 1 */ 44 char str[] = "Hello World!\r\n"; 45 /* USER CODE END 1 */ 46 47 /* MCU Configuration--------------------------------------------------------*/ 48 49 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 50 HAL_Init(); 51 52 /* USER CODE BEGIN Init */ 53 54 /* USER CODE END Init */ 55 56 /* Configure the system clock */ 57 SystemClock_Config(); 58 59 /* USER CODE BEGIN SysInit */ 60 // USB_Reset(); 61 /* USER CODE END SysInit */ 62 63 /* Initialize all configured peripherals */ 64 MX_GPIO_Init(); 65 MX_USB_DEVICE_Init(); 66 /* USER CODE BEGIN 2 */ 67 68 /* USER CODE END 2 */ 69 70 /* Infinite loop */ 71 /* USER CODE BEGIN WHILE */ 72 while (1) 73 { 74 /* USER CODE END WHILE */ 75 CDC_Transmit_FS((uint8_t*)str, 14); 76 HAL_Delay(2000); 77 /* USER CODE BEGIN 3 */ 78 } 79 /* USER CODE END 3 */ 80 }
在usbd_cdc_if.c中(截取片段,修改部分)
1 /** 2 * @brief Data received over USB OUT endpoint are sent over CDC interface 3 * through this function. 4 * 5 * @note 6 * This function will issue a NAK packet on any OUT packet received on 7 * USB endpoint until exiting this function. If you exit this function 8 * before transfer is complete on CDC interface (ie. using DMA controller) 9 * it will result in receiving more data while previous ones are still 10 * not sent. 11 * 12 * @param Buf: Buffer of data to be received 13 * @param Len: Number of data received (in bytes) 14 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL 15 */ 16 static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) 17 { 18 /* USER CODE BEGIN 6 */ 19 CDC_Transmit_FS(Buf, *Len); 20 21 USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); 22 USBD_CDC_ReceivePacket(&hUsbDeviceFS); 23 return (USBD_OK); 24 /* USER CODE END 6 */ 25 }
實(shí)驗(yàn)結(jié)果(波特率隨意選)
?
?
?實(shí)驗(yàn)環(huán)節(jié):打印重定向
?在usbd_cdc_if.c中(截取片段,修改部分),聲明在usbd_cdc_if.h文件。
1 /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ 2 #include "stdarg.h" 3 #include "stdio.h" 4 5 uint8_t usbtemp[64]; 6 void usbvcom_printf(const char *format,...) 7 { 8 uint16_t len; 9 va_list args; 10 11 va_start(args, format); 12 len = vsnprintf((char *)usbtemp, sizeof(usbtemp)+1, (char *)format, args); 13 va_end(args); 14 15 CDC_Transmit_HS(usbtemp, len); 16 } 17 18 /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
然后就可以像printf那樣使用了,實(shí)測(cè)過(guò)是正常的!
?
時(shí)代越來(lái)越好,開發(fā)效率越來(lái)越高,希望能幫助到你?。?!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-473347.html
還有就是,開源萬(wàn)歲。?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-473347.html
到了這里,關(guān)于野火指南者(STM32F103VET6)應(yīng)用:實(shí)現(xiàn)USB虛擬串口(CDC_VPC)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!