【STM32H7教程】第83章 STM32H7的内部Flash和QSPI Flash都运行程序的混合方式(强烈推荐)

2020-11-24 11:00:17 浏览数 (1)

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第83章 STM32H7的内部Flash和QSPI Flash都运行程序的混合方式(强烈推荐)

本章节为大家讲解内部Flash和外部QSPI Flash都运行程序的混合方式。

83.1 初学者重要提示

83.2 内部Fkash和QSPI Flash混合执行程序的优势

83.3 下载算法存储存放位置

83.4 内部Flash和QSPI Flash混合执行程序说明

83.5 内部Flash和QSPI Flash程序调试下载配置

83.6 实验例程说明

83.7 总结

83.1 初学者重要提示

  1. QSPI Flash的相关知识点可以看第78章和79章。
  2. 操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。
  3. 本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。

83.2 内部Flash和QSPI Flash混合执行程序的优势

现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。

本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。

83.3 下载算法存放位置

编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:

生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:

  • 第1种:存放到MDK的STM32H7软包安装目录里面:KeilSTM32H7xx_DFP2.6.0CMSISFlash(软包版本不同,数值2.6.0不同)。
  • 第2种:MDK的安装目录 ARMFlash里面。

83.4 内部Flash和QSPI Flash混合执行程序说明

混合程序的设置注意以下两点即可。

83.4.1 初始化QSPI Flash并设置内存映射模式

在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:

代码语言:javascript复制
/*
*********************************************************************************************************
*    函 数 名: bsp_Init
*    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
    /* 配置MPU */
    MPU_Config();
    
    /* 使能L1 Cache */
    CPU_CACHE_Enable();

    /* 
       STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
       - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
       - 设置NVIV优先级分组为4。
     */
    HAL_Init();

    /* 
       配置系统时钟到400MHz
       - 切换使用HSE。
       - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    */
    SystemClock_Config();

    /* 
       Event Recorder:
       - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
       - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    */    
#if Enable_EventRecorder == 1  
    /* 初始化EventRecorder并开启 */
    EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();
#endif
    
    /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   
     QSPI_MemoryMapped();

bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       
    bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    bsp_InitTimer();      /* 初始化滴答定时器 */
    bsp_InitUart();        /* 初始化串口 */
    bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    
    bsp_InitLed();        /* 初始化LED */    
    bsp_InitExtSDRAM(); /* 初始化SDRAM */
    
    bsp_InitI2C();        /* 初始化I2C总线 */
    TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ 
    LCD_InitHard();     /* 初始化LCD */
}

83.4.2 设置运行在内部Flash和QSPI Flash的程序

由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:

83.5 内部Flash和QSPI Flash程序调试下载配置

将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。

83.5.1 下载配置

注意这里一定要够大,否则会提示算法文件无法加载:

我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。

如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:

83.5.2 调试配置

注意这里一定要够大,否则会提示算法文件无法加载:

我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。

如果要做调试下载,需要做如下配置:

83.5.3 程序调试效果

调试效果如下:

83.6 实验例程说明

本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)

编译此程序弹出的警告不用管,可以选择屏蔽此警告:

83.7 总结

本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。

0 人点赞