用户工具

站点工具


icore4t_30

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4t_30 [2020/03/12 09:03]
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 开发平台。
行 132: 行 135:
  
   * 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 |}}  
- +{{ :​icore4t:​icore4t_arm_hal_30_2.png?​direct |}} 
 === 4.OTG_HS中断 === === 4.OTG_HS中断 ===
-  * +
   * 当OTG_HS控制器在一种模式下(设备模式或主机模式)工作时,应用程序不得以另一种角色模式访问寄存器。如果发生了非法访问,将会产生模式不匹配中断并在模块中断寄存器(OTG_GINTSTS寄存器中的MMIS位)中反映。当模块从一种角色模式切换到另一种角色模式时,新工作模式下的寄存器必须重新编程为上电复位后的状态。如图显示了中断层级:   * 当OTG_HS控制器在一种模式下(设备模式或主机模式)工作时,应用程序不得以另一种角色模式访问寄存器。如果发生了非法访问,将会产生模式不匹配中断并在模块中断寄存器(OTG_GINTSTS寄存器中的MMIS位)中反映。当模块从一种角色模式切换到另一种角色模式时,新工作模式下的寄存器必须重新编程为上电复位后的状态。如图显示了中断层级:
- +{{ :​icore4t:​icore4t_arm_hal_30_3.png?​direct |}} 
 === 5.原理图 === === 5.原理图 ===
 +{{ :​icore4t:​icore4t_arm_hal_30_4.png?​direct |}} 
   * 由于STM32不带高速PHY,在这里我们用STM32H750和USB3300连接的方式来实现数据的高速传输。本实验通过移植ST官方提供的代码来实现STM32对U盘或者读卡器等大容量USB存储设备的读写操作。   * 由于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>​
    
 ==== 五、 实验步骤 ==== ==== 五、 实验步骤 ====
行 160: 行 323:
   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。
 ==== 六、 实验现象 ==== ==== 六、 实验现象 ====
- +{{ :​icore4t:​icore4t_arm_hal_30_5.png?​direct |}} 
- +
  
icore4t_30.1583975003.txt.gz · 最后更改: 2020/03/12 09:03 由 zgf