日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月23日(星期三)

2018年07月23日 | Cortex-M單片機下載數(shù)據(jù)到外部flash

發(fā)布者:技術(shù)旅人 來源: eefocus關(guān)鍵字:Cortex-M單片機  下載數(shù)據(jù)  外部flash 手機看文章 掃描二維碼
隨時隨地手機看文章

主機環(huán)境:Windows 10 64bit

開發(fā)環(huán)境:MDK 5.23

目標板:LPC54114

之前在NXP社區(qū)得到一塊LPC54114的板卡,是由萬利制作的,LPC54114是一款雙核MCU,包含了一顆M4主核和一顆M0+從核,利用該板卡學(xué)習(xí)了一下雙核MCU的開發(fā)流程,板卡中提供了一顆W25P80FLASH,之前擁有的板卡都沒有掛外部FLASH,剛好之前利用LPC54608學(xué)習(xí)TouchGFX時可以把圖片資源下載到外部FLASH中,因此借此機會來學(xué)習(xí)一下如何把數(shù)據(jù)下載到外部FLASH。

平時燒錄代碼我們都是燒錄到MCU內(nèi)部的FLASH中,如下圖:


可以看到下載的時片上256KB的FLASH,該算法文件是由DFP包提供的,具體可以在keil5的安裝目錄下找到,如下:


加載到內(nèi)部FLASH的算法有了,但加載到外部FLASH的算法還沒得。keil5中提供了LPC54608板卡的外部FLASH算法,LPC54114的外部FLASH算法就需要我們自己實現(xiàn)了,而且我們的板卡不是NXP官方的板卡,更不可能提供外部FLASH的加載算法了。。。

進入到keil的FLASH目錄,如下:


拷貝LPC5460x_MT25QL128文件夾到LPC54114_W25P80文件夾,并把其中有關(guān)信息全部替換成LPC54114相關(guān)信息。keil中提供了FlashOS.h頭文件,定義了燒錄到外部FLASH的相關(guān)接口,很簡單,如下:


這就是本次我們需要實現(xiàn)的相關(guān)接口,修改的關(guān)鍵文件只有兩個:FlashDev.c以及FlashPrg.c,首先看FlashDev.c文件,該文件定義了外部Flash的相關(guān)信息,經(jīng)過簡單修改就可以使用了,如下:

#ifdef W25P80

struct FlashDevice const FlashDevice  =  {

   FLASH_DRV_VERS,             // Driver Version, do not modify!

   "LPC54114 W25P80 SPI", // Device Name

   EXTSPI,                     // Device Type

   0x10000000,                 // Device Start Address

   0x00100000,                 // Device Size (1MB)

   256,                        // Programming Page Size

   0,                          // Reserved, must be 0

   0xFF,                       // Initial Content of Erased Memory

   300,                        // Program Page Timeout 300 mSec

   3000,                       // Erase Sector Timeout 3000 mSec

 

// Specify Size and Address of Sectors

   0x010000, 0x000000,         // Sector Size 64kB (16 Sectors)

   SECTOR_END

};

#endif

我們只需要修改設(shè)備名字、設(shè)備類型、起始地址、大小、頁大小、扇區(qū)大小等等,這些信息都可以在W25P80的手冊中找到。其中設(shè)備的起始地址可以隨便定義,但不要和內(nèi)部FLASH地址沖突即可。這里定義的是0x10000000.FlashPrg.c文件是接口的實現(xiàn)文件,這里我把LPC54114SDK中的polling_flash下的驅(qū)動文件拿來直接使用了,即mx25r_flash.c/h文件,只需要在FlashPrg.c中簡單調(diào)用即可,如下:


/* -----------------------------------------------------------------------------

 * Copyright (c) 2016 ARM Ltd.

 *

 * This software is provided 'as-is', without any express or implied warranty.

 * In no event will the authors be held liable for any damages arising from

 * the use of this software. Permission is granted to anyone to use this

 * software for any purpose, including commercial applications, and to alter

 * it and redistribute it freely, subject to the following restrictions:

 *

 * 1. The origin of this software must not be misrepresented; you must not

 *    claim that you wrote the original software. If you use this software in

 *    a product, an acknowledgment in the product documentation would be

 *    appreciated but is not required.

 *

 * 2. Altered source versions must be plainly marked as such, and must not be

 *    misrepresented as being the original software.

 *

 * 3. This notice may not be removed or altered from any source distribution.

 *

 *

 * $Date:        29. August 2017

 * $Revision:    V1.0.0

 *

 * Project:      Flash Device Algorithm for

 *               NXP LPC54114 W25P80 SPI Flash

 * --------------------------------------------------------------------------- */

 

#include "..\FlashOS.H"        // FlashOS Structures

#include "fsl_iocon.h"

#include "fsl_spi.h"

#include "mx25r_flash.h"

 

#define SECTOR_ADDR 0

#define SECTOR_SIZE 65536

#define FLASH_SPI_SSEL 3

#define EXAMPLE_SPI_MASTER SPI2

#define EXAMPLE_SPI_MASTER_CLK_SRC kCLOCK_Flexcomm2

#define EXAMPLE_SPI_MASTER_CLK_FREQ 12000000

unsigned long base_adr;

unsigned char chk_buf[256];

struct mx25r_instance mx25r;

 

void SPI_InitPins(void) {

 

  CLOCK_EnableClock(kCLOCK_Iocon);   /* enable clock for IOCON */

  

  /* SPI pins */

  IOCON_PinMuxSet(IOCON, 0, 8, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));  /* SPI_MOSI */

  IOCON_PinMuxSet(IOCON, 0, 9, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));  /* SPI_MISO */

  IOCON_PinMuxSet(IOCON, 0, 10, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));  /* SPI_SCK */

  IOCON_PinMuxSet(IOCON, 0, 2, (IOCON_FUNC2 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));  /* SPI_CSN */

}

 

int flash_transfer_cb(void *transfer_prv, uint8_t *tx_data, uint8_t *rx_data, size_t dataSize, bool eof)

{

    spi_transfer_t xfer = {0};

    xfer.txData = tx_data;

    xfer.rxData = rx_data;

    xfer.dataSize = dataSize;

    /* terminate frame */

    if (eof)

    {

        xfer.configFlags |= kSPI_FrameAssert;

    }

    SPI_MasterTransferBlocking((SPI_Type *)transfer_prv, &xfer);

    return 0;

}

 

int flash_init(void)

{

  spi_master_config_t masterConfig = {0};

  SPI_MasterGetDefaultConfig(&masterConfig);

  masterConfig.direction = kSPI_MsbFirst;

  masterConfig.polarity = kSPI_ClockPolarityActiveHigh;

  masterConfig.phase = kSPI_ClockPhaseFirstEdge;

  masterConfig.baudRate_Bps = 1000000;

  masterConfig.sselNum = (spi_ssel_t)FLASH_SPI_SSEL;

  SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, EXAMPLE_SPI_MASTER_CLK_FREQ);

 

  mx25r_init(&mx25r, flash_transfer_cb, EXAMPLE_SPI_MASTER);

  return mx25r_err_ok;

}

 

/*

 *  Initialize Flash Programming Functions

 *    Parameter:      adr:  Device Base Address

 *                    clk:  Clock Frequency (Hz)

 *                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  

  SYSCON->FXCOMCLKSEL[2] = 0;

  /* reset FLEXCOMM for SPI */

  SYSCON->PRESETCTRLSET[1] = (uint32_t)(1<<13);

  SYSCON->PRESETCTRLCLR[1] = (uint32_t)(1<<13);

  

  SPI_InitPins();

  flash_init();

  base_adr = adr;

 

  return (0);

}

 

 

/*

 *  De-Initialize Flash Programming Functions

 *    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int UnInit (unsigned long fnc) {

 

  return (0);

}

 

 

/*

 *  Erase complete Flash Memory

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int EraseChip (void) {

 

  mx25r_cmd_chip_erase(&mx25r);

  return (0);                                        /* Finished without Errors */

}

 

 

/*

 *  Erase Sector in Flash Memory

 *    Parameter:      adr:  Sector Address

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int EraseSector (unsigned long adr) {

 

  mx25r_cmd_sector_erase(&mx25r,adr-base_adr);

  return (0);                                        /* Finished without Errors */

}

 

 

/*

 *  Blank Check Checks if Memory is Blank

 *    Parameter:      adr:  Block Start Address

 *                    sz:   Block Size (in bytes)

 *                    pat:  Block Pattern

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat) {

 

  return (1);                                        /* Always Force Erase */

}

 

 

/*

 *  Program Page in Flash Memory

 *    Parameter:      adr:  Page Start Address

 *                    sz:   Page Size

 *                    buf:  Page Data

 *    Return Value:   0 - OK,  1 - Failed

 */

 

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  

  mx25r_cmd_write(&mx25r,adr-base_adr,buf,sz);

  return (0);                                        /* Finished without Errors */

}

 

 

/*  

 *  Verify Flash Contents

 *    Parameter:      adr:  Start Address

 *                    sz:   Size (in bytes)

 *                    buf:  Data

 *    Return Value:   (adr+sz) - OK, Failed Address

 */

 

unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf)

{

  int i = 0;

  mx25r_cmd_read(&mx25r,adr-base_adr,chk_buf,sz);

  for(i = 0; i < sz; i++)

  {

    if(buf[i] != chk_buf[i])

    {

 return (adr+i);

}

  }

  return (adr+sz);

}

編譯該工程,即可產(chǎn)生我們所需要的加載FLASH的算法文件,如下:


下面就來測試下該算法文件是否起作用,在LPC54114的SDK中的polling_flash工程中加入一段測試數(shù)據(jù),如下:



const uint8_t extFlash[] __attribute__ ((at(0x10000000))) = 

{'N','X','P','I','C'};

把這幾個字符存放到外部FLASH的0地址上,這里0x10000000是我們剛才定義的外部FLASH的起始地址。此外還需要添加一下該算法文件,如下:



下載該代碼,本以為就此成功了,結(jié)果彈出一個框框,說無法加載FLASH編程算法,


MDK中的輸出信息如下:Insufficient RAM for Flash Algorithms !,百度搜索了一下說是為該算法分配的RAM空間小了,默認的是0x1000,4KB大小,這里加大了已被改成了8KB,如下:


再次下載,很順暢地下載成功了,趕緊打開串口助手查看測試結(jié)果:


成功地從外部FLASH讀取到了我們定義的‘NXPIC’字符,測試成功!大家一起來測試一下吧!


關(guān)鍵字:Cortex-M單片機  下載數(shù)據(jù)  外部flash 引用地址:Cortex-M單片機下載數(shù)據(jù)到外部flash

上一篇:STM32自帶的SPI實現(xiàn)對外部FLASH(W25Q128)的讀寫
下一篇:圖解Stm32使用jlink下載程序時jtag接口(SW和JTAG模式)的簡化方法

推薦閱讀

? ?在上個月,黑莓發(fā)布了KEY2新機,但售價高達649美元,國內(nèi)售價3999元起,該機配置驍龍660處理器,依然采用物理全鍵盤?,F(xiàn)在爆料大神evleaks曝光了黑莓KEY2 Lite手機,這可能是黑莓KEY2的低配版,預(yù)計將在德國IFA上發(fā)布。  根據(jù)爆料,黑莓KEY2 Lite手機外形尺寸和黑莓KEY2一樣,擁有紅色、藍色和銅色。  目前對于黑莓KEY2 Lite來說,僅有這些信...
致力于亞太地區(qū)市場的領(lǐng)先半導(dǎo)體元器件分銷商---大聯(lián)大控股宣布,其旗下友尚推出基于瑞昱(Realtek)RTL8763BFR RWS的無線藍牙耳機解決方案。 眾所周知,降噪功能對耳機很重要:一是減少噪音,避免因過度放大音量對耳朵造成損害;二是過濾噪音,提高音質(zhì)和通話質(zhì)量。降噪可分為被動式降噪和主動式降噪,被動式降噪即物理降噪,是指利用物理特性將外部的噪...
來自深圳新聞網(wǎng)的消息稱,深圳在8月將實現(xiàn)5G網(wǎng)絡(luò)全市覆蓋。 日前,深圳市出臺《關(guān)于加快推進新型基礎(chǔ)設(shè)施建設(shè)的實施意見(2020-2025年)》(以下簡稱《實施意見》)。7月21日,深圳市政府新聞辦舉行新聞發(fā)布會,介紹新基建總體情況和發(fā)展優(yōu)勢,并對《實施意見》做了解讀。 發(fā)布會...
中國光伏逆變器制造商思能電氣在中國寧夏省同心縣開設(shè)了一座10 GW逆變器制造工廠。該公司在一份聲明中表示:“該項目有望增強公司滿足全球客戶不斷增長的需求的能力。同時,這將促進當(dāng)?shù)鼐蜆I(yè),促進西北地區(qū)清潔能源業(yè)務(wù)的發(fā)展。”工廠于2020年底由思能宣布建設(shè)。有了這個新的制造工廠,公司的年逆變器總產(chǎn)能已增加到23 GW。思能在2020年8月表示,去年上...

史海拾趣

問答坊 | AI 解惑

奧運興奮劑測試對測試儀器提出了新挑戰(zhàn)

對于參與北京奧運會的運動員的違禁藥物的獨立檢查將多達大概4500項,為了跟上不同違禁藥物化合物的改變和偽裝的步伐,由安捷倫公司提供的測試儀器|儀表必須不斷地更新氣相檢測、液相檢測和質(zhì)譜儀檢測的興奮劑分析。   中國反興奮劑中心(China An ...…

查看全部問答∨

求教各位大俠 看看這段ISA接口程序為什么不對

求教各位大俠 幫幫小菜 看看這段ISA接口程序為什么不對 本人的問題是,assign led_out=wr_data[11:0]; 從PC機發(fā)送過來的一個16位確定數(shù)data, led顯示的 得到的是個不確定數(shù); 如果不用iocs16=(addr[9:4]==basic_addr[9:4])?1\'b0:1\'bz 這段收 ...…

查看全部問答∨

ASM共晶焊分析

replyreload += \',\' + 380437;Timson,如果您要查看本帖隱藏內(nèi)容請回復(fù)…

查看全部問答∨

WinCE打開工程失敗

{FB373486-0E6E-4BB6-8BF2-1F92EACA1468}…

查看全部問答∨

如何將程序?qū)懙?Nand Flash 的指定地址

大家好!我用的友善2440,現(xiàn)在在學(xué)習(xí)Nand Flash。 現(xiàn)在我有三個文件f1,f2,f3,我想將前兩個燒到Nand FLash的0x00處,第三個文件燒到4096處, 這樣上電后,f1,f2自動復(fù)制到steppingstone中執(zhí)行,并實現(xiàn)f3從Nand Flash 復(fù)制到0x30000000, 然后程 ...…

查看全部問答∨

pic單片機 文件系統(tǒng)的創(chuàng)建txt的問題

我用pic單片編的文件系統(tǒng),創(chuàng)建txt文件,并往里寫一個字符串,參考的是震南znfat的51程序,但是現(xiàn)在創(chuàng)建的文件不能在電腦上顯示,顯示的是零kb的一個不能刪除的文件,請問怎么回事呢…

查看全部問答∨

請大家給點建議

我之前一直從事window上應(yīng)用程序的開發(fā),現(xiàn)在打算往底層發(fā)展一點,學(xué)習(xí)一下driver的開發(fā),因為現(xiàn)在一直在做windows的東西,所以想從windows的driver開始學(xué)起,請問大家 1 學(xué)習(xí)windows的驅(qū)動開發(fā)前景(錢途^^)如何? 2 我想開始先看Programming t ...…

查看全部問答∨

evc中如何修改工程名稱

我想把一個已存在的evc工程的名稱 而不影響工程的正常運行該怎么辦? 謝謝!…

查看全部問答∨

秀秀剛收到的51版數(shù)字濕度計套件!

哈哈,很高興收到了數(shù)字濕度計套件,感謝EEWORLD。。。   …

查看全部問答∨

時鐘周期

我的DSP中斷程序本來只有一個寫I/O的語句,占用70多個時鐘周期,加了一個讀I/O的語句竟然占用210個時鐘周期,為什么? …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved