精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在Keil中添加Flash燒寫算法

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-09-01 08:43 ? 次閱讀

Flash,相信大家一定都不陌生,作為一種非易失性內存,其顯著特點就是即便系統掉電,其上的存儲內容也不會丟失。也正因如此,其作為程序存儲介質而被廣泛應用。

當然,也有他的弊端或者說不便利性,那就是Flash的讀寫操作往往不是那么的招人“喜歡”。即便是Nor Flash,也僅僅是能夠實現按地址的隨機讀操作,而不能實現隨機寫。而且,數據的寫入往往都是基于塊操作的,也就是說,想要將數據寫入flash中,即便只想更新哪怕一個字節,也要對一整個塊來操作。并且要執行類似于:先擦除再寫入的操作。

而既然我們想要將程序燒寫到flash中,那不可避免地就要編寫相應的flash操作程序來輔助實現。

本期小編就將為大家介紹下,如何在Keil中添加Flash燒寫算法,能夠讓Keil幫助我們進行程序的燒寫工作。

何為FLM文件

回想一下,在Keil這款IDE中,如果想要將程序燒寫到Flash中,首先要干的一步就是打開項目屬性頁要選擇合適的flash下載算法,而這個算法本身就是一個FLM文件:

1ecbb5dc-298e-11ed-ba43-dac502259ad0.png

FLM文件結構

那么FLM文件是怎么構成呢?Keil規定,一個FLM文件中一般要有以下函數:

1ef2b68c-298e-11ed-ba43-dac502259ad0.png

其中最為重要的有5個,我們來一一說明:

int Init (unsigned long adr, unsigned long clk, unsigned long fnc);負責flash器件的初始化工作,其中:
a)adr: 設備首地址
b)clk:時鐘頻率(Hz)
c)fnc:要執行的flash操作,包括,1:Erase,2:Program,3:Verify

int EraseSector (unsigned long adr);擦除addr所指定地址處的整個sector

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf);對flash進行燒寫操作,其中:
a)adr:待燒寫地址
b)sz:待燒寫數據長度
c)bug:待燒寫數據

int EraseChip (void); 擦除整塊flash

int UnInit (unsigned long fnc); Uninit flash, 并根據傳入的fnc執行不同的flash后操作,fnc的定義同Init

編寫FLM文件

Keil很貼心的為我們準備了一個模板工程,可以以說包含了生成一個FLM文件的所有,工程文件位置在 Keil安裝目錄ARMFlash\_Template:

1f157a6e-298e-11ed-ba43-dac502259ad0.png

我們所需要修改的就是FlashDev.c以及FlashPrg.c兩個文件,為了方便測試,小編就直接在i.MX RT1170 EVK上掛載的IS25WP128-JBLE Flash為例進行說明。

首先是FlashDev.c文件,這里面主要提供了一些Flash的基本硬件信息,定義了諸如Flash器件名,sector大小,寫入塊大小等,參考實現如下:

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,     // 別改?。。?   "IS25WP128-JBLE",   // 簡單粗暴,直接定義
   EXTSPI,             // 設備類型,可選:ONCHIP, EXT8BIT, EXT16BIT, 
                       // EXT32BIT, EXTSPI
   0x30000000,         // Flash首地址,掛載到AHB總線的地址
   0x01000000,         // Flash大小,16MB
   256,                // 燒寫Page 大小
   0,                  // Reserved, must be 0
   0xFF,               // Initial Content of Erased Memory
   100,                // Program Page Timeout 100 mSec
   3000,               // Erase Sector Timeout 3000 mSec

   0x001000, 0x000000, // Sector 大小  4KB
   SECTOR_END
};
接下來是FlashPrg.c,負責實現與Flash操作有關的所有函數。這里,讓我們繼續發揚大樹下好乘涼的優良傳統。下載RT1170_EVK最新SDK代碼,找到基于flexspi的nor flash工程:boardsevkmimxrt1170driver_examplesflexspi orpolling_transfercm7,這里有一個flexspi_nor_flash_ops.c,里面已經包含了所有flash操作相關的操作函數,不過文件中缺少了FlexSPI引腳的初始化代碼,需要進行添加:
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_05_FLEXSPI1_A_DQS, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_06_FLEXSPI1_A_SS0_B, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_07_FLEXSPI1_A_SCLK, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_08_FLEXSPI1_A_DATA00, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_09_FLEXSPI1_A_DATA01, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_10_FLEXSPI1_A_DATA02, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B2_11_FLEXSPI1_A_DATA03, 1U);

IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_05_FLEXSPI1_A_DQS,   0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_06_FLEXSPI1_A_SS0_B,  0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_07_FLEXSPI1_A_SCLK,  0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_08_FLEXSPI1_A_DATA00, 0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_09_FLEXSPI1_A_DATA01, 0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_10_FLEXSPI1_A_DATA02, 0x0AU);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B2_11_FLEXSPI1_A_DATA03, 0x0AU);

到void flexspi_nor_flash_init(FLEXSPI_Type *base)函數中。

修改好之后,將文件拷貝并添加到我們剛才找到的FLM工程中,當然還要將原SDK工程中的app.h文件一并拷貝過來。由于需要用到flexspi的底層操作,還需要添加fsl_flexspi.c文件,添加好后的工程長這個樣子:

1f2a1ae6-298e-11ed-ba43-dac502259ad0.png

接下來就是修改FlashPrg.c,首先添加頭文件以及函數引用:

#include "fsl_flexspi.h"
#include "app.h" 
extern status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);
extern status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src);
extern status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);
extern status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base);
extern status_t flexspi_nor_erase_chip(FLEXSPI_Type *base);
extern void flexspi_nor_flash_init(FLEXSPI_Type *base);
#define FLEXSPI_BASE (FLEXSPI1)
#define FLASH_BASE_ADR (0x30000000)

接下來是相應函數的實現,這里有一點需要注意,針對函數傳入的adr即地址變量,實際上已經被轉換為了映射到AHB總線上的地址,而我們對于Flash的操作都是基于Flash本身的地址而言的,因此需要做一個簡單的轉換,減去一個偏移量(FLASH_BASE_ADR):

int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
  (void)adr;
  (void)clk;
  (void)fnc;
  flexspi_nor_flash_init(FLEXSPI_BASE);
  return (0); 
}
int UnInit (unsigned long fnc) {
  return (0);                                 
}
int EraseChip (void) {
  return (flexspi_nor_erase_chip(FLEXSPI_BASE)); 
}
int EraseSector (unsigned long adr) {
  return (flexspi_nor_flash_erase_sector(FLEXSPI_BASE, adr - FLASH_BASE_ADR));                                  
}
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
  return ( flexspi_nor_flash_page_program( FLEXSPI_BASE, 
adr - FLASH_BASE_ADR, (uint32_t*)buf));                                  
}

至此,我們就完成了所有的代碼準備工作。當然,為了讓程序能夠正常編譯,還需要對工程進行配置,其中最主要的是頭文件路徑以及預編譯符號的添加,右鍵工程屬性并添加:

1f512852-298e-11ed-ba43-dac502259ad0.png

頭文件路徑:

1f84fc04-298e-11ed-ba43-dac502259ad0.png

為輸出文件起一個專屬名字:

1fafd4a6-298e-11ed-ba43-dac502259ad0.png

選擇正確的芯片類型為MIMXRT1170DVMAA:cm7:

1fd0fe06-298e-11ed-ba43-dac502259ad0.png

這樣,就完成了所有的準備工作,接下來就是熟悉的編譯鏈接,不過注意,不能點擊運行按鈕。在當前目錄下,找到生成的rt1170_validation_board.FLM, 并將其拷貝到Keil安裝目錄ARMFlash下。

接下來進行測試,我們直接打開SDK中hello world工程,在工程屬性中打開Flash下載頁面,點擊Add按鈕即可看到我們所添加的Flash算法并確定:

1ff69a08-298e-11ed-ba43-dac502259ad0.png

之后就是正常的編譯鏈接燒寫之路,最終顯示:

221e1dc4-298e-11ed-ba43-dac502259ad0.png

證明我們已經燒寫成功,之后進行調試即可正常調試。

22312f36-298e-11ed-ba43-dac502259ad0.png

至此,我們就完成了FLM文件的編寫,并且在hello_world的工程中進行了測試。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    116

    文章

    3778

    瀏覽量

    80860
  • keil
    +關注

    關注

    68

    文章

    1212

    瀏覽量

    166701
  • 燒寫
    +關注

    關注

    0

    文章

    57

    瀏覽量

    14264

原文標題:編寫Keil的自定義Flash燒寫算法FLM

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    28335flash的問題

    本帖最后由 smileicy 于 2015-4-21 13:02 編輯 數次flash,都沒有成功,我的步驟是:一:刪除283
    發表于 04-21 12:51

    單片機如何在flash運行程序

    ——————————————————————————————1、單片機如何在flash運行程序以C8051F系列為例,單片機的程序經過keil等IDLE軟件編譯成hex文件,然后通過
    發表于 01-24 07:07

    TMS320F2812片內Flash在線技術

    基于TMS320F2812內部Flash在線技術,提出了一種串口Flash技術。詳細論述
    發表于 12-20 17:02 ?57次下載

    基于CCS的DSP片外Flash直接設計

    基于CCS的DSP片外Flash直接設計 自加載后DSP能夠正常運行,關鍵是Flash中原程序代碼的正確
    發表于 10-04 09:41 ?3313次閱讀
    基于CCS的DSP片外<b class='flag-5'>Flash</b>直接<b class='flag-5'>燒</b><b class='flag-5'>寫</b>設計

    JTAG接口在線Flash的實現

    本文闡述了一種針對TMS320VC5509A DSP 簡單有效的Flash 方法, 并提出了程序自舉引導的實現方法??梢杂行У亟鉀Q程序代碼存儲問題和DSP 脫機自舉問題.
    發表于 09-16 14:43 ?1.6w次閱讀
    JTAG接口在線<b class='flag-5'>燒</b><b class='flag-5'>寫</b><b class='flag-5'>Flash</b>的實現

    CCS4向內置flash程序過程

    用CCS4向內置flash程序過程這期間要用到100V2仿真器
    發表于 12-04 14:44 ?18次下載

    FPGA配置– 使用JTAG是如何SPI/BPI Flash的?

    Xilinx的JTAG電纜可以通過FPGA“直接”SPI/BPI。很多對xilinx開發環境不熟悉的用戶,如果第一次接觸這種模式可能會有疑惑,FPGA是如何做到JTAG和
    發表于 02-08 02:40 ?8130次閱讀
    FPGA配置– 使用JTAG是如何<b class='flag-5'>燒</b><b class='flag-5'>寫</b>SPI/BPI <b class='flag-5'>Flash</b>的?

    使用JTAGNand Flash實驗解析

    4.4 實驗內容使用JTAGNand Flash 1.實驗目的 通過使用JTAGFlash
    發表于 10-18 17:03 ?6次下載
    使用JTAG<b class='flag-5'>燒</b><b class='flag-5'>寫</b>Nand <b class='flag-5'>Flash</b>實驗解析

    基于DSP虹膜識別系統Flash方法的研究

    基于DSP虹膜識別系統Flash方法的研究
    發表于 10-19 14:41 ?2次下載
    基于DSP虹膜識別系統<b class='flag-5'>中</b><b class='flag-5'>Flash</b><b class='flag-5'>燒</b><b class='flag-5'>寫</b>方法的研究

    CCS的DSP片外Flash直接設計

    CCS的DSP片外Flash直接設計
    發表于 10-20 08:29 ?3次下載
    CCS的DSP片外<b class='flag-5'>Flash</b>直接<b class='flag-5'>燒</b><b class='flag-5'>寫</b>設計

    如何采用DATA進行Flash的在線

    自加載后DSP能夠正常運行,關鍵是Flash中原程序代碼的正確。CCS編譯生成的.out格式文件不能直接用于Flash
    的頭像 發表于 02-06 08:51 ?3599次閱讀
    如何采用DATA進行<b class='flag-5'>Flash</b>的在線<b class='flag-5'>燒</b><b class='flag-5'>寫</b>

    KeilSTM32F750內部Flash的方法有哪些

    庫中大部分都是提供使用外部 QSPI Flash 的例程,導致有些用戶不清楚如何在 ARM Keil 對其內部 Flash 進行
    發表于 07-13 08:00 ?13次下載
    <b class='flag-5'>Keil</b><b class='flag-5'>中</b><b class='flag-5'>燒</b><b class='flag-5'>寫</b>STM32F750內部<b class='flag-5'>Flash</b>的方法有哪些

    Keil MDK下的串行Flash下載算法設計

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是Keil MDK工具下i.MXRT的串行NOR Flash下載算法設計。 在i.MXRT硬件那些事系列之《在串行NOR Flas
    的頭像 發表于 10-23 14:30 ?2886次閱讀
    <b class='flag-5'>Keil</b> MDK下的串行<b class='flag-5'>Flash</b>下載<b class='flag-5'>算法</b>設計

    Jlink使用技巧之SPI Flash存儲芯片

    大多數玩單片機的人都知道Jlink可以Hex文件,作為ARM仿真調試器,但是知道能SPI Flash的人應該不多,本篇文章將介紹如何
    發表于 01-26 18:37 ?4次下載
    Jlink使用技巧之<b class='flag-5'>燒</b><b class='flag-5'>寫</b>SPI <b class='flag-5'>Flash</b>存儲芯片

    可供用戶修改的FLASH驅動介紹

    程序。程序通過與 V8MON 進行數據交互進行 FLASH 探測,FLASH 擦除,FLASH 操作。由于
    發表于 06-08 14:39 ?0次下載
    可供用戶修改的<b class='flag-5'>FLASH</b><b class='flag-5'>燒</b><b class='flag-5'>寫</b>驅動介紹