作单片机开发,用的不是IAR就是KEILL,这两款IDE也说不上谁更好用,可是KEIL涉及一个版权问题,我的使用破解是没啥问题,可是公司商业使用会有点麻烦。web
前段时间用STM32H750VB这块单片机作项目,这块单片机自带1M RAM,不须要外挂RAM了,价格上也是很香。可是,只有128K Flash,支持外挂扩产,加了一个8M的W25Q64 QSPI flash。开始是用KEIL作的,由于开源资料多,KEIL的Flash Download网上有参考,可是领导要换成IAR(由于一直都是用IAR的),捣鼓了两天,终于搞明白了IAR下的实现。svg
这里的BOOT就用内部128k flash作的,主要就是实现QSPI的初始化和地址映射,并实现跳转。网上的例程不少就很少作介绍。函数
FlashLoader是IAR自带的,把编译生成的文件写进flash,默认是不用管的,如今写进片外flash 就要对这个文件作一点修改。ui
uint32_t FlashInit(void *base_of_flash, uint32_t image_size, uint32_t link_address, uint32_t flags, int argc, char const *argv[]); uint32_t FlashWrite(void *block_start, uint32_t offset_into_block, uint32_t count, char const *buffer); uint32_t FlashErase(void *block_start, uint32_t block_size);
这几个函数须要本身来实现,对外部flash的初始化,写,擦除操做。有须要的我会上传本身的工程给你们参考。spa
还有个地方要修改下
从FlashInitEntry启动,对应的就是FlashInit :时钟、外部flash的初始化。3d
最后编译成功生成.out文件
其实flashloader就是一段运行在单片机RAM空间里的一段引导程序,它对IAR提供三个接口,实现片外flash的初始化,写,擦除操做,程序下载进flash之后它就没用了。调试
我用的是W25Q64 8M FLASH,这里使用2M作外部代码空间 地址从0x90000000U到0x901FFFFF,工程是由cube生成的。
这里主要介绍一下flash loader要用到的三个文件
.board
.flash
.maccode
.board内容xml
<?xml version="1.0" encoding="iso-8859-1"?> <flash_board> <pass> <range>CODE 0x08000000 0x0801FFFF</range> <loader>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32H7xxxB.flash</loader> </pass> <pass> <range>CODE 0x90000000 0x901FFFFF</range> <loader>$PROJ_DIR$\STM32H750_QSPI.flash</loader> </pass> </flash_board>
0x08000000-0x0801ffff空间的擦写,也就是内部flash的下载 使用的IAR默认的.flash文件
0x90000000-0x901fffff空间的下载,就是本身写的.flash文件blog
打开下面的.flash文件
<?xml version="1.0" encoding="iso-8859-1"?> <flash_device> <exe>$PROJ_DIR$\STM32H750_QSPI.out</exe> <page>256</page> <block>512 0x1000</block> <flash_base>0x90000000</flash_base> <aggregate>1</aggregate> </flash_device>
exe 就是咱们以前编译生成的.out文件,它实现了包括初始化、擦、写在内的接口。
page 就是使用的w25q64的页大小256字节
block w25q64的块大小是4k (0x1000) 这里使用512块 总共是2M空间
flash_base 起始地址0x90000000
还有一点要注意的是 IAR仿真在下载程序会从当前工程的main开始运行,可是因为咱们尚未开启内存映射因此是没有办法仿真的,这里就须要添加启动脚本。
.mac文件内容
execUserSetup() { } Access() { } __var x1; execUserReset() { x1 = __readMemory32(0x08000004,"Memory"); #SP = __readMemory32(0x08000000,"Memory"); #PC = x1; } execUserPreload() { }
咱们须要让IAR在下载完程序后从boot空间开始运行,初始化QSPI并使能地址映射 再跳转到咱们的外部flash空间
仿真调试,程序正常下载也能够跳到外部空间。
工程: 连接:https://pan.baidu.com/s/144AgcXAtD-58ZFdALw5ijg 提取码:1bmr 有问题能够留言,看到会回