【STM32H7教程】第82章STM32H7的QSPI总线应⽤之
QSPIFlash执⾏程序。。。
第82章      STM32H7的QSPI总线应⽤之QSPI Flash执⾏程序(BOOT+APP⽅式)
本章节为⼤家讲解QSPI Flash执⾏程序。
82.1 初学者重要提⽰
82.2 下载算法存放位置
82.3 QSPI Flash的Bootloader说明
82.4 QSPI Flash的APP应⽤程序说明
82.5 QSPI Flash的APP应⽤程序调试下载配置
82.6 实验例程说明
82.7 总结
82.1 初学者重要提⽰
1.  QSPI Flash的相关知识点可以看第78章和79章。
2. 操作本章配套例⼦前务必先将QSPI Flash的下载算法放到MDK安装⽬录。stm32怎么使用printf
3.  QSPI Flash执⾏程序的BOOT和APP作⽤:
BOOT程序需要下载到内部Flash。主要⽤于跳转到外部QSPI Flash执⾏程序。那么问题来了,我们可不可以不使⽤BOOT,上电就直接执⾏QSPI Flash的程序?不⾏,因为QSPI Flash不像内部Flash,⽆需初始化,上电就可以使⽤,⽽QSPI Flash不⾏。
APP应⽤程序要下载到QSPI Flash⾥⾯。APP应⽤程序可以在QSPI Flash⾥⾯执⾏主要是因为W25Q256⽀持XIP(Execution In Place),并且STM32H7的QSPI Flash⽀持内存映射。
82.2 下载算法存放位置
编译例⼦:V7-060_QSPI Flash的MDK下载算法制作,⽣成的算法⽂件位于此路径下:
⽣成算法⽂件后,需要⼤家将其存到到MDK安装⽬录,有两个位置可以存放,任选其⼀,推荐第2种:
第1种:存放到MDK的STM32H7软包安装⽬录⾥⾯:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
第2种:MDK的安装⽬录 \ARM\Flash⾥⾯。
82.3 QSPI Flash的Bootloader说明
Bootloader的实现⽐较简单,需要⼤家将其下载到内部Flash。程序实现上主要注意以下两点即可。
82.3.1 初始化QSPI Flash并设置内存映射模式
在bsp.c⽂件中初始QSPI Flash并设置为内存映射模式。
/*
*********************************************************************************************************
*    函数名: 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();
}
82.3.2 程序跳转的实现
从内部Flash跳转到外部QSPI Flash的实现代码如下
1.    /*
2.    ******************************************************************************************************
3.    *    函数名: JumpToApp
4.    *    功能说明: 跳转到应⽤JumpToApp
5.    *    形参: ⽆
6.    *    返回值: ⽆
7.    ******************************************************************************************************
8.    */
9.    static void JumpToApp(void)
10.    {
11.        uint32_t i=0;
12.        void (*AppJump)(void);        /* 声明⼀个函数指针 */
13.        __IO uint32_t AppAddr = 0x90000000;  /* APP 地址 */
14.
15.
16.        /* 关闭全局中断 */
17.        DISABLE_INT();
18.
19.        /* 设置所有时钟到默认状态,使⽤HSI时钟 */
20.        HAL_RCC_DeInit();
21.
22.        /* 关闭滴答定时器,复位到默认值 */
23.        SysTick->CTRL = 0;
24.        SysTick->LOAD = 0;
25.        SysTick->VAL = 0;
26.
27.        /* 关闭所有中断,清除所有中断挂起标志 */
28.        for (i = 0; i < 8; i++)
29.        {
30.            NVIC->ICER[i]=0xFFFFFFFF;
31.            NVIC->ICPR[i]=0xFFFFFFFF;
32.        }
33.
34.        /* 使能全局中断 */
35.        ENABLE_INT();
36.
37.        /* 跳转到应⽤程序,⾸地址是MSP,地址+4是复位中断服务程序地址 */
38.        AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
39.
40.        /* 设置主堆栈指针 */
41.        __set_MSP(*(uint32_t *)AppAddr);
42.
43.        /* 在RTOS⼯程,这条语句很重要,设置为特权级模式,使⽤MSP指针 */
44.        __set_CONTROL(0);
45.
46.        /* 跳转到系统BootLoader */
47.        AppJump();
48.
49.        /* 跳转成功的话,不会执⾏到这⾥,⽤户可以在这⾥添加代码 */
50.        while (1)
51.        {
52.
53.        }
54.    }
这⾥把程序设计中的⼏个关键地⽅做个说明:
第12⾏,声明⼀个函数指针。
第13⾏,QSPI Flash地址在0x90000000。
第20⾏,此函数⽐较省事,可以⽅便的设置H7所有时钟到复位值,内部时钟使⽤HSI。
第23到25⾏,设置滴答定时器到复位值。
第28到32⾏,清除所有中断挂起标志并关闭中断,这⾥是直接通过⼀个for循环设置了NVIC所有配置位,共8组。
第38⾏,将系统bootLoader的中断复位服务程序的⼊⼝地址赋给第12⾏声明的函数,⽤户执⾏这个函数时,就会直接跳转过去。
第41⾏,设置主堆栈指针位置,即QSPI Flash应⽤程序⾸地址存储的就是栈地址。
第44⾏,这个设置在RTOS应⽤程序中⽐较重要,因为基于Cortex-M内核的RTOS任务堆栈基本都是使⽤线程堆栈指针PSP。但系统bootLoader使⽤的是主堆栈指针MSP,所以务必要设置下,同时让M内核⼯作于特权级。此寄存器的作⽤如下:
第47⾏,跳转到系统bootLoader。
82.4 QSPI Flash的APP应⽤程序说明
APP应⽤程序是由第53章配套例⼦:V7-033_LCD的汉字⼩字库和全字库制作简单修改⽽来,主要修改如下两个地⽅:
82.4.1 设置Flash地址
设置Flash地址为QSPI Flash⾸地址0x90000000:
82.4.2 设置中断向量表
在main函数最开始就设置中断向量表到QSPI Flash⾸地址0x90000000,也可以按照本教程第28章的说明,将中断向量表设置到DTCM⾥⾯。
int main(void)
{
uint16_t ucBright;          /* 背光亮度(0-255) */
uint8_t ucKeyCode;        /* 按键代码 */
uint8_t ucStatus;        /* 主程序状态字 */
uint8_t fRefresh;        /* 刷屏请求标志,1表⽰需要刷新 */
SCB->VTOR = 0x90000000; /* 设置中断向量表地址 */
bsp_Init();    /* 硬件初始化 */
PrintfLogo();    /* 打印例程名称和版本等信息 */
PrintfHelp();    /* 打印操作提⽰ */
省略未写
}
82.5 QSPI Flash的APP应⽤程序调试下载配置
将下⾯两个地⽅配置后,就可以像使⽤内部Flash⼀样使⽤QSPI Flash进⾏调试了。
82.5.1 下载配置
注意这⾥⼀定要够⼤,否则会提⽰算法⽂件⽆法加载:
我们这⾥是将其加到DTCM中,即⾸地址为0x20000000,⼤家也可以存储到任意其它RAM地址,只要空间还够加载算法⽂件即可。推荐使
⽤AXI SRAM(地址0x24000000),因为这块RAM空间⾜够⼤。
如果要下载程序到QSPI Flash⾥⾯,需要做如下配置:
82.5.2 调试配置
注意这⾥⼀定要够⼤,否则会提⽰算法⽂件⽆法加载:
我们这⾥是将其加到DTCM中,即⾸地址为0x20000000,⼤家也可以存储到任意其它RAM地址,只要空间还够加载算法⽂件即可。
如果要做调试下载,需要做如下配置:
82.5.3 程序调试效果
APP应⽤程序调试效果如下:
82.6 实验例程说明
本章配套了两个例⼦:
V7-062_QSPI Flash运⾏程序(Bootloader)。
V7-063_QSPI Flash运⾏程序(⽤户APP)。
Bootloader例⼦需要⼤家先下载到内部Flash⾥⾯,然后按照本章第5⼩节的说明配置后,就可以像使⽤内部Flash⼀样调试下载QSPI Flash 了。
82.7 总结
本章节就为⼤家讲解这么,为了熟练掌握,建议⼤家是操作练习下。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。