这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-10 | gingko | 初次建立 |
int main(void) { int i; int k; unsigned int counter; unsigned long int ncounter = 0; unsigned char buffer[1024]; FIL fil; FATFS fatfs; static FRESULT res; /* MCU 配置*/ /* 重置所有外设, 初始化Flash接口和Systick. */ HAL_Init(); /* 系统时钟配置 */ SystemClock_Config(); /* 初始化所有已配置的外设 */ MX_GPIO_Init(); //如果上电时检测到按键按下,则进入虚拟U盘模式,重新上电则开始升级FPGA if(ARM_KEY_STATE == KEY_DOWN){ MX_USB_DEVICE_Init(); while(1){ LED_RED_ON; HAL_Delay(300); LED_RED_OFF; HAL_Delay(300); } } //SD卡初始化 if(BSP_SD_Init() != MSD_OK){ //初始化失败,红色LED快闪 while(1){ LED_RED_ON; for(i = 0;i < 3000000;i ++); LED_RED_OFF; for(i = 0;i < 3000000;i ++); } } HAL_Delay(500); //判断f_mount是否成功 res = f_mount(&fatfs,"0",1); if(res != RES_OK){ while(1){ LED_RED_ON; for(i = 0;i < 3000000;i ++); LED_RED_OFF; for(i = 0;i < 3000000;i ++); } } res = f_open(&fil,"0:/system/sram.rbf",FA_READ); //只读打开文件 if(res != RES_OK){ //打开失败,蓝灯快闪 while(1){ LED_BLUE_ON; for(i = 0;i < 3000000;i++); LED_BLUE_OFF; for(i = 0;i < 3000000;i++); } } res = f_lseek(&fil,0); //将指针移动到第一个位置 if(res != RES_OK){ //白色 LED_RED_ON; LED_BLUE_ON; LED_GREEN_ON; while(1){ } } //开始升级FPGA程序 NCONFIG_OFF; DCLK_OFF; for(i = 0; i < 5000; i++); if(NSTATUS == 1) { LED_RED_ON; return 0; } for(i = 0;i < 40;i++); NCONFIG_ON; for(i = 0; i < 40; i++); while(ncounter < fil.fsize) { res = f_read(&fil,buffer,1024,&counter); //读取数据 if(res != RES_OK){ //读取失败,红灯慢闪 while(1){ LED_RED_ON; for(i = 0;i < 10000000;i++); LED_RED_OFF; for(i = 0;i < 10000000;i++); } } for(k = 0; k < counter; k++) { for(i = 0; i < 8; i++) { if(buffer[k]&0x01)DATA0_ON; else DATA0_OFF; DCLK_ON; buffer[k] >>= 1; DCLK_OFF; } ncounter++; } } if(CONFIG_DONE == 1){ LED_GREEN_ON; }else { LED_BLUE_ON; } for(i = 0; i < 40; i++) { DCLK_ON; for(i = 0; i < 800; i++); //延时 100us DCLK_OFF; for(i = 0; i < 800; i++); //延时 100us } while (1) { } }
void MX_USB_DEVICE_Init(void) { /* 初始化设备库,添加支持的类并启动该库*/ USBD_Init(&hUsbDeviceHS, &HS_Desc, DEVICE_HS); USBD_RegisterClass(&hUsbDeviceHS, &USBD_MSC); USBD_MSC_RegisterStorage(&hUsbDeviceHS, &USBD_Storage_Interface_fops_HS);
uint8_t BSP_SD_Init(void) { /* 默认情况下,初始化SDMMC1 */ return BSP_SD_InitEx(SD_CARD1); } /** * @brief 初始化SD卡设备。 * @param SdCard:要使用的SD卡,应该为SD_CARD1或SD_CARD2 * @retval SD status */ uint8_t BSP_SD_InitEx(uint32_t SdCard) { uint8_t sd_state = MSD_OK; /* uSD设备接口配置 */ if(SdCard == SD_CARD1) { uSdHandle.Instance = SDMMC1; uSdHandle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; uSdHandle.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE; uSdHandle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; uSdHandle.Init.BusWide = SDMMC_BUS_WIDE_1B; uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; uSdHandle.Init.ClockDiv = SDMMC_INIT_CLK_DIV; } else { uSdHandle2.Instance = SDMMC2; uSdHandle2.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; uSdHandle2.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE; uSdHandle2.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; uSdHandle2.Init.BusWide = SDMMC_BUS_WIDE_1B; uSdHandle2.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; uSdHandle2.Init.ClockDiv = SDMMC_TRANSFER_CLK_DIV; } /*检查SD卡是否插入插槽 */ if(SdCard == SD_CARD1) { /* Msp SD初始化 */ BSP_SD_MspInit(&uSdHandle, NULL); /* HAL SD初始化 */ if(HAL_SD_Init(&uSdHandle) != HAL_OK) { sd_state = MSD_ERROR; } } else { /* Msp SD初始化 */ BSP_SD_MspInit(&uSdHandle2, NULL); /* HAL SD初始化 */ if(HAL_SD_Init(&uSdHandle2) != HAL_OK) { sd_state = MSD_ERROR; } } /* 配置SD总线宽度 */ if(sd_state == MSD_OK) { if(SdCard == SD_CARD1) { /* 启用宽度操作 */ sd_state = HAL_SD_ConfigWideBusOperation(&uSdHandle, SDMMC_BUS_WIDE_4B); } else { /* 启用宽度操作 */ sd_state = HAL_SD_ConfigWideBusOperation(&uSdHandle2, SDMMC_BUS_WIDE_4B); } if(sd_state != HAL_OK) { sd_state = MSD_ERROR; } else { sd_state = MSD_OK; } } return sd_state; }