[MM32软件] 基于 MM32F5333D7P 的USB 接口 TinyUSB应用:Host设备的移植和U盘文件读写

[复制链接]
2641|6
 楼主| MindMotion 发表于 2023-10-23 11:49 | 显示全部楼层 |阅读模式
本帖最后由 MindMotion 于 2023-10-23 11:49 编辑

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 位 Adv Timer, 6 个 GP Timer,1 个 LP Timer
  • 工作电压:1.8V ~ 5.5V
  • 工作温度范围:-40℃ ∼ +105℃
  • 封装形式:LQFP64/48,QFN32

TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备协议栈,源码是托管在GitHub上面,地址是:https://github.com/hathach/tinyusb

2. TinyUSB Host基本移植介绍

之前我们有讲过TinyUSB Device的移植,本期我们就来介绍一下Host设备的移植。同样的我们介绍的移植修改是基于TinyUSB examples\host下已经有参考示例的设备。将TinyUSB 从GitHub上克隆下来,example\host文件夹里面就有对应的示例,本次我们以msc_file_explorer为示例演示如何移植一个host设备。

424366535e6dbc8f0a.png

    图1 TinyUSB  Host示例

将tinyusb 目录下examples\host\msc_file_explorer下的对应三个文件copy到例程TinyUSB_Host_MSC工程目录文件夹里面。

344566535e70b6c5f9.png

图2 TinyUSB  msc_file_explore文件

285616535e76c77b32.png

图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,并实现重定向函数。

  1. void SetPLL2ToUSB_HSE_96M(void)
  2. {
  3.     RCC->CR &= ~RCC_CR_PLL2ON_Msk;

  4.     /* Reset PLL2SRC, PLL2PDIV, PLL2MUL, PLL2DIV bits */
  5.     RCC->PLL2CFGR &= ~RCC_PLL2CFGR_PLL2SRC_Msk;
  6.     RCC->PLL2CFGR &= ~RCC_PLL2CFGR_PLL2PDIV_Msk;
  7.     RCC->PLL2CFGR &= ~RCC_PLL2CFGR_PLL2MUL_Msk;
  8.     RCC->PLL2CFGR &= ~RCC_PLL2CFGR_PLL2DIV_Msk;

  9.     /* Config pll clock source*/
  10.     RCC->PLL2CFGR |= (0x01U << RCC_PLL2CFGR_PLL2SRC_Pos);

  11.     /* set PLL2 CP Current Control Signals */
  12.     RCC->PLL2CFGR &= ~RCC_PLL2CFGR_PLL2ICTRL_Msk;

  13.     if (HSE_VALUE >= 8000000)
  14.     {
  15.         RCC->PLL2CFGR |= (0x03 << RCC_PLL2CFGR_PLL2ICTRL_Pos);
  16.     }
  17.     else
  18.     {
  19.         RCC->PLL2CFGR |= (0x01 << RCC_PLL2CFGR_PLL2ICTRL_Pos);
  20.     }

  21.     RCC->PLL2CFGR |= ((0x17 << RCC_PLL2CFGR_PLL2MUL_Pos) | (0x01 << RCC_PLL2CFGR_PLL2DIV_Pos));

  22.     /* Enable PLL2 */
  23.     RCC->CR |= (0x01U << RCC_CR_PLL2ON_Pos);

  24.     /* Wait till PLL2 is ready */
  25.     while ((RCC->CR & RCC_CR_PLL2RDY_Msk) == 0)
  26.     {
  27.         __ASM("nop");                  /* __NOP(); */
  28.     }
  29. }

  1. void USB_DeviceClockInit(void)
  2. {
  3.     /* Select USBCLK source */
  4.     RCC->CFGR |= 1 << 19;              //USB CLK SEL PLL2

  5.     RCC->CFGR &= ~(0x03 << 22);
  6.     RCC->CFGR |= 0x01 << 22;

  7.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USB_FS, ENABLE);
  8. }

添加tuh_hcd_port.c 接口函数文件。

575376535e807ce44e.png

图4  Keil添加tuh_hcd_port.c文件

移植修改和之前Device设备基本流程一致,Keil工程按如下文件树添加对应文件。

108196535e8399b183.png

图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 文件里面增加:

  1. //------------- MindMotion -------------//
  2. #elif TU_CHECK_MCU(OPT_MCU_MM32F016X)
  3.   #define TUP_DCD_ENDPOINT_MAX    8
  4.   
  5. #elif TU_CHECK_MCU(OPT_MCU_MM32F327X)
  6.   #define TUP_DCD_ENDPOINT_MAX    16
  7.   
  8. #elif TU_CHECK_MCU(OPT_MCU_MM32F533X)
  9.   #define TUP_DCD_ENDPOINT_MAX    16

在while(1)循环里面添加tuh_task(); 然后解决基本的编译问题后烧录板子插入U盘,将printf接上串口调试助手即可测试。

  1. void TinyUSB_MSC_File_Explorer_Sample(void)
  2. {
  3.     printf("\r\nTest %s \r\n", __FUNCTION__);

  4.     TinyUSB_Device_Configure();

  5.     while (1)
  6.     {
  7.         // tinyusb host task
  8.         tuh_task();
  9.     }
  10. }

插入和拔出U盘都能看到”A MassStorage device is mounted”和”A MassStorage device is unmounted” 证明已经成功读取到U盘。

850556535e8b533f7c.png

图6  插入和拔出U盘串口log打印

3. U盘基本的文件读写测试

基于上述两点我们已经能通过USB设备识别到U盘了,同时TinyUSB lib\fatfs\source里面也提供了FatFs 文件操作的接口,下面我们就基于这些文件操作接口函数对U盘里面的文件进行读写操作测试。

9206535ec33a5f7c.png

图7  ff.c  FatFs 文件操作函数接口

首先识别到U盘我们先用f_mount 对U盘挂载,挂载成功之后使用f_getfree得到当前U盘空间等相关信息。

  1.     printf("test f_getfree:\r\n");
  2.     fatfsCode = f_getfree((char const *)&driverNumberBuffer[0], (DWORD *)&freeClusterNumber, &fs);
  3.     if (fatfsCode)
  4.     {
  5.         printf("error\r\n");
  6.         return false;
  7.     }
  8.     if (fs->fs_type == FS_FAT12)
  9.     {
  10.         printf("    FAT type = FAT12\r\n");
  11.     }
  12.     else if (fs->fs_type == FS_FAT16)
  13.     {
  14.         printf("    FAT type = FAT16\r\n");
  15.     }
  16.     else
  17.     {
  18.         printf("    FAT type = FAT32\r\n");
  19.     }
  20.     printf("    bytes per cluster = %d; number of clusters=%lu \r\n", fs->csize * 512, fs->n_fatent - 2);
  21.     printf("    The free size: %dKB, the total size:%dKB\r\n", (freeClusterNumber * (fs->csize) / 2),
  22.              ((fs->n_fatent - 2) * (fs->csize) / 2));

根据那些操作接口函数我们可以对U盘里面的文件进行读写操作,创建删除文件/文件夹,插入U盘后测试打印log如下:

212696535ec7051406.png

图8  f_readdir 读取并列出U盘文件信息串口log打印

739266535ec84a3ea8.png

图9  U盘文件读写操作串口log打印

基于 MM32F5333D7P 的USB 接口 TinyUSB应用测试功能正常,测试在MM32F5330上能够实现对U盘里面的文件进行读写操作,创建删除文件/文件夹等操作。
tpgf 发表于 2023-11-1 09:53 | 显示全部楼层
TinyUSB是一个轻量级的开源USB库,它提供了一种简单、易用的方式来实现USB设备通信
nawu 发表于 2023-11-1 12:02 | 显示全部楼层
TinyUSB支持多种芯片平台和操作系统,可以快速地构建USB设备驱动程序
aoyi 发表于 2023-11-1 12:32 | 显示全部楼层
TinyUSB可以帮助开发者快速构建USB设备驱动程序,并将其部署到设备上,实现数据传输和通信
zljiu 发表于 2023-11-1 12:55 | 显示全部楼层
TinyUSB作为一款新兴的USB库,具有良好的轻量级设计、易移植、高可靠性等特点
tfqi 发表于 2023-11-1 13:38 | 显示全部楼层
它支持低功耗模式,延长USB设备使用时间。
gwsan 发表于 2023-11-1 23:00 | 显示全部楼层
它支持USB 3.0和USB 2.0等高速传输标准,满足不同需求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司
简介:上海灵动微电子股份有限公司成立于 2011 年,是中国本土通用 32 位 MCU 产品及解决方案供应商。 灵动股份的 MCU 产品以 MM32 为标识,基于 Arm Cortex-M 系列内核,自主研发软硬件和生态系统。目前已量产近 300 多款型号,累计交付超 4 亿颗,在本土通用 32 位 MCU 公司中位居前列。

93

主题

111

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部