作單片機開發,用的不是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 有問題能夠留言,看到會回