银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-03-03 | gingko | 初次建立 |
1.在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR。 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置。 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 3.配置RCC,使用外部时钟源。 4.时基源选择SysTick。 5.将PA10,PB7,PB8设置为GPIO_Output。 6.引脚模式配置。 7.设置串口。 8.在NVIC Settings一栏使能接收中断。 9.配置SDMMC1。 10.配置FATFS。 11.时钟源设置,选择外部高速时钟源,配置为最大主频。 12.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27。 13.点击Code Generator,进行进一步配置。
int main(void) { FATFS fatfs; static FRESULT res; 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] MX_GPIO_Init(); MX_USART2_UART_Init(); MX_SDMMC1_SD_Init(); MX_FATFS_Init(); usart2.initialize(115200); //串口波特率设置 usart2.printf("\x0c"); //清屏 usart2.printf("\033[1;32;40m"); //设置终端字体为绿色 usart2.printf("Hello,I am iCore4T!\r\n\r\n"); //串口信息输出 LED_ON; //FPGA PS fpga_ps.initialize();//FPGA PS模式初始化 usart2.printf("\033[1;32;40m"); //显示绿色 usart2.printf("*Try config fpga from TF Card......\r\n"); if(BSP_SD_Init() != MSD_OK){//判断SD卡是否初始化 usart2.printf("*TF Card error!\r\n"); while (1){ } }else{ usart2.printf("*FPGA Is Updating......\r\n"); } HAL_Delay(500); res = f_mount(&fatfs,"0",1);//挂载SD卡 if(res != RES_OK){ usart2.printf("*f_mount error!\r\n");//挂载失败 } if(fpga_ps.from_tf() == 0){//通过from_tf函数返回值0,判断升级是否成功 usart2.printf("*Update Completed!\r\n"); } while (1) { } }
static int initialize(void) { GPIO_InitTypeDef GPIO_InitStruct; //初始化PS配置引脚 __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); //PS_DATA0<--->PI8 //PS_DCLK<--->PI4 GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); //PS_NCONFIG<--->PC6 GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); //nSTATUS<--->PD4 //CONFDONE<--->PC13 GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); return 0; }
static int ps(FIL *f) { int i; int k; unsigned int counter; unsigned long int ncounter = 0; unsigned char buffer[1024]; FRESULT res; FILINFO finfo; //进入PS模式 NCONFIG_OFF; DCLK_OFF; for(i = 0; i < 5000; i++); if(NSTATUS == 1){//判断FPGA是否已响应配置要求 usart2.printf("\r\n*fpga error!\r\n"); return -1; } for(i = 0;i < 40;i++); NCONFIG_ON; for(i = 0; i < 40; i++); f_stat ("0:/spi.rbf",&finfo); //获取文件状态 while(ncounter < finfo.fsize) { res = f_read(f,buffer,1024,&counter); //读取文件 if(res != RES_OK){ usart2.printf("\r\n*f_read error!\r\n"); return -1; } 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 == 0){ usart2.printf("\r\n*config error!\r\n"); return -1; } for(i = 0; i < 40; i++) { DCLK_ON; for(i = 0; i < 800; i++);//delay 100us DCLK_OFF; for(i = 0; i < 800; i++);//delay 100us } return 0;//返回成功标志 }
FRESULT f_mount ( //挂载/卸载逻辑驱动器 FATFS* fs, /* 指向文件系统对象的指针*/ const TCHAR* path, /* 要安装/卸载的逻辑驱动器号 */ BYTE opt /* 模式选项0:不安装(延迟安装),1:立即安装*/ )
FRESULT f_open ( //打开或创建文件 FIL* fp, /* 指向空白文件对象的指针 */ const TCHAR* path, /* 指向文件名的指针 */ BYTE mode /* 访问模式和文件打开模式标志 */ )
FRESULT f_write ( //写文件 FIL* fp, /* 指向文件对象的指针 */ const void* buff, /* 指向要写入的数据的指针 */ UINT btw, /* 要写入的字节数 */ UINT* bw /* 指向写入字节数的指针 */ )
FRESULT f_sync ( //冲洗一个写文件的缓存信息 FIL* fp /* 指向文件对象的指针 */ ) FRESULT f_close ( //关闭一个文件 FIL* fp /* 指向要关闭的文件对象的指针 */ ) FRESULT f_lseek ( //移动文件读/写指针 FIL* fp, /* 指向文件对象的指针 */ FSIZE_t ofs /* 指向文件头的指针 */ ) FRESULT f_opendir ( //创建目录对象 DIR* dp, /* 指向要创建的目录对象的指针 */ const TCHAR* path /* 指向目录路径的指针 */ ) FRESULT f_closedir ( // 关闭目录 DIR *dp /* 指向要关闭的目录对象的指针 */ ) FRESULT f_readdir ( //顺序读取目录条目 DIR* dp, /* 指向打开目录对象的指针 */ FILINFO* fno /* 指向要返回的文件信息的指针 */ ) FRESULT f_stat ( //获取文件状态 const TCHAR* path, /* 指向文件路径的指针 */ FILINFO* fno /* 指向要返回的文件信息的指针 */ ) FRESULT f_getfree ( //获取空闲簇数 const TCHAR* path, /* 逻辑驱动器号的路径名 */ DWORD* nclst, /* 指向变量的指针以返回空闲簇的数量*/ FATFS** fatfs /* 返回指向相应文件系统对象的指针的指针 */ ) FRESULT f_truncate ( //截断文件 FIL* fp /* 指向文件对象的指针 */ ) FRESULT f_unlink ( //删除一个文件或目录 const TCHAR* path /* 指向文件或目录路径的指针 */ ) FRESULT f_mkdir ( //创建一个目录 const TCHAR* path /* 指向目录路径的指针 */ ) FRESULT f_rename ( //重命名文件/目录 const TCHAR* path_old, /* 指向要重命名的对象名称的指针 */ const TCHAR* path_new /* 指向新名称的指针 */ )