主機環(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’字符,測試成功!大家一起來測試一下吧!
上一篇:STM32自帶的SPI實現(xiàn)對外部FLASH(W25Q128)的讀寫
下一篇:圖解Stm32使用jlink下載程序時jtag接口(SW和JTAG模式)的簡化方法
推薦閱讀
史海拾趣
進入21世紀,AMOTECH繼續(xù)深耕電子領(lǐng)域,特別是在壓敏電阻技術(shù)上取得了重大突破。2003年,公司的壓敏電阻產(chǎn)品被產(chǎn)業(yè)資源部評為世界一流產(chǎn)品,這一成就不僅提升了AMOTECH在全球電子行業(yè)中的地位,也為其后續(xù)發(fā)展奠定了堅實基礎(chǔ)。同年,公司還成功在韓國安全商協(xié)會自動報價首次公開募股,為公司的進一步擴張?zhí)峁┝速Y金支持。
ELEMENT14公司最初是一家電子元器件分銷商,但隨著市場的變化和客戶需求的升級,公司決定轉(zhuǎn)型為提供一站式服務(wù)的平臺。這一轉(zhuǎn)變意味著公司不僅要提供電子元器件,還要提供軟件、技術(shù)支持、在線社區(qū)等全方位的服務(wù)。通過不斷的投入和努力,ELEMENT14成功轉(zhuǎn)型為一個綜合性的電子元器件服務(wù)平臺,滿足了客戶多樣化的需求。
Chen Yang Technologies最初是一家專注于半導(dǎo)體芯片研發(fā)的小型公司。在某個關(guān)鍵時期,公司成功研發(fā)出了一種低功耗、高性能的芯片技術(shù),這一技術(shù)突破立即引起了市場的廣泛關(guān)注。憑借這一技術(shù),Chen Yang Technologies迅速擴大了其產(chǎn)品線,并開始向全球范圍內(nèi)的電子設(shè)備制造商供應(yīng)芯片。隨著市場份額的逐步增長,公司逐漸在電子行業(yè)中建立了自己的地位。
自成立以來,科山芯創(chuàng)始終堅持技術(shù)創(chuàng)新。他們投入大量資源用于研發(fā),不斷推出新產(chǎn)品。其中,COS8820射頻收發(fā)芯片、COS6212線驅(qū)動器功放芯片等產(chǎn)品,憑借其優(yōu)異的性能和穩(wěn)定性,在市場上獲得了廣泛認可。這些產(chǎn)品的成功,不僅證明了科山芯創(chuàng)的技術(shù)實力,也為其在電子行業(yè)中樹立了良好的口碑。
科山芯創(chuàng)深知品質(zhì)是企業(yè)的生命線。他們建立了嚴格的質(zhì)量管理體系,從原材料采購到生產(chǎn)流程再到成品檢測,每一個環(huán)節(jié)都嚴格把關(guān)。同時,他們還不斷提升服務(wù)水平,為客戶提供全方位的技術(shù)支持和解決方案。這些努力使得科山芯創(chuàng)在客戶中贏得了良好的口碑和信任。
AC Photonics Inc非常重視人才培養(yǎng)和團隊建設(shè)。公司建立了完善的人才培養(yǎng)和激勵機制,吸引了一大批優(yōu)秀的研發(fā)人才和管理人才加入。同時,公司還注重團隊建設(shè),通過定期舉辦團隊活動、開展員工培訓(xùn)等方式,增強團隊凝聚力和向心力。這些措施為公司的持續(xù)創(chuàng)新和發(fā)展提供了有力的人才保障。
對于參與北京奧運會的運動員的違禁藥物的獨立檢查將多達大概4500項,為了跟上不同違禁藥物化合物的改變和偽裝的步伐,由安捷倫公司提供的測試儀器|儀表必須不斷地更新氣相檢測、液相檢測和質(zhì)譜儀檢測的興奮劑分析。 中國反興奮劑中心(China An ...… 查看全部問答∨ |
求教各位大俠 幫幫小菜 看看這段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 這段收 ...… 查看全部問答∨ |
大家好!我用的友善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的一個不能刪除的文件,請問怎么回事呢… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 蜂巢能源2025年試產(chǎn)半固態(tài)電池,2027年大批量供貨
- 激光雷達進化論:RoboSense如何持續(xù)領(lǐng)跑?
- 法雷奧-全景顯示技術(shù) Panovision | 申報2025第七屆金輯獎中國汽車新供應(yīng)鏈百強
- 公安部:目前我國市售汽車搭載的“智駕”系統(tǒng),都不具備“自動駕駛”功能
- 德賽西威-旗艦級AI智能座艙域控制器 | 申報2025第七屆金輯獎中國汽車新供應(yīng)鏈百強
- Mobileye推出駕駛員監(jiān)測系統(tǒng)(DMS)技術(shù) ,實現(xiàn)人與車輛協(xié)同駕駛
- 第三屆安富利汽車生態(tài)圈峰會盛大啟幕,雙城聯(lián)動激發(fā)智慧出行產(chǎn)業(yè)新動能
- Vicor Corporation 2025年第二季度財報:專利訴訟和解推動強勁增長
- 智能底盤2.0競賽,這家外資巨頭按下加速鍵
- GaN技術(shù)如何應(yīng)用到人形機器人執(zhí)行關(guān)節(jié)?
- TI 高精度實驗室信號鏈精品課大作戰(zhàn)——你學(xué)習(xí)我送禮!
- TI 嵌入式處理器最新產(chǎn)品發(fā)布會 全程在線直播 4月16日精彩為您呈現(xiàn)!預(yù)報名、看直播、享好禮
- 【TI 嵌入式研討會集錦】小站添加了很多新內(nèi)容,歡迎提貨!
- 《帶您了解ADI數(shù)字健康生物傳感器系列》有獎直播
- 解鎖【W(wǎng)5500-EVB-Pico】,探秘以太網(wǎng)底層,得捷Follow me第4期來襲!
- 免費下載Vishay最新汽車解決方案
- 答題贏京東卡|《安森美和安富利物聯(lián)網(wǎng)創(chuàng)新設(shè)計大賽作品集》
- 有獎?wù){(diào)查:ST MEMS 傳感器論壇用戶問卷調(diào)查,參與有驚喜
- 答題贏好禮:ADI MEMS工業(yè)監(jiān)測助力機器大健康發(fā)展
- STM32--vs1053 WAV錄音實現(xiàn)(保存在SD卡)
- STM8 測量脈寬——紅外例程
- 單片機播放WAV格式音頻的理解
- 使用STM32控制無源蜂鳴器發(fā)聲播放音樂
- 新型智能心電監(jiān)測衣:能提前數(shù)天預(yù)警,預(yù)檢率有望達到95%甚至更高
- 與普通探頭相比,高壓差分探頭的參數(shù)含義及測試方法的區(qū)
- 擁抱大數(shù)據(jù)時代 解讀5G通信時鐘同步技術(shù)
- 英飛凌攜手PIONIERKRAFT,實現(xiàn)自產(chǎn)太陽能按需分配
- 借助Mendix低代碼平臺實現(xiàn)安全設(shè)計
- 高壓差分探頭測試實例分析