【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法

目录

【STM32H750】玩转ART-Pi(一)——使用STM32CUBMX生成TouchGFX工程
【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法
【STM32H750】玩转ART-Pi(三)——如何在ART-PI上创建TouchGFX工程
【STM32H750】玩转ART-Pi(四)——添加文件系统
【STM32H750】玩转ART-Pi(五)——添加网络功能
【STM32H750】玩转ART-Pi(六)——添加FTP服务器
【STM32H750】玩转ART-Pi(七)——TouchGFX从文件系统中读取图片
【STM32H750】玩转ART-Pi(八)——添加动态模块

实验平台:

硬件: RT-Thread官方ART-PI H750开发版,正点原子4.3寸RGBLCD屏(800*480)
软件: 最新版本的STM32CubeH7固件库,TouchGFXDesigner v4.15和 STM32CubeMX V6.0.1,开发环境MDK v5.29
在这里插入图片描述

代码下载:

CSDN:https://download.csdn.net/download/sinat_31039061/12849875

联系作者:

加我微信,备注“加群”,加入技术交流群
在这里插入图片描述

为什么需要QSPI-FLASH烧录算法下载到外部flash

1.在实际的UI设计中往往需要大量的图片和字体,而TouchGFX Designer是把所使用的图片和字体自动转换成了静态数组,这些大数组在内部flash中一般是放不下的,所以需要把这些占用资源比较大的数组放在外部flash中,然后通过QSPI地址映射的方式访问。
打开上个工程的TouchGFX Designer,导入一个带图片的例程:
Edit->import GUI
在这里插入图片描述
在这里插入图片描述

重新打开MDK工程,可以发现generated 分类下多了很多资源,通过如下宏定义可以知道该数组会优先存放在名为“ExtFlashSection”的内存区域中:
generated 分类下
MDK的分散加载文件默认是没有“ExtFlashSection”区域的,我们需要通过编写分散加载文件来配置“ExtFlashSection”段:
在这里插入图片描述
通过Edit按钮打开KEIL自己生成的sct文件,然后进行改写:
在这里插入图片描述
通过以上配置后,再编译代码,就不会出现flash不足的错误提示了,但是这时候还不能下载代码,因为没有为该段区域配置下载算法,下载会出现“No Algorithm found for: 90000000H - 9000FFFFH”等错误。
查看map文件,可以发现以上资源的地址已经被分配到了0x90000000:在这里插入图片描述

MDK的STM32H7升级包升级至V2.6.0版本后,对ST所有板子的外置Flash下载算法提供了HAL库版本的源码,可以在这个源码的基础上改成你需要的。
下载地址:https://www.cnblogs.com/armfly/p/12564643.html

安装完成后,找到安装目录,通过以下地址,可以找到源代码:
(提醒一点:默认文件夹的属性是只读类型,所以打开工程后,所有文件都是加锁的,如果想要修改代码,需要把文件夹的属性取消只读)
在这里插入图片描述
由于我在更新最新的V2.6.0软件包之前,已经制作了寄存器版本的烧录算法,所以不再使用HAL库版本的了,感兴趣的可以自行修改。
修改烧录算法的思路其实很简单,只需要修改FlashDev.c里边的外部flash大小,然后根据FlashPrg.c模板所需要的接口,添加你的外部flash驱动就行了,因为ART-PI使用的是W25Q128,和正点原子板子所使用的一样,所以直接把正点原子W25Q128的驱动移植过来就可以了。
在这里插入图片描述
工程模板默认已经做好了生成.FLM文件的配置,编译后会自动生成.FLM文件,然后把STM32H7_W25QXX.FLM拷贝到你MDK的安装目录…Keil_v5\ARM\Flash下。
在这里插入图片描述

添加完下载算法,最后在MDK里修改一下配置,就可以把程序下载到板子里了:
在这里插入图片描述
还差一步:虽然你把图片和字体资源下载到了外部flash,但是这个时候还没有配置地址映射,所以你的程序依然是读不到数据的,需要添加qspi地址映射的代码。我这里依然借用了正点原子的代码:

//QSPI进入内存映射模式(执行QSPI代码必备前提,为了减少引入的文件,
//除了GPIO驱动外,其他的外设驱动均采用寄存器形式)
void QSPI_Enable_Memmapmode(void)
{
	uint32_t tempreg=0; 
	__IO uint32_t *data_reg=&QUADSPI->DR;
	GPIO_InitTypeDef qspi_gpio;
	
	RCC->AHB4ENR|=1<<6;    						//使能PORTG时钟	   
	RCC->AHB4ENR|=1<<5;    						//使能PORTF时钟	   
	RCC->AHB3ENR|=1<<14;   						//QSPI时钟使能

	qspi_gpio.Pin=GPIO_PIN_6;					//PG6 AF10	
	qspi_gpio.Mode=GPIO_MODE_AF_PP;
	qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
	qspi_gpio.Pull=GPIO_NOPULL;
	qspi_gpio.Alternate=GPIO_AF10_QUADSPI;
	HAL_GPIO_Init(GPIOG,&qspi_gpio);
	
	qspi_gpio.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10;		//PF6,7,10 AF9	
	qspi_gpio.Alternate=GPIO_AF9_QUADSPI;
	HAL_GPIO_Init(GPIOF,&qspi_gpio);
	
	qspi_gpio.Pin=GPIO_PIN_8|GPIO_PIN_9;		//PF8,9 AF10		
	qspi_gpio.Alternate=GPIO_AF10_QUADSPI;
	HAL_GPIO_Init(GPIOF,&qspi_gpio);
	
	//QSPI设置,参考QSPI实验的QSPI_Init函数
	RCC->AHB3RSTR|=1<<14;			//复位QSPI
	RCC->AHB3RSTR&=~(1<<14);		//停止复位QSPI
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 
	QUADSPI->CR=0X01000310;			//设置CR寄存器,这些值怎么来的,请参考QSPI实验/看H750参考手册寄存器描述分析
	QUADSPI->DCR=0X00160401;		//设置DCR寄存器
	QUADSPI->CR|=1<<0;				//使能QSPI 

	//注意:QSPI QE位的使能,在QSPI烧写算法里面,就已经设置了
	//所以,这里可以不用设置QE位,否则需要加入对QE位置1的代码
	//不过,代码必须通过仿真器下载,直接烧录到外部QSPI FLASH,是不可用的
	//如果想直接烧录到外部QSPI FLASH也可以用,则需要在这里添加QE位置1的代码
	
	//W25QXX进入QPI模式(0X38指令)
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 
	QUADSPI->CCR=0X00000138;		//发送0X38指令,W25QXX进入QPI模式
	while((QUADSPI->SR&(1<<1))==0);	//等待指令发送完成
	QUADSPI->FCR|=1<<1;				//清除发送完成标志位 	

	//W25QXX写使能(0X06指令)
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 
	QUADSPI->CCR=0X00000106;		//发送0X06指令,W25QXX写使能
	while((QUADSPI->SR&(1<<1))==0);	//等待指令发送完成
	QUADSPI->FCR|=1<<1;				//清除发送完成标志位 
	
	//W25QXX设置QPI相关读参数(0XC0)
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 
	QUADSPI->CCR=0X030003C0;		//发送0XC0指令,W25QXX读参数设置
	QUADSPI->DLR=0;
	while((QUADSPI->SR&(1<<2))==0);	//等待FTF
	*(__IO uint8_t *)data_reg=3<<4;			//设置P4&P5=11,8个dummy clocks,104M
	QUADSPI->CR|=1<<2;				//终止传输 
	while((QUADSPI->SR&(1<<1))==0);	//等待数据发送完成
	QUADSPI->FCR|=1<<1;				//清除发送完成标志位  
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 	 

	//MemroyMap 模式设置
	while(QUADSPI->SR&(1<<5));		//等待BUSY位清零 
	QUADSPI->ABR=0;					//交替字节设置为0,实际上就是W25Q 0XEB指令的,M0~M7=0
	tempreg=0XEB;					//INSTRUCTION[7:0]=0XEB,发送0XEB指令(Fast Read QUAD I/O)
	tempreg|=3<<8;					//IMODE[1:0]=3,四线传输指令
	tempreg|=3<<10;					//ADDRESS[1:0]=3,四线传输地址
	tempreg|=2<<12;					//ADSIZE[1:0]=2,24位地址长度
	tempreg|=3<<14;					//ABMODE[1:0]=3,四线传输交替字节
	tempreg|=0<<16;					//ABSIZE[1:0]=0,8位交替字节(M0~M7)
	tempreg|=6<<18;					//DCYC[4:0]=6,6个dummy周期
	tempreg|=3<<24;					//DMODE[1:0]=3,四线传输数据
	tempreg|=3<<26;					//FMODE[1:0]=3,内存映射模式
	QUADSPI->CCR=tempreg;			//设置CCR寄存器
	
	//设置QSPI FLASH空间的MPU保护
	SCB->SHCSR&=~(1<<16);			//禁止MemManage 
	MPU->CTRL&=~(1<<0);				//禁止MPU
	MPU->RNR=0;						//设置保护区域编号为0(1~7可以给其他内存用)
	MPU->RBAR=0X90000000;			//基地址为0X9000 000,即QSPI的起始地址
	MPU->RASR=0X0303002D;			//设置相关保护参数(禁止共用,允许cache,允许缓冲),详见MPU实验的解析
	MPU->CTRL=(1<<2)|(1<<0);		//使能PRIVDEFENA,使能MPU 
	SCB->SHCSR|=1<<16;				//使能MemManage
}

烧录验证:
在这里插入图片描述
2.STM32H750XBH6的官方指导手册说明内部flash只要128K,这个空间对于做项目来说是远远不够,所以也需要将部分代码下载到外部flash,具体原理和上边差不多,至于你想把哪部分代码放到外部,可以有你自己决定。ART-PI的做法是把bootloader放在内部的128kflash,app部分放在外部flash。

(悄悄告诉你,虽然官方手册上说明内部flash只有128k的大小,但是经过实际测试,可以用到2M的空间,至于超出的空间安全不安全就不知道了)

关注公众号,后续有精彩内容会第一时间发送给您!
在这里插入图片描述

  • 15
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
STM32H750 QSPI烧录算法是指在STM32H750芯片上通过QSPI接口进行固件烧录的一种算法。 首先,要使用QSPI烧录算法,我们需要确保 QSPI 接口在 STM32H750 的引脚映射正确,并且芯片的相关寄存器设置正确。 接下来,我们可以通过以下步骤来完成烧录: 1. 准备好固件文件:将需要烧录的固件文件准备好,并确保其格式正确。 2. 初始化 QSPI 接口:通过配置 STM32H750 的相应寄存器,初始化 QSPI 接口。这包括设置 QSPI 的时序参数、FIFO 模式、Dummy 地址周期等。 3. 配置 Flash 写入使能:根据 Flash 的型号和规格,正确配置 Flash 的写入使能位。这些配置可能包括手册中的擦除和编程命令。 4. 发送擦除命令:使用 QSPI 接口发送擦除命令,擦除需要烧录Flash 区域。 5. 校验擦除结果:读取 Flash 中的数据,确认擦除是否正确。如果存在错误,可能需要重新执行擦除步骤。 6. 发送编程命令:使用 QSPI 接口发送编程命令,将固件数据烧录Flash 中。 7. 校验烧录结果:读取 Flash 中的数据,与固件文件进行对比,确认烧录是否成功。如果存在错误,可能需要重新执行编程步骤。 8. 关闭 QSPI 接口:完成烧录后,可以关闭 QSPI 接口,释放相关资源。 总结来说,STM32H750 QSPI烧录算法涉及到引脚映射、QSPI接口初始化、Flash写入使能配置、擦除命令发送与校验、编程命令发送与校验等步骤。实施该算法可以实现对STM32H750芯片的固件烧录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WALI-KANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值