用户工具

站点工具


icore4t_51

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4t_51 [2020/03/25 14:14]
zgf
icore4t_51 [2022/04/01 10:56] (当前版本)
sean
行 3: 行 3:
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-03-25 ​ |  gingko ​ |  初次建立 ​ |  |  V1.0  |  2020-03-25 ​ |  gingko ​ |  初次建立 ​ | 
行 189: 行 188:
 { {
     int flash_id;     int flash_id;
-  ​CPU_CACHE_Enable(); ​   +    ​CPU_CACHE_Enable(); ​   
-  HAL_Init();​ +    HAL_Init();​ 
-  SystemClock_Config();​+    SystemClock_Config();​
     i2c.initialize();​     i2c.initialize();​
     axp152.initialize();​     axp152.initialize();​
行 216: 行 215:
     }        }   
   while (1)   while (1)
-  ​{+    ​{
     MX_USB_HOST_Process();​     MX_USB_HOST_Process();​
-  ​}+    ​}
     start:     start:
     /* Initialize w25q64 */     /* Initialize w25q64 */
行 230: 行 229:
     }     }
     QSPI_EnableMemoryMappedMode(&​hqspi);​     QSPI_EnableMemoryMappedMode(&​hqspi);​
-  ​CPU_CACHE_Disable();​ +    ​CPU_CACHE_Disable();​ 
-  SysTick->​CTRL = 0; +    SysTick->​CTRL = 0; 
-  JumpToApplication = (pFunction) (*(__IO uint32_t*) (APPLICATION_ADDRESS + 4)); +    JumpToApplication = (pFunction) (*(__IO uint32_t*) (APPLICATION_ADDRESS + 4)); 
-  __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);​ +    __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);​ 
-  JumpToApplication(); ​     ​+    JumpToApplication(); ​     ​
 } }
  
 </​code>​ </​code>​
 === 2.QSPI FLASH退出QPI模式 === === 2.QSPI FLASH退出QPI模式 ===
 +<code c>
 void W25QXX_ExitQPIMode(void) void W25QXX_ExitQPIMode(void)
 {    {   
行 267: 行 267:
     w25qxx_mode = W25QXX_MODE_SPI;​     w25qxx_mode = W25QXX_MODE_SPI;​
 } }
 +</​code>​
 === 3.QSPI FLASH进入QPI模式 === === 3.QSPI FLASH进入QPI模式 ===
 <code c> <code c>
行 323: 行 323:
 === 4.QSPI FLASH复位 === === 4.QSPI FLASH复位 ===
 <code c> <code c>
 +void W25QXX_Reset(void)
 +{
 +    QSPI_CommandTypeDef cmd;
 +    if (w25qxx_mode)
 +    {
 +        cmd.InstructionMode = QSPI_INSTRUCTION_4_LINES;​
 +    }
 +    else
 +    {
 +        cmd.InstructionMode = QSPI_INSTRUCTION_1_LINE;​
 +    }
 +    cmd.Instruction = W25X_EnableReset;​
 +    ​
 +    cmd.AddressMode = QSPI_ADDRESS_NONE;​
 +    cmd.AddressSize = QSPI_ADDRESS_24_BITS;​
 +    cmd.Address = 0;
 +    ​
 +    cmd.DataMode = QSPI_DATA_NONE;​
 +    cmd.NbData = 0;
 +    ​
 +    cmd.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;​
 +    cmd.AlternateBytesSize = 0;
 +    cmd.AlternateBytes = 0x00;
 +    cmd.DummyCycles = 0;
 +    cmd.DdrMode = QSPI_DDR_MODE_DISABLE;​
 +    cmd.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;​
 +    cmd.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;​
 +    ​
 +    W25QXX_WaitBusy();​
 +    if (HAL_QSPI_Command(&​hqspi,​ &cmd, 100) == HAL_OK)
 +    {
 +        cmd.Instruction = W25X_ResetDevice;​
 +        HAL_QSPI_Command(&​hqspi,​ &cmd, 100);
 +    }
 +}
    
 </​code>​ </​code>​
 === 5.USB_HOST初始化函数 === === 5.USB_HOST初始化函数 ===
 <code c> <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>​ </​code>​
 === 6.USBH_UserProcess函数 === === 6.USBH_UserProcess函数 ===
 <code c> <code c>
 +static void USBH_UserProcess ​ (USBH_HandleTypeDef *phost, uint8_t id)
 +{
 +    FIL fil;
 +    FATFS fatfs;
 +    static FRESULT res;
 +    unsigned char buffer[4096];​
 +    unsigned long int ncounter = 0;
 +    unsigned int counter;
 +    FILINFO finfo;  ​
 +    ​
 +  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;​
 +    LED_OFF;
 +    res = f_mount(&​fatfs,"​0:",​1);​
 +    //​判断是否成功
 +    if(res != RES_OK){
 +        led_trade();​
 +    }
 +    res = f_open(&​fil,"​0:/​app.bin",​FA_READ); ​      //​打开app.bin文件
 +    //​判断文件打开是否成功
 +    if(res != RES_OK){
 +        led_trade();​
 +    }
 +    res = f_lseek(&​fil,​0); ​                          //​将指针移动到第一个位置
 +
 +    //​指针是否移动成功
 +    if(res != RES_OK){
 +        led_trade();​
 +    }
 +    ​
 +    //​获取文件信息
 +    f_stat("​0:/​app.bin",&​finfo);​
 +    ​
 +    while(ncounter < finfo.fsize)
 +    {
 +        //​读取4096Byte数据
 +    res = f_read(&​fil,​buffer,​4096,&​counter); ​                    //​读文件
 +        if(res != RES_OK){
 +            led_trade();​
 +        }
 +        //写入EXT FLASH中
 +        BSP_QSPI_Erase_Block(ncounter);​
 +        LED_ON;
 +        BSP_QSPI_Write(buffer,​ncounter,​4096);​
 +        LED_OFF;
 +        ​
 +        ncounter = ncounter + 4096;
 +  } 
 +    LED_ON; ​
 +  break;
 +
 +  case HOST_USER_CONNECTION:​
 +  Appli_state = APPLICATION_START;​
 +  break;
 +  default:
 +  break;
 +  }
 +}
    
 </​code>​ </​code>​
 === 7.FATFS函数介绍 === === 7.FATFS函数介绍 ===
 <code c> <code c>
- +FRESULT f_mount (               //​挂载/​卸载逻辑驱动器 
 +        FATFS* fs, /* 指向文件系统对象的指针*/​ 
 +        const TCHAR* path, /* 要安装/​卸载的逻辑驱动器号 */ 
 +        BYTE opt         /* 模式选项0:不安装(延迟安装),1:立即安装*/​ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_open (         //​打开或创建文件 
 + FIL* fp,         /* 指向空白文件对象的指针 */ 
 + const TCHAR* path, /* 指向文件名的指针 */ 
 + BYTE mode /* 访问模式和文件打开模式标志 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_read (         //​读文件 
 + FIL* fp, /* 指向文件对象的指针 */ 
 + void* buff,  /* 指向数据缓冲区的指针 */ 
 + UINT btr, /* 读取的字节数 */ 
 + UINT* br /* 指向读取的字节数的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_write (         //​写文件 
 + FIL* fp,   /* 指向文件对象的指针 */ 
 + const void* buff, /* 指向要写入的数据的指针 */ 
 + UINT btw,   /* 要写入的字节数 */ 
 + UINT* bw   /* 指向写入字节数的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_sync (          //​冲洗一个写文件的缓存信息 
 + FIL* fp   /* 指向文件对象的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_close (         //​关闭一个文件 
 + FIL* fp   /* 指向要关闭的文件对象的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_lseek (         //​移动文件读/​写指针 
 + FIL* fp,   /* 指向文件对象的指针 */ 
 + FSIZE_t ofs   /* 指向文件头的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_opendir (      //​创建目录对象 
 + DIR* dp,​  ​     /* 指向要创建的目录对象的指针 */ 
 + const TCHAR* path       /* 指向目录路径的指针 */ 
 +
 </​code>​ </​code>​
 <code c> <code c>
- +FRESULT f_closedir (      //  关闭目录 
 + DIR *dp             /* 指向要关闭的目录对象的指针 */ 
 +
 </​code>​ </​code>​
-  +<code c> 
-  +FRESULT f_readdir (        //​顺序读取目录条目 
-  + DIR* dp,​  ​      /* 指向打开目录对象的指针 */ 
-  + FILINFO* fno        /* 指向要返回的文件信息的指针 */ 
-  +) 
-  + 
-  +</​code>​ 
-  +<code c> 
-  +FRESULT f_stat (           //​获取文件状态 
-  + const TCHAR* path,​  ​ /* 指向文件路径的指针 */ 
-  + FILINFO* fno        /* 指向要返回的文件信息的指针 */ 
-  +
-  + 
 +</​code>​ 
 +<code c> 
 +FRESULT f_getfree (        //​获取空闲簇数 
 + const TCHAR* path,​  ​ /* 逻辑驱动器号的路径名 */ 
 + DWORD* nclst,​  ​      /* 指向变量的指针以返回空闲簇的数量*/​ 
 + FATFS** fatfs  ​      /* 返回指向相应文件系统对象的指针的指针 */ 
 +
 + 
 +</​code>​ 
 +<code c> 
 +FRESULT f_truncate (         //​截断文件 
 + FIL* fp             /* 指向文件对象的指针 */ 
 +
 + 
 +</​code>​ 
 +<code c> 
 +FRESULT f_unlink (           //​删除一个文件或目录 
 + const TCHAR* path /* 指向文件或目录路径的指针 */ 
 +
 + 
 +</​code>​ 
 +<code c> 
 +FRESULT f_mkdir (            //​创建一个目录 
 + const TCHAR* path /* 指向目录路径的指针 */ 
 +
 + 
 +</​code>​ 
 +<code c> 
 +FRESULT f_rename (           //​重命名文件/​目录 
 + const TCHAR* path_old, /* 指向要重命名的对象名称的指针 */ 
 + const TCHAR* path_new /* 指向新名称的指针 */ 
 +) 
 + 
 +</​code>​ 
 +
 ==== 五、 APP实验程序 ==== ==== 五、 APP实验程序 ====
  
 === 主函数 === === 主函数 ===
 +<code c>
 +int main(void)
 +{
 +  HAL_Init();
 +  SystemClock_Config();​
 +    //​配置中断向量偏移
 +    SCB->​VTOR = FLASH_ADDRESS;​ /* Vector Table Relocation in Extren FLASH */
 +    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]
 +    ​
 +    MX_GPIO_Init();​
 +    while (1)
 +  {
 +        //LED闪烁
 +        LED_ON;
 +        HAL_Delay(300);​
 +        LED_OFF;
 +        HAL_Delay(300);​
 +  }
 +}
  
- +</​code>​
 ==== 六、 实验步骤 ==== ==== 六、 实验步骤 ====
  
icore4t_51.1585116888.txt.gz · 最后更改: 2020/03/25 14:14 由 zgf