愿意在优快云捧场下载的:我的资源
转载请标明来源。代码按BSD-3-Clause授权使用。代码包中包含STM32CubeMX生成的代码,使用时应遵循各个文件中标注的使用许可要求。
2020-1-31:
DFU写入W25Q64 flash后执行成功。
H743_Proj06:在BOOT0=1时reset,进入刷固件的模式,用DfuSe Demo(v3.0.6)刷入。
H743_Proj05_XIP_on_QSPI_Flash:BOOT0=0,按下K2(pin C5=0)和reset,先释放reset,进入H743_Proj06的DFU模式后,用DfuSe Demo刷入。
H743_Proj05_XIP_on_QSPI_Flash刷入后,BOOT0=0,不按K2,reset,H743_Proj06程序启动后做QSPI MemMap,查找QUADSPI Flash中是否有可执行的代码。如果有就转入。
一、H743_Proj06, ExtBoot部分:
CubeMX生成模板后,USB_DEVICE/App/usb_device.c:
void MX_USB_DEVICE_Init(void){
...
if (USBD_DFU_RegisterMedia(&hUsbDeviceFS, &USBD_DFU_fops_FS) != USBD_OK)
改成:
if (USBD_DFU_RegisterMedia(&hUsbDeviceFS, &USBD_DFU_QSPI_FLASH_fops_FS) != USBD_OK)
从USBD_DFU_fops_FS改成USBD_DFU_QSPI_FLASH_fops_FS,用自己的操作QSPI Flash的处理程序代替刷片内flash的处理程序
二、H743_Proj05_XIP_on_QSPI_Flash,Application部分:
1. STM32H743VITX_FLASH.ld:
MEMORY{
...
FLASH (rx) : ORIGIN = 0x90000000, LENGTH = 8192K
根据手册,QSPI flash Memory Map 后的地址是0x90000000
如果计划刷在片内flash的DFU程序后面,可以改成:
FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K
严谨来说,前面H743_Proj06,如果计划把片上Flash后面的部分划给用户程序用,STM32H743VITX_FLASH.ld应该这样改:
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
这样如果DFU程序编译时超过128K,编译软件会给出Error提示。
2. stm32h7xx_hal_msp.c:
#ifdef VECT_TAB_SRAM
SCB->VTOR = D1_AXISRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM */
#else
SCB->VTOR = FLASH_BANK1_BASE| VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
改成:
SCB->VTOR = QSPI_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in QSPI FLASH */
如果计划刷在片内flash的DFU程序后面,可以改成:
SCB->VTOR = 0x08020000 | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH with offset*/
System Control Block -> vector table, 中断向量表
编写应用程序应注意:不能再把QSPI接口用作其他用处,不能把QSPI的时钟信号关掉。否则处理器就取不到指令了。推荐在STM32CubeMX中给QSPI flash的针脚做上标记,防止误用。