使用stm32cubeide的usb-host-cdc庫驅動EC20模塊
- 寫在前面
- 開發環境:
- 開始
- 一、使用 cubeide 創建 STM32 Project
- 二、修改代碼
- 三、仿真
- 最后
寫在前面
之前已經發布過一篇 “使用stm32cubemx的usb-host-cdc庫驅動EC20模塊”,但是近期有很多小伙伴私信詢問相關問題,今天抽空重新瀏覽了一下上一篇博客,因為自己想表述的東西太多,寫的有點亂,決定重新建立一個空工程,使用最新的 1.26.1 HAL庫,按照原文配置方式,洗掉掉干擾代碼,重寫一篇博客,希望可以減少大家的疑問,
本篇博文以教你使用STM32的CDC庫驅動EC20模塊成功為目的,不進行任何原理性說明,真正的小白操作指南,包教包會,也別發我私信RMB求代碼了,我真的很缺錢,但是我也是從大家的開源代碼和博文來學習和成長的,只希望你學會之后也多寫一些好博文,幫助更多的單片機開發者,另外順手幫我點個贊就好,謝謝,
開發環境:
- 開發板:正點原子F407探索者
- IDE: STM32CubeIDE 1.6.1
開始
一、使用 cubeide 創建 STM32 Project

選擇正點原子F407探索者使用的主芯片 STM32F407ZG,點next,

輸入工程名稱 “demo_ec20”,點Next

選擇版本號 V1.26.1,點Finish

點RCC,在HSE欄選擇 “Crystal/Ceramic Resonator”,

點上邊的 Clock Configuration,按如圖所示配置時鐘,剛開始Main PLL 后面的 “7” 是不可選的灰色狀態,下文配置完USB_OTG_FS之后可以回來重新配置,

選擇SYS,這里我用 J-link sw仿真,選擇 Trace Asynchronous Sw,

選擇下方 Connectivity 下的USART1, Mode選擇Asynchronous,別的不用動

繼續,選擇 USB_OTG_FS, 選擇 Host_Only,別的不用動,

選擇 Middleware 標簽下的USB_HOST
Class For FS IP 選擇圖示選項 Communication Host Class (Virtual Port com)
USBH_MAX_NUM_ENP… 3
USBH_MAX_NUM_INTER… 5
USBH_MAX_NUM_SUPP… 1
USBH_MAX_NUM_CONF… 4
其他的不用動

右邊找到芯片引腳 PA15,配置為GPIO_Output,

然后點左邊GPIO,配置PA15引腳輸出電平為高電平(USB供電引腳,高電平有效)
完成所有配置以后,ctrl + s 保存配置,自動生成代碼,所有彈出框全部點 yes,
二、修改代碼

第一步,找到usbh_cdc.h,第53行,修改為0xFFU

第二步,找到usbh_cdc.c,第158行修改部分如圖所示
// interface = USBH_FindInterface(phost, COMMUNICATION_INTERFACE_CLASS_CODE,
// ABSTRACT_CONTROL_MODEL, COMMON_AT_COMMAND);
interface = USBH_FindInterfaceIndex(phost, 2, 0);

第三步,還是 usbh_cdc.c,注釋掉 interface = …這兩行,然后將圖中畫紅色框框部分的5個Ep_Desc[0]修改為 Ep_Desc[2]
// interface = USBH_FindInterface(phost, DATA_INTERFACE_CLASS_CODE,
// RESERVED, NO_CLASS_SPECIFIC_PROTOCOL_CODE);
if ((interface == 0xFFU) || (interface >= USBH_MAX_NUM_INTERFACES)) /* No Valid Interface */
{
USBH_DbgLog("Cannot Find the interface for Data Interface Class.", phost->pActiveClass->Name);
return USBH_FAIL;
}
/*Collect the class specific endpoint address and length*/
if (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[2].bEndpointAddress & 0x80U)
{
CDC_Handle->DataItf.InEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[2].bEndpointAddress;
CDC_Handle->DataItf.InEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[2].wMaxPacketSize;
}
else
{
CDC_Handle->DataItf.OutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[2].bEndpointAddress;
CDC_Handle->DataItf.OutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[2].wMaxPacketSize;
}

第四步,依然是 usbh_cdc.c,找到函式 USBH_CDC_ClassRequest,按如圖所示修改,
// status = GetLineCoding(phost, &CDC_Handle->LineCoding);
CDC_Handle->data_rx_state = CDC_IDLE;
CDC_Handle->data_tx_state = CDC_IDLE;
CDC_Handle->LineCoding.b.bCharFormat = 0;
CDC_Handle->LineCoding.b.bDataBits = 8;
CDC_Handle->LineCoding.b.bParityType = 0;
CDC_Handle->LineCoding.b.dwDTERate = 115200;
status = USBH_OK;

第五步,換 usb_host.c,在 USER CODE BEGIN 0 部分添加如下代碼,
uint8_t usb_buffer[256];
extern UART_HandleTypeDef huart1;
void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost)
{
uint32_t len;
len = USBH_CDC_GetLastReceivedDataSize(phost);
if (len > 0)
{
HAL_UART_Transmit(&huart1, usb_buffer, len, 1000);
}
}

第六步, 不換檔案,找到 MX_USB_HOST_Process,修改
void MX_USB_HOST_Process(void)
{
CDC_HandleTypeDef *CDC_Handle = hUsbHostFS.pActiveClass->pData;
/* USB Host Background task */
USBH_Process(&hUsbHostFS);
if (hUsbHostFS.gState == HOST_CLASS)
{
if (CDC_Handle->data_rx_state == CDC_IDLE)
{
USBH_CDC_Receive(&hUsbHostFS, usb_buffer, 256);
}
}
}

第七步,修改代碼的最后一步,在紅框位置加一句代碼
case HOST_USER_CLASS_ACTIVE:
Appli_state = APPLICATION_READY;
USBH_CDC_Transmit(&hUsbHostFS, (uint8_t *)"AT\r\n", strlen("AT\r\n"));
break;
三、仿真

第一步,打開串口工具,選擇com口,配置波特率,打開串口

第二步,連接J-link,插入ec20模塊,點擊debug

第三步,點擊小三角繼續運行

第四步,看到EC20回復的資訊 AT\r\nOK\r\n,
最后
附上本次實驗創建的工程
鏈接: https://pan.baidu.com/s/1JG_861TkSUP_j2XnuWlmmw 提取碼: f1nv
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275866.html
標籤:其他
