在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Keil中添加Flash燒寫(xiě)算法

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

Flash,相信大家一定都不陌生,作為一種非易失性內(nèi)存,其顯著特點(diǎn)就是即便系統(tǒng)掉電,其上的存儲(chǔ)內(nèi)容也不會(huì)丟失。也正因如此,其作為程序存儲(chǔ)介質(zhì)而被廣泛應(yīng)用。

當(dāng)然,也有他的弊端或者說(shuō)不便利性,那就是Flash的讀寫(xiě)操作往往不是那么的招人“喜歡”。即便是Nor Flash,也僅僅是能夠?qū)崿F(xiàn)按地址的隨機(jī)讀操作,而不能實(shí)現(xiàn)隨機(jī)寫(xiě)。而且,數(shù)據(jù)的寫(xiě)入往往都是基于塊操作的,也就是說(shuō),想要將數(shù)據(jù)寫(xiě)入flash中,即便只想更新哪怕一個(gè)字節(jié),也要對(duì)一整個(gè)塊來(lái)操作。并且要執(zhí)行類似于:先擦除再寫(xiě)入的操作。

而既然我們想要將程序燒寫(xiě)到flash中,那不可避免地就要編寫(xiě)相應(yīng)的flash操作程序來(lái)輔助實(shí)現(xiàn)。

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

何為FLM文件

回想一下,在Keil這款I(lǐng)DE中,如果想要將程序燒寫(xiě)到Flash中,首先要干的一步就是打開(kāi)項(xiàng)目屬性頁(yè)要選擇合適的flash下載算法,而這個(gè)算法本身就是一個(gè)FLM文件:

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

FLM文件結(jié)構(gòu)

那么FLM文件是怎么構(gòu)成呢?Keil規(guī)定,一個(gè)FLM文件中一般要有以下函數(shù):

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

其中最為重要的有5個(gè),我們來(lái)一一說(shuō)明:

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

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

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf);對(duì)flash進(jìn)行燒寫(xiě)操作,其中:
a)adr:待燒寫(xiě)地址
b)sz:待燒寫(xiě)數(shù)據(jù)長(zhǎng)度
c)bug:待燒寫(xiě)數(shù)據(jù)

int EraseChip (void); 擦除整塊flash

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

編寫(xiě)FLM文件

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

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

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

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

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,     // 別改!!!
   "IS25WP128-JBLE",   // 簡(jiǎn)單粗暴,直接定義
   EXTSPI,             // 設(shè)備類型,可選:ONCHIP, EXT8BIT, EXT16BIT, 
                       // EXT32BIT, EXTSPI
   0x30000000,         // Flash首地址,掛載到AHB總線的地址
   0x01000000,         // Flash大小,16MB
   256,                // 燒寫(xiě)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
};
接下來(lái)是FlashPrg.c,負(fù)責(zé)實(shí)現(xiàn)與Flash操作有關(guān)的所有函數(shù)。這里,讓我們繼續(xù)發(fā)揚(yáng)大樹(shù)下好乘涼的優(yōu)良傳統(tǒng)。下載RT1170_EVK最新的SDK代碼,找到基于flexspi的nor flash工程:boardsevkmimxrt1170driver_examplesflexspi orpolling_transfercm7,這里有一個(gè)flexspi_nor_flash_ops.c,里面已經(jīng)包含了所有flash操作相關(guān)的操作函數(shù),不過(guò)文件中缺少了FlexSPI引腳的初始化代碼,需要進(jìn)行添加:
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)函數(shù)中。

修改好之后,將文件拷貝并添加到我們剛才找到的FLM工程中,當(dāng)然還要將原SDK工程中的app.h文件一并拷貝過(guò)來(lái)。由于需要用到flexspi的底層操作,還需要添加fsl_flexspi.c文件,添加好后的工程長(zhǎng)這個(gè)樣子:

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

接下來(lái)就是修改FlashPrg.c,首先添加頭文件以及函數(shù)引用:

#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)

接下來(lái)是相應(yīng)函數(shù)的實(shí)現(xiàn),這里有一點(diǎn)需要注意,針對(duì)函數(shù)傳入的adr即地址變量,實(shí)際上已經(jīng)被轉(zhuǎn)換為了映射到AHB總線上的地址,而我們對(duì)于Flash的操作都是基于Flash本身的地址而言的,因此需要做一個(gè)簡(jiǎn)單的轉(zhuǎn)換,減去一個(gè)偏移量(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));                                  
}

至此,我們就完成了所有的代碼準(zhǔn)備工作。當(dāng)然,為了讓程序能夠正常編譯,還需要對(duì)工程進(jìn)行配置,其中最主要的是頭文件路徑以及預(yù)編譯符號(hào)的添加,右鍵工程屬性并添加:

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

頭文件路徑:

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

為輸出文件起一個(gè)專屬名字:

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

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

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

這樣,就完成了所有的準(zhǔn)備工作,接下來(lái)就是熟悉的編譯鏈接,不過(guò)注意,不能點(diǎn)擊運(yùn)行按鈕。在當(dāng)前目錄下,找到生成的rt1170_validation_board.FLM, 并將其拷貝到Keil安裝目錄ARMFlash下。

接下來(lái)進(jìn)行測(cè)試,我們直接打開(kāi)SDK中hello world工程,在工程屬性中打開(kāi)Flash下載頁(yè)面,點(diǎn)擊Add按鈕即可看到我們所添加的Flash算法并確定:

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

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

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

證明我們已經(jīng)燒寫(xiě)成功,之后進(jìn)行調(diào)試即可正常調(diào)試。

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

至此,我們就完成了FLM文件的編寫(xiě),并且在hello_world的工程中進(jìn)行了測(cè)試。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3816

    瀏覽量

    82121
  • keil
    +關(guān)注

    關(guān)注

    69

    文章

    1217

    瀏覽量

    168497
  • 燒寫(xiě)
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    14501

原文標(biāo)題:編寫(xiě)Keil的自定義Flash燒寫(xiě)算法FLM

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    28335寫(xiě)flash的問(wèn)題

    本帖最后由 smileicy 于 2015-4-21 13:02 編輯 數(shù)次寫(xiě)flash,都沒(méi)有成功,我寫(xiě)的步驟是:一:刪除283
    發(fā)表于 04-21 12:51

    TMS320F2812片內(nèi)Flash在線寫(xiě)技術(shù)

    基于TMS320F2812內(nèi)部Flash在線寫(xiě)技術(shù),提出了一種串口寫(xiě)Flash技術(shù)。詳細(xì)論述
    發(fā)表于 12-20 17:02 ?57次下載

    基于CCS的DSP片外Flash直接寫(xiě)設(shè)計(jì)

    基于CCS的DSP片外Flash直接寫(xiě)設(shè)計(jì) 自加載后DSP能夠正常運(yùn)行,關(guān)鍵是Flash中原程序代碼的正確
    發(fā)表于 10-04 09:41 ?3633次閱讀
    基于CCS的DSP片外<b class='flag-5'>Flash</b>直接<b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>設(shè)計(jì)

    JTAG接口在線寫(xiě)Flash的實(shí)現(xiàn)

    本文闡述了一種針對(duì)TMS320VC5509A DSP 簡(jiǎn)單有效的Flash 寫(xiě)方法, 并提出了程序自舉引導(dǎo)的實(shí)現(xiàn)方法。可以有效地解決程序代碼存儲(chǔ)問(wèn)題和DSP 脫機(jī)自舉問(wèn)題.
    發(fā)表于 09-16 14:43 ?1.6w次閱讀
    JTAG接口在線<b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b><b class='flag-5'>Flash</b>的實(shí)現(xiàn)

    CCS4向內(nèi)置flash寫(xiě)程序過(guò)程

    用CCS4向內(nèi)置flash寫(xiě)程序過(guò)程這期間要用到100V2仿真器
    發(fā)表于 12-04 14:44 ?18次下載

    FPGA配置– 使用JTAG是如何寫(xiě)SPI/BPI Flash的?

    Xilinx的JTAG電纜可以通過(guò)FPGA“直接”寫(xiě)SPI/BPI。很多對(duì)xilinx開(kāi)發(fā)環(huán)境不熟悉的用戶,如果第一次接觸這種寫(xiě)模式可能會(huì)有疑惑,F(xiàn)PGA是如何做到JTAG和
    發(fā)表于 02-08 02:40 ?9373次閱讀
    FPGA配置– 使用JTAG是如何<b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>SPI/BPI <b class='flag-5'>Flash</b>的?

    使用JTAG寫(xiě)Nand Flash實(shí)驗(yàn)解析

    4.4 實(shí)驗(yàn)內(nèi)容使用JTAG寫(xiě)Nand Flash 1.實(shí)驗(yàn)?zāi)康?通過(guò)使用JTAG寫(xiě)Flash
    發(fā)表于 10-18 17:03 ?6次下載
    使用JTAG<b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>Nand <b class='flag-5'>Flash</b>實(shí)驗(yàn)解析

    基于DSP虹膜識(shí)別系統(tǒng)Flash寫(xiě)方法的研究

    基于DSP虹膜識(shí)別系統(tǒng)Flash寫(xiě)方法的研究
    發(fā)表于 10-19 14:41 ?2次下載
    基于DSP虹膜識(shí)別系統(tǒng)<b class='flag-5'>中</b><b class='flag-5'>Flash</b><b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>方法的研究

    CCS的DSP片外Flash直接寫(xiě)設(shè)計(jì)

    CCS的DSP片外Flash直接寫(xiě)設(shè)計(jì)
    發(fā)表于 10-20 08:29 ?3次下載
    CCS的DSP片外<b class='flag-5'>Flash</b>直接<b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>設(shè)計(jì)

    如何采用DATA進(jìn)行Flash的在線寫(xiě)

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

    Keil寫(xiě)STM32F750內(nèi)部Flash的方法有哪些

    庫(kù)中大部分都是提供使用外部 QSPI Flash 的例程,導(dǎo)致有些用戶不清楚如何在 ARM Keil 對(duì)其內(nèi)部 Flash 進(jìn)行
    發(fā)表于 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'>寫(xiě)</b>STM32F750內(nèi)部<b class='flag-5'>Flash</b>的方法有哪些

    Keil MDK下的串行Flash下載算法設(shè)計(jì)

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

    淺析Keil MDK下串行Flash的下載算法設(shè)計(jì)

    今天給大家介紹的是 Keil MDK 工具下 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)。 在 i.MXRT 硬件那些事系列之《在串行 NOR Flash XIP 調(diào)試原理
    的頭像 發(fā)表于 12-23 13:15 ?1655次閱讀

    Jlink使用技巧之寫(xiě)SPI Flash存儲(chǔ)芯片

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

    可供用戶修改的FLASH寫(xiě)驅(qū)動(dòng)介紹

    程序。程序通過(guò)與 V8MON 進(jìn)行數(shù)據(jù)交互進(jìn)行 FLASH 探測(cè),FLASH 擦除,FLASH 寫(xiě)操作。由于
    發(fā)表于 06-08 14:39 ?0次下載
    可供用戶修改的<b class='flag-5'>FLASH</b><b class='flag-5'>燒</b><b class='flag-5'>寫(xiě)</b>驅(qū)動(dòng)介紹
    主站蜘蛛池模板: 午夜在线观看网站 | 天天综合网天天综合色不卡 | 国外免费一级 | 天天操天天干天天拍 | 狠狠色噜噜狠狠狠狠97不卡 | 美国一级做a一级爱视频 | 国产色婷婷精品综合在线观看 | 伊人色强在线网 | 日韩理论电影2021第1页 | 韩国三级hd中文字幕好大 | 色噜噜狠狠网站 | 抽搐一进一出gif免费男男 | 黄色在线| 欧美色图日韩 | 操穴勤| 特级全黄一级毛片免费 | 男男np主受高h啪啪肉 | 国产精品一区二区综合 | 五月婷婷六月合 | 日日躁夜夜躁狠狠天天 | 男人女人真曰批视频播放 | www.xxx国产| 色琪琪一本到影院 | 视频在线观看高清免费大全 | 久久国产午夜精品理论片34页 | 大香伊在人线免费 | 3344成年在线视频免费播放男男 | 精品卡一卡二 卡四卡视频 精品噜噜噜噜久久久久久久久 | 日b毛片 | 97福利视频 | 女性一级全黄生活片在线播放 | 激情综合在线观看 | 丁香激情小说 | 欧美一区福利 | 成年网站在线观看 | 163黄页网又粗又长又舒服 | 一区二区三区在线观看免费 | 色播影院性播影院私人影院 | 四虎国产精品影库永久免费 | 影音先锋色偷偷米奇四色 | 在线亚洲免费 |