IAR環境下的STM32H750片外QSPI Flash下載仿真

IAR環境下的STM32H750片外QSPI Flash下載仿真

前言

作單片機開發,用的不是IAR就是KEILL,這兩款IDE也說不上誰更好用,可是KEIL涉及一個版權問題,我的使用破解是沒啥問題,可是公司商業使用會有點麻煩。web

前段時間用STM32H750VB這塊單片機作項目,這塊單片機自帶1M RAM,不須要外掛RAM了,價格上也是很香。可是,只有128K Flash,支持外掛擴產,加了一個8M的W25Q64 QSPI flash。開始是用KEIL作的,由於開源資料多,KEIL的Flash Download網上有參考,可是領導要換成IAR(由於一直都是用IAR的),搗鼓了兩天,終於搞明白了IAR下的實現。svg

Boot

這裏的BOOT就用內部128k flash作的,主要就是實現QSPI的初始化和地址映射,並實現跳轉。網上的例程不少就很少作介紹。函數

FlashLoader

FlashLoader是IAR自帶的,把編譯生成的文件寫進flash,默認是不用管的,如今寫進片外flash 就要對這個文件作一點修改。在這裏插入圖片描述ui

  1. 新建一個空的工程 在這裏插入圖片描述
  2. 把IAR安裝目錄這個目錄下的全部文件複製到新建立的工程目錄下
    在這裏插入圖片描述
    在這裏插入圖片描述
  3. 工程中添加如下文件
    在這裏插入圖片描述
    咱們只須要修改flash_loader_ram.c 這個文件 實現裏面的幾個函數就行。
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

  1. 還有個地方要修改下
    在這裏插入圖片描述
    從FlashInitEntry啓動,對應的就是FlashInit :時鐘、外部flash的初始化。3d

  2. 最後編譯成功生成.out文件
    在這裏插入圖片描述
    其實flashloader就是一段運行在單片機RAM空間裏的一段引導程序,它對IAR提供三個接口,實現片外flash的初始化,寫,擦除操做,程序下載進flash之後它就沒用了。調試

用戶APP

我用的是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 有問題能夠留言,看到會回