目录
【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”的内存区域中:
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地址映射的代码。我这里依然借用了正点原子的代码:
void QSPI_Enable_Memmapmode(void)
{
uint32_t tempreg=0;
__IO uint32_t *data_reg=&QUADSPI->DR;
GPIO_InitTypeDef qspi_gpio;
RCC->AHB4ENR|=1<<6;
RCC->AHB4ENR|=1<<5;
RCC->AHB3ENR|=1<<14;
qspi_gpio.Pin=GPIO_PIN_6;
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;
qspi_gpio.Alternate=GPIO_AF9_QUADSPI;
HAL_GPIO_Init(GPIOF,&qspi_gpio);
qspi_gpio.Pin=GPIO_PIN_8|GPIO_PIN_9;
qspi_gpio.Alternate=GPIO_AF10_QUADSPI;
HAL_GPIO_Init(GPIOF,&qspi_gpio);
RCC->AHB3RSTR|=1<<14;
RCC->AHB3RSTR&=~(1<<14);
while(QUADSPI->SR&(1<<5));
QUADSPI->CR=0X01000310;
QUADSPI->DCR=0X00160401;
QUADSPI->CR|=1<<0;
while(QUADSPI->SR&(1<<5));
QUADSPI->CCR=0X00000138;
while((QUADSPI->SR&(1<<1))==0);
QUADSPI->FCR|=1<<1;
while(QUADSPI->SR&(1<<5));
QUADSPI->CCR=0X00000106;
while((QUADSPI->SR&(1<<1))==0);
QUADSPI->FCR|=1<<1;
while(QUADSPI->SR&(1<<5));
QUADSPI->CCR=0X030003C0;
QUADSPI->DLR=0;
while((QUADSPI->SR&(1<<2))==0);
*(__IO uint8_t *)data_reg=3<<4;
QUADSPI->CR|=1<<2;
while((QUADSPI->SR&(1<<1))==0);
QUADSPI->FCR|=1<<1;
while(QUADSPI->SR&(1<<5));
while(QUADSPI->SR&(1<<5));
QUADSPI->ABR=0;
tempreg=0XEB;
tempreg|=3<<8;
tempreg|=3<<10;
tempreg|=2<<12;
tempreg|=3<<14;
tempreg|=0<<16;
tempreg|=6<<18;
tempreg|=3<<24;
tempreg|=3<<26;
QUADSPI->CCR=tempreg;
SCB->SHCSR&=~(1<<16);
MPU->CTRL&=~(1<<0);
MPU->RNR=0;
MPU->RBAR=0X90000000;
MPU->RASR=0X0303002D;
MPU->CTRL=(1<<2)|(1<<0);
SCB->SHCSR|=1<<16;
}
烧录验证:
2.STM32H750XBH6的官方指导手册说明内部flash只要128K,这个空间对于做项目来说是远远不够,所以也需要将部分代码下载到外部flash,具体原理和上边差不多,至于你想把哪部分代码放到外部,可以有你自己决定。ART-PI的做法是把bootloader放在内部的128kflash,app部分放在外部flash。
(悄悄告诉你,虽然官方手册上说明内部flash只有128k的大小,但是经过实际测试,可以用到2M的空间,至于超出的空间安全不安全就不知道了)
关注公众号,后续有精彩内容会第一时间发送给您!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)