1基本介绍
MM32F5330微控制器搭载了由安谋科技授权的Armv8-M架构“星辰”STAR-MC1处理器,最高工作频率可达180MHz。内置了128KB Flash,32KB SRAM,并集成了丰富的I/O端口和外设模块,包括ADC,DAC,模拟比较器,高级定时器,通用定时器,基础定时器和低功耗定时器,还包含通信接口如I2C,I3C从机,SPI或I2S,UART,USART,低功耗UART,集成了内部PHY的USB 2.0全速Device/Host控制器,以及FlexCAN-FD接口。
180MHz“星辰” STAR-MC1 处理器,内置单精度浮点运算单元 FPU,支持DSP 扩展
128KB Flash,32KB SRAM,集成丰富的 I/O 端口和外设模块
4 个UART,1 个 USART,1 个 LPUART
1 个集成内部 PHY 的 USB 2.0
1 个 FlexCAN-FD 接口
2 个 I2C,1 个 I3C 从机,3 个 SPI 或 I2S
2 个 3MSPS 12 位的 ADC, 1 个 12 位的 DAC
2 个 16 位 AdvTimer, 6 个 GP Timer,1 个 LP Timer
工作电压:1.8V ~ 5.5V
工作温度范围:-40℃ ∼ +105℃
封装形式:LQFP64/48,QFN32
TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备协议栈,源码是托管在GitHub上面,地址是:https://github.com/hathach/tinyusb。
2TinyUSB Host基本移植介绍
之前我们有讲过TinyUSB Device的移植,本期我们就来介绍一下Host设备的移植。同样的我们介绍的移植修改是基于TinyUSB exampleshost下已经有参考示例的设备。将TinyUSB 从GitHub上克隆下来,examplehost文件夹里面就有对应的示例,本次我们以msc_file_explorer为示例演示如何移植一个host设备。
图1 TinyUSB Host示例
将tinyusb 目录下exampleshostmsc_file_explorer下的对应三个文件copy到例程TinyUSB_Host_MSC工程目录文件夹里面。
图2 TinyUSB msc_file_explore文件
图3 TinyUSB_Host_MSC工程目录
MM32F5333有两个PLL,PLL1可以设置高主频180M给CPU和其他外设使用,PLL2可以单独配置给USB使用。增加一个USB时钟配置函数void USB_DeviceClockInit(void)和void SetPLL2ToUSB_HSE_96M(void),PLL2配置96M 选择PLL2输入二分频到USB。有使用TU_LOG做串口输出,可以使能CFG_TUSB_DEBUG 为需要的输出等级,同时将#define tu_printf printf 改到串口输出,Keil Options->Target 勾选Use MicroLIB,并实现重定向函数。
voidSetPLL2ToUSB_HSE_96M(void) { RCC->CR&=~RCC_CR_PLL2ON_Msk; /*ResetPLL2SRC,PLL2PDIV,PLL2MUL,PLL2DIVbits*/ RCC->PLL2CFGR&=~RCC_PLL2CFGR_PLL2SRC_Msk; RCC->PLL2CFGR&=~RCC_PLL2CFGR_PLL2PDIV_Msk; RCC->PLL2CFGR&=~RCC_PLL2CFGR_PLL2MUL_Msk; RCC->PLL2CFGR&=~RCC_PLL2CFGR_PLL2DIV_Msk; /*Configpllclocksource*/ RCC->PLL2CFGR|=(0x01U<< RCC_PLL2CFGR_PLL2SRC_Pos); /* set PLL2 CP Current Control Signals */ RCC->PLL2CFGR&=~RCC_PLL2CFGR_PLL2ICTRL_Msk; if(HSE_VALUE>=8000000) { RCC->PLL2CFGR|=(0x03<< RCC_PLL2CFGR_PLL2ICTRL_Pos); } else { RCC->PLL2CFGR|=(0x01<< RCC_PLL2CFGR_PLL2ICTRL_Pos); } RCC->PLL2CFGR|=((0x17<< RCC_PLL2CFGR_PLL2MUL_Pos) | (0x01 << RCC_PLL2CFGR_PLL2DIV_Pos)); /* Enable PLL2 */ RCC->CR|=(0x01U<< RCC_CR_PLL2ON_Pos); /* Wait till PLL2 is ready */ while ((RCC->CR&RCC_CR_PLL2RDY_Msk)==0) { __ASM("nop");/*__NOP();*/ } }
voidUSB_DeviceClockInit(void) { /*SelectUSBCLKsource*/ RCC->CFGR|=1<< 19; //USB CLK SEL PLL2 RCC->CFGR&=~(0x03<< 22); RCC->CFGR|=0x01<< 22; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USB_FS, ENABLE); }
添加tuh_hcd_port.c 接口函数文件。
图4 Keil添加tuh_hcd_port.c文件
移植修改和之前Device设备基本流程一致,Keil工程按如下文件树添加对应文件。
图5 Keil工程添加对应.c文件
工程文件树如下:
1.TinyUSB_Host_MSC
2. │
3. ├─APP
4. │ main.c
5. │ mm32f5330_it.c
6. │ platform.c
7. │ msc_app.c
8. │ tinyusb_msc_file_explorer.c
9. │ tuh_hcd_port.c
10. │
11. ├─TinyUSB
12. │ tusb.c
13. │ tusb_fifo.c
14. │ hub.c
15. │ usbh.c
16. │ msc_host.c
17. │
18. └─FATFS
19. ff.c
20. ffsystem.c
21. ffunicode.c
在tusb_config.h文件里面添加#define CFG_TUSB_MCU OPT_MCU_MM32F533X Tusb_mcu.h 文件里面增加:
//-------------MindMotion-------------// #elifTU_CHECK_MCU(OPT_MCU_MM32F016X) #defineTUP_DCD_ENDPOINT_MAX8 #elifTU_CHECK_MCU(OPT_MCU_MM32F327X) #defineTUP_DCD_ENDPOINT_MAX16 #elifTU_CHECK_MCU(OPT_MCU_MM32F533X) #defineTUP_DCD_ENDPOINT_MAX16
在while(1)循环里面添加tuh_task(); 然后解决基本的编译问题后烧录板子插入U盘,将printf接上串口调试助手即可测试。
voidTinyUSB_MSC_File_Explorer_Sample(void) { printf(" Test%s ",__FUNCTION__); TinyUSB_Device_Configure(); while(1) { //tinyusbhosttask tuh_task(); } }
插入和拔出U盘都能看到”A MassStorage device is mounted”和”A MassStorage device is unmounted” 证明已经成功读取到U盘。
图6 插入和拔出U盘串口log打印
3U盘基本的文件读写测试
基于上述两点我们已经能通过USB设备识别到U盘了,同时TinyUSB libfatfssource里面也提供了FatFs 文件操作的接口,下面我们就基于这些文件操作接口函数对U盘里面的文件进行读写操作测试。
图7 ff.c FatFs 文件操作函数接口
首先识别到U盘我们先用f_mount 对U盘挂载,挂载成功之后使用f_getfree得到当前U盘空间等相关信息。
printf("testf_getfree: "); fatfsCode=f_getfree((charconst*)&driverNumberBuffer[0],(DWORD*)&freeClusterNumber,&fs); if(fatfsCode) { printf("error "); returnfalse; } if(fs->fs_type==FS_FAT12) { printf("FATtype=FAT12 "); } elseif(fs->fs_type==FS_FAT16) { printf("FATtype=FAT16 "); } else { printf("FATtype=FAT32 "); } printf("bytespercluster=%d;numberofclusters=%lu ",fs->csize*512,fs->n_fatent-2); printf("Thefreesize:%dKB,thetotalsize:%dKB ",(freeClusterNumber*(fs->csize)/2), ((fs->n_fatent-2)*(fs->csize)/2));
根据那些操作接口函数我们可以对U盘里面的文件进行读写操作,创建删除文件/文件夹,插入U盘后测试打印log如下:
图8 f_readdir 读取并列出U盘文件信息串口log打印
图9 U盘文件读写操作串口log打印
基于 MM32F5333D7P 的USB 接口 TinyUSB应用测试功能正常,测试在MM32F5330上能够实现对U盘里面的文件进行读写操作,创建删除文件/文件夹等操作。
审核编辑:汤梓红
-
微控制器
+关注
关注
48文章
7470浏览量
150954 -
接口
+关注
关注
33文章
8474浏览量
150774 -
usb
+关注
关注
60文章
7887浏览量
263850 -
U盘
+关注
关注
7文章
488浏览量
63190 -
移植
+关注
关注
1文章
376浏览量
28104
原文标题:灵动微课堂 (第274讲)|基于MM32F5333D7P的USB接口TinyUSB应用:Host设备的移植和U盘文件读写
文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论