这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-04-18 | gingko | 初次建立 |
1. 新建工程:在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 3. 配置RCC,使用外部时钟源 4. 配置调试引脚 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output 6. 引脚模式配置 7. 配置USB_OTG_HS 8. 配置USB_Device 9. 打开USB中断 10. 时钟源设置,选择外部高速时钟源,配置为最大主频 11. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5
自行选择方式即可
13. 然后点击GENERATE CODE 创建工程 创建成功,打开工程。
USB的CDC类是USB通信设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USBISDN模型和USB网络模型,其中USB传统纯电话业务模型又可分为直线控制模型(Direct Line Control Model)、抽象模型、电话模型。虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。 USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的。之所以会有虚拟串口操作,主要是我们通常使用PC作为Host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口,这样一来,可以方便PC端软件通过操作串口的方式来与其进行通信,但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB操作。需要注意的是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率、驱动访问USB外设有效速率(两边)以及外部环境对通信本身造成的干扰率等因素组成。 CDC类软件框架
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_UART4_Init(); MX_FATFS_Init(); MX_USB_HOST_Init(); uart4.printf("\x0c"); uart4.printf("\033[1;32;40m"); uart4.printf("\r\nHello, I am iCore3.\r\n"); while (1) { MX_USB_HOST_Process(); LED_RED_ON; } }
static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) { int i,j; static FRESULT res; unsigned char write_buffer[512]; unsigned char read_buffer[512]; unsigned int counter; switch(id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: Appli_state = APPLICATION_DISCONNECT; break; case HOST_USER_CLASS_ACTIVE: //f_mount res = f_mount(&fatfs,"0:",1); if(res != RES_OK){ USBH_UsrLog("\r\nf_mount error!"); return; }else{ USBH_UsrLog("\r\nf_mount successful!"); } //f_open for(i = 0; i < 512 ; i ++)write_buffer[i] = i % 256; res = f_open(&file,"0:/test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS); if(res != RES_OK){ USBH_UsrLog("f_open error!"); return; }else{ USBH_UsrLog("f_open successful!"); } //f_lseek res = f_lseek(&file,0); if(res != RES_OK){ USBH_UsrLog("f_lseek error!"); return; }else{ USBH_UsrLog("f_lseek successful!"); } //f_write res = f_write(&file,write_buffer,512,&counter); if(res != RES_OK || counter != 512){ USBH_UsrLog("f_write error!"); return; }else{ USBH_UsrLog("f_write successful!"); } //f_lseek res = f_lseek(&file,0); if(res != RES_OK){ USBH_UsrLog("f_lseek error!"); return; }else{ USBH_UsrLog("f_lseek successful!"); } //f_read res = f_read(&file,read_buffer,512,&counter); if(res != RES_OK || counter != 512){ return; }else{ USBH_UsrLog("f_read successful!"); } f_close(&file); USBH_UsrLog("read data:"); for(i = 0;i < 32;i++){ for(j = 0; j < 16; j ++) USBH_UsrLog("%02X ",read_buffer[i*16+j]); } memset(read_buffer,0,sizeof(read_buffer)); break; case HOST_USER_CONNECTION: Appli_state = APPLICATION_START; break; default: break; } }
#define USBH_DEBUG_LEVEL 1U
#if (USBH_DEBUG_LEVEL > 0U) #define USBH_UsrLog(...) uart4.printf(__VA_ARGS__);\ uart4.printf("\r\n"); #else #define USBH_UsrLog(...) do {} while (0) #endif #if (USBH_DEBUG_LEVEL > 1U) #define USBH_ErrLog(...) do { \ uart4.printf("ERROR: ") ; \ uart4.printf(__VA_ARGS__); \ #define USBH_ErrLog(...) do {} while (0) #endif #if (USBH_DEBUG_LEVEL > 2U) #define USBH_DbgLog(...) do { \ uart4.printf("DEBUG : ") ; \ uart4.printf(__VA_ARGS__); \ uart4.printf("\r\n"); \ } while (0) #else