彻底拿下QSPI双闪存W25Q256| STM32H750| QSPI 双FLASH |cubeIDE |下载算法(三)
先说结果:已实现stm32h750Pro开发板双QSPI FLASH代码下载以及运行
涉及到三个工程:
1.生成下载算法的工程
2.boot工程(在stm32内部FASH中运行)
3.APP工程(在两片QSPI FLASH中运行)
生成算法的工程在(1条消息) 彻底拿下QSPI双闪存W25Q256| STM32H750| QSPI 双FLASH |cubeIDE |下载算法(二)_国企摸鱼程序猿的博客-CSDN博客
已经给出了源码和算法文件,下面介绍一下boot和app
boot工程完成的功能为:
1.初始化MPU、初始化时钟
2.使能UART(用来打印信息)
3.使能QSPI双闪存模式
4.串口打印“boot run",并读一下首地址也打印出来
5.使能QSPI映射模式
6.跳转到QSPI FLASH执行
这里的跳转参考了安富莱的资料,删除了RTOS的相关配置,代码如下
static void JumpToApp(void)
{
uint32_t i=0;
void (*AppJump)(void);
__IO uint32_t AppAddr = 0x90000000;
DISABLE_INT();
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
ENABLE_INT();
AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
AppJump();
while (1)
{
}
}
app工程完成的功能为:
1.初始化MPU、初始化时钟
2.使能UART(用来打印信息)
3.串口打印“HELLO!"
运行结果为:
值得注意:
1.只有将boot烧录到内部FLASH后,才能对APP工程进行Debug调试,否则无法进行调试
2.APP的时钟初始化必须与BOOT的时钟初始化保持一致,否则时钟初始化会失败。SystemClock_Config函数将会卡在 HAL_RCC_OscConfig ,从而进入Error_Handler()。类似问题参考(1条消息) STM32实战项目:HAL_RCC_OscConfig中程序卡死问题解决办法_雍正不秃头的博客-CSDN博客
有了这样的基础配置,为后续的项目大小基础,但是在QSPI里执行代码性能可能会受到影响,可以考虑进行一个搬移工作,将QSPI里的代码搬移到SDRAM,然后再在SDRAM中运行。另外在boot软件中也可以考虑软件升级功能,即将APP区域擦除,并上传新的APP代码进行烧录,上传形式可以考虑串口、网口、USB等。这里说的很多功能,都已经有成熟的软件层的案例了,个人觉得越是软件层的东西,越没有必要重复造轮子,因此考虑上RT-Thread,使用一些里面的组件。这是后面的目标。
先附上APP源码和BOOT源码,这两个工程都是基于cubeIDE的。
https://gitee.com/li-changdong/stm32h7_boot.git
https://gitee.com/li-changdong/stm32h7_app.git