用户工具

站点工具


icore4t_30

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
icore4t_30 [2020/03/12 08:55]
zgf 创建
icore4t_30 [2022/04/01 10:48] (当前版本)
sean
行 1: 行 1:
  
 +|  **银杏科技有限公司旗下技术文档发布平台** ​ |||| 
 +|技术支持电话|**0379-69926675-801**||| 
 +|技术支持邮件|Gingko@vip.163.com||| 
 +^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ 
 +|  V1.0  |  2020-03-12 ​ |  gingko ​ |  初次建立 ​ | 
  
 ===== STM32CubeMX教程三十——USB_MSC实验 ===== ===== STM32CubeMX教程三十——USB_MSC实验 =====
  
-1.在主界面选择File-->​New Project ​  ​或者直接点击ACCEE TO MCU SELECTOR ​  +1.在主界面选择File-->​New Project ​  ​或者直接点击ACCEE TO MCU SELECTOR。   
-  +{{ :​icore4t:​icore4t_cube_30_1.png?​direct |}}  
-2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 +2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各 ​ 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 
-在搜索栏的下面,提供的各 ​ 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 +{{ :​icore4t:​icore4t_cube_30_2.png?​direct |}}  
-  +3.配置RCC,使用外部时钟源 
-3.配置RCC,使用外部时钟源 +{{ :​icore4t:​icore4t_cube_30_3.png?​direct |}}  
-  +4.时基源选择SysTick 
-4.时基源选择SysTick +{{ :​icore4t:​icore4t_cube_30_4.png?​direct |}} 
- +5.将PA10,​PB7,​PB8设置为GPIO_Output 
-5.将PA10,​PB7,​PB8设置为GPIO_Output +{{ :​icore4t:​icore4t_cube_30_5.png?​direct |}}  
-  +6.引脚模式配置 
-6.引脚模式配置 +{{ :​icore4t:​icore4t_cube_30_6.png?​direct |}}  
-  +{{ :​icore4t:​icore4t_cube_30_7.png?​direct |}}  
-  +7.配置串口 
-7.配置串口 +{{ :​icore4t:​icore4t_cube_30_8.png?​direct |}} 
-  +在NVIC Settings一栏使能接收中断 
-在NVIC Settings一栏使能接收中断 +{{ :​icore4t:​icore4t_cube_30_9.png?​direct |}}
- +
 引脚配置 引脚配置
-  +{{ :​icore4t:​icore4t_cube_30_10.png?​direct |}} 
-8.配置USB_OTG_HS +8.配置USB_OTG_HS 
-  +{{ :​icore4t:​icore4t_cube_30_11.png?​direct |}} 
-9.配置USB_HOST +9.配置USB_HOST 
-  +{{ :​icore4t:​icore4t_cube_30_12.png?​direct |}}  
-10.配置FATFS +10.配置FATFS 
-  +{{ :​icore4t:​icore4t_cube_30_13.png?​direct |}}  
-11.时钟源设置,选择外部高速时钟源,配置为最大主频 +11.时钟源设置,选择外部高速时钟源,配置为最大主频 
-  +{{ :​icore4t:​icore4t_cube_30_14.png?​direct |}}  
-12.工程文件的设置,​ 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 ​ IDE我们使用的是 MDK V5.27 +12.工程文件的设置,​ 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 ​ IDE我们使用的是 MDK V5.27 
-  +{{ :​icore4t:​icore4t_cube_30_15.png?​direct |}}  
-13.点击Code Generator,进行进一步配置 +13.点击Code Generator,进行进一步配置 
- +{{ :​icore4t:​icore4t_cube_30_16.png?​direct |}} 
   * **Copy all used libraries into the project folder**   * **Copy all used libraries into the project folder**
   * 将HAL库的所有.C和.H都复制到所建工程中   * 将HAL库的所有.C和.H都复制到所建工程中
行 49: 行 52:
     * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径     * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径
   * 自行选择方式即可   * 自行选择方式即可
-14.然后点击GENERATE CODE  创建工程 +14.然后点击GENERATE CODE  创建工程 
- +{{ :​icore4t:​icore4t_cube_30_17.png?​direct |}} 
 创建成功,打开工程。 创建成功,打开工程。
  
行 64: 行 67:
   - 掌握KEILMDK 集成开发环境使用方法。   - 掌握KEILMDK 集成开发环境使用方法。
 ==== 二、 实验设备及平台 ==== ==== 二、 实验设备及平台 ====
-  - iCore4T 双核心板。 +  - iCore4T 双核心板。[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c.w137644-251734891.3.5923532fDrMDOe&​id=610595120319|点击购买]] 
-  - JLINK(或相同功能)仿真器。+  - JLINK(或相同功能)仿真器。[[https://​item.taobao.com/​item.htm?​id=554869837940|点击购买]]
   - Micro USB线缆。   - Micro USB线缆。
   - Keil MDK 开发平台。   - Keil MDK 开发平台。
行 85: 行 88:
   * OTG_HS接口的通用特性如下:   * OTG_HS接口的通用特性如下:
     * 经USB-IF认证,符合通用串行总线规范第2.0版。     * 经USB-IF认证,符合通用串行总线规范第2.0版。
-  ​* OTGHS支持以下PHY接口: +    ​* OTGHS支持以下PHY接口: 
-    * 片上全速PHY。 +      * 片上全速PHY。 
-    * 连接外部全速PHY的I2C接口。 +      * 连接外部全速PHY的I2C接口。 
-    * 连接外部高速PHY的ULPI接口。 +      * 连接外部高速PHY的ULPI接口。 
-  * 模块内嵌的PHY还完全支持定义在标准规范OTG补充第2.0版中的OTG协议。 +    * 模块内嵌的PHY还完全支持定义在标准规范OTG补充第2.0版中的OTG协议。 
-    * 支持A-B器件识别(ID线)。 +      * 支持A-B器件识别(ID线)。 
-    * 支持主机协商协议(HNP)和会话请求协议(SRP)。 +      * 支持主机协商协议(HNP)和会话请求协议(SRP)。 
-    * 允许主机关闭VBUS以在OTG应用中节省电池电量。 +      * 允许主机关闭VBUS以在OTG应用中节省电池电量。 
-    * 支持通过内部比较器对VBUS电平采取OTG监控。 +      * 支持通过内部比较器对VBUS电平采取OTG监控。 
-    * 支持主机到从机的角色动态切换。 +      * 支持主机到从机的角色动态切换。 
-  * 可通过软件配置为以下角色: +    * 可通过软件配置为以下角色: 
-    * 具有SRP功能的USBHS从机(B器件) +      * 具有SRP功能的USBHS从机(B器件) 
-    * 具有SRP功能的USBHS/​LS主机(A器件) +      * 具有SRP功能的USBHS/​LS主机(A器件) 
-    * USBOn-The-Go全速双角色设备 +      * USBOn-The-Go全速双角色设备 
-  * 支持HSSOF和LSKeep-alive令牌 +    * 支持HSSOF和LSKeep-alive令牌 
-    * SOF脉冲可通过PAD输出。 +      * SOF脉冲可通过PAD输出。 
-    * SOF脉冲通过内部连接到定时器(TIMx)。 +      * SOF脉冲通过内部连接到定时器(TIMx)。 
-    * 可配置的帧周期。 +      * 可配置的帧周期。 
-    * 可配置的帧结束中断。 +      * 可配置的帧结束中断。 
-  * OTG_HS内嵌DMA,并可软件配置AHB的批量传输类型。 +    * OTG_HS内嵌DMA,并可软件配置AHB的批量传输类型。 
-  * 具有省电功能,例如在USB挂起期间停止系统、关闭数字模块时钟、对PHY和DFIFO电源加以管理。 +    * 具有省电功能,例如在USB挂起期间停止系统、关闭数字模块时钟、对PHY和DFIFO电源加以管理。 
-  * 具有采用高级FIFO控制的4KB专用RAM: +    * 具有采用高级FIFO控制的4KB专用RAM: 
-    * 可将RAM空间划分为不同FIFO,以便灵活有效地使用RAM。 +      * 可将RAM空间划分为不同FIFO,以便灵活有效地使用RAM。 
-    * 每个FIFO可存储多个数据包。 +      * 每个FIFO可存储多个数据包。 
-    * 动态分配存储区。 +      * 动态分配存储区。 
-    * FIFO大小可配置为非2的幂次方值,以便连续使用存储单元。 +      * FIFO大小可配置为非2的幂次方值,以便连续使用存储单元。 
-一帧之内可以无需要应用程序干预,以达到最大USB带宽。 +    ​* ​一帧之内可以无需要应用程序干预,以达到最大USB带宽。 
-它支持电池充电规范第1.2版中介绍的充电端口检测(仅限FSPHY收发器 +    ​* ​它支持电池充电规范第1.2版中介绍的充电端口检测(仅限FSPHY收发器 
-(2) 主机(Host)模式特性 +  * **(2) 主机(Host)模式特性** 
-OTG_HS接口在主机模式下具有以下主要特性和要求: +  ​* ​OTG_HS接口在主机模式下具有以下主要特性和要求: 
-通过外部电荷泵生成VBUS电压。 +    ​* ​通过外部电荷泵生成VBUS电压。 
-多达16个主机通道(又称之为管道):每个通道都可以动态实现重新配置,可支持任何类型的USB传输。 +    ​* ​多达16个主机通道(又称之为管道):每个通道都可以动态实现重新配置,可支持任何类型的USB传输。 
-内置硬件调度器可: +    ​* ​内置硬件调度器可: 
-– 在周期性硬件队列中存储多达16个中断加同步传输请求 +      ​* ​在周期性硬件队列中存储多达16个中断加同步传输请求 
-– 在非周期性硬件队列中存储多达16个控制加批量传输请求 +      ​* ​在非周期性硬件队列中存储多达16个控制加批量传输请求 
-管理一个共享RxFIFO、一个周期性传输TxFIFO和一个非周期性传输TxFIFO,以有效使用USB数据RAM。 +    ​* ​管理一个共享RxFIFO、一个周期性传输TxFIFO和一个非周期性传输TxFIFO,以有效使用USB数据RAM。 
-(3) 从机(Slave/​Device)模式特性 +  * **(3) 从机(Slave/​Device)模式特性** 
-  ​* **OTG_HS接口在从机模式下具有以下特性:**+  * OTG_HS接口在从机模式下具有以下特性:
     * 1个双向控制端点0     * 1个双向控制端点0
     * 8个IN端点(EP),可配置为支持批量传输、中断传输或同步传输     * 8个IN端点(EP),可配置为支持批量传输、中断传输或同步传输
行 129: 行 132:
     * 管理多达9个专用Tx-INFIFO(分别用于每个使能的INEP),以降低应用程序负荷     * 管理多达9个专用Tx-INFIFO(分别用于每个使能的INEP),以降低应用程序负荷
     * 支持软断开功能。     * 支持软断开功能。
-3.OTG框图 +=== 3.OTG框图 ​=== 
-STM32H7中存在两个OTG_HS模块(OTG_HS1和OTG_HS2)。尽管他们都可以编程为HS操作,但只有OTG_HS1具有可访问的ULPI接口,因此允许使用外部HS收发器进行高速操作。 + 
-  +  * STM32H7中存在两个OTG_HS模块(OTG_HS1和OTG_HS2)。尽管他们都可以编程为HS操作,但只有OTG_HS1具有可访问的ULPI接口,因此允许使用外部HS收发器进行高速操作。 
-  +{{ :​icore4t:​icore4t_arm_hal_30_1.png?​direct |}}  
-4.OTG_HS中断 +{{ :​icore4t:​icore4t_arm_hal_30_2.png?​direct |}}  
-当OTG_HS控制器在一种模式下(设备模式或主机模式)工作时,应用程序不得以另一种角色模式访问寄存器。如果发生了非法访问,将会产生模式不匹配中断并在模块中断寄存器(OTG_GINTSTS寄存器中的MMIS位)中反映。当模块从一种角色模式切换到另一种角色模式时,新工作模式下的寄存器必须重新编程为上电复位后的状态。如图显示了中断层级: +=== 4.OTG_HS中断 ​=== 
-  + 
-5.原理图 +  ​* ​当OTG_HS控制器在一种模式下(设备模式或主机模式)工作时,应用程序不得以另一种角色模式访问寄存器。如果发生了非法访问,将会产生模式不匹配中断并在模块中断寄存器(OTG_GINTSTS寄存器中的MMIS位)中反映。当模块从一种角色模式切换到另一种角色模式时,新工作模式下的寄存器必须重新编程为上电复位后的状态。如图显示了中断层级: 
-  +{{ :​icore4t:​icore4t_arm_hal_30_3.png?​direct |}}  
-由于STM32不带高速PHY,在这里我们用STM32H750和USB3300连接的方式来实现数据的高速传输。本实验通过移植ST官方提供的代码来实现STM32对U盘或者读卡器等大容量USB存储设备的读写操作。+=== 5.原理图 ​=== 
 +{{ :​icore4t:​icore4t_arm_hal_30_4.png?​direct |}}  
 +  ​* ​由于STM32不带高速PHY,在这里我们用STM32H750和USB3300连接的方式来实现数据的高速传输。本实验通过移植ST官方提供的代码来实现STM32对U盘或者读卡器等大容量USB存储设备的读写操作。
 ==== 四、 实验程序 ==== ==== 四、 实验程序 ====
  
 === 1.主函数 === === 1.主函数 ===
 +<code c>
 +int main(void)
 +{
 +    HAL_Init();
 +    SystemClock_Config();​
 +    i2c.initialize();​
 +    axp152.initialize();​
 +    axp152.set_dcdc1(3500);//​[ARM & FPGA BK1/2/6 &OTHER]
 +    axp152.set_dcdc2(1200);//​[FPGA INT & PLL D]
 +    axp152.set_aldo1(2500);//​[FPGA PLL A]
 +    axp152.set_dcdc4(3300);//​[POWER_OUTPUT]
 +    axp152.set_dcdc3(3300);//​[FPGA BK4][Adjustable]
 +    axp152.set_aldo2(3300);//​[FPGA BK3][Adjustable]
 +    axp152.set_dldo1(3300);//​[FPGA BK7][Adjustable]
 +    axp152.set_dldo2(3300);//​[FPGA BK5][Adjustable]
 +    ​
 +    HAL_Delay(200);​
 +    MX_GPIO_Init();​
 +    MX_FATFS_Init();​
 +    MX_USB_HOST_Init();​
 +    MX_USART2_UART_Init();​
 +    LED_ON;
 +    usart2.printf("​\x0c"​); ​                 //清屏
 +    usart2.printf("​\033[1;​32;​40m"​); ​        //​设置终端字体为绿色
 +    usart2.printf("​\r\nHello,​ I am iCore4T.\r\n"​); ​
 +    while (1)
 +    {
 +      MX_USB_HOST_Process();​
 +     }
 + }
  
- +</​code>​
 === 2.USB_HOST初始化函数 === === 2.USB_HOST初始化函数 ===
 +<code c>
 +void MX_USB_HOST_Init(void)
 +{
 +  /* 初始化主机库,添加支持的类并启动该库 */
 +  if (USBH_Init(&​hUsbHostHS,​ USBH_UserProcess,​ HOST_HS) != USBH_OK)
 +  {
 +    Error_Handler();​
 +  }
 +  if (USBH_RegisterClass(&​hUsbHostHS,​ USBH_MSC_CLASS) != USBH_OK)
 +  {
 +    Error_Handler();​
 +  }
 +  if (USBH_Start(&​hUsbHostHS) != USBH_OK)
 +  {
 +    Error_Handler();​
 +  }
 +}
  
- +</​code>​
 === 3.USBH_UserProcess函数 === === 3.USBH_UserProcess函数 ===
 +<code c>
 +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:​
 +    Appli_state = APPLICATION_READY;​
 +    //f_mount
 +    res = f_mount(&​fatfs,"​0:",​1);​
 +    if(res != RES_OK){
 +        USBH_UsrLog("​\r\nf_mount error!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​   ​
 +        }
 +    }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); ​  //​打开驱动器0上的源文件
 +     ​if(res != RES_OK){
 +        USBH_UsrLog("​f_open error!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​    
 +        }
 +    }else{
 +        USBH_UsrLog("​f_open successful!"​);​
 +    }
 +    //f_lseek
 +    res = f_lseek(&​file,​0);​
 +    if(res != RES_OK){
 +        USBH_UsrLog("​f_lseek error!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​    
 +        }   
 +    }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!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​    
 +        }
 +    }else{
 +        USBH_UsrLog("​f_write successful!"​);​
 +    }
 +    //f_lseek
 +    res = f_lseek(&​file,​0);​
 +    if(res != RES_OK){
 +        USBH_UsrLog("​f_lseek error!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​    
 +        }   
 +    }else{
 +        USBH_UsrLog("​f_lseek successful!"​);​
 +    }
 +    //f_read
 +    res = f_read(&​file,​read_buffer,​512,&​counter); ​
 +    if(res != RES_OK || counter != 512){
 +        USBH_UsrLog("​f_read error!"​);​
 +        while(1){
 +            LED_ON;
 +            HAL_Delay(500);​
 +            LED_OFF;
 +            HAL_Delay(500); ​    
 +        }   
 +    }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 ++)
 +            usart2.printf("​%02X ",​read_buffer[i*16+j]);​
 +        usart2.printf("​\r\n"​);​
 +    }   
 +  break;
 +  case HOST_USER_CONNECTION:​
 +  Appli_state = APPLICATION_START;​
 +  break;
 +  default:
 +  break;
 +  }
 +}
  
 +</​code>​
    
 ==== 五、 实验步骤 ==== ==== 五、 实验步骤 ====
行 158: 行 323:
   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。
 ==== 六、 实验现象 ==== ==== 六、 实验现象 ====
- +{{ :​icore4t:​icore4t_arm_hal_30_5.png?​direct |}} 
- +
  
icore4t_30.1583974557.txt.gz · 最后更改: 2020/03/12 08:55 由 zgf