MPC5744P內部Flash相當大,除了存儲代碼,多余的空間還可以另作它用,例如參數存儲,故障存儲,當然,Bootloader也是依賴于Flash讀寫。
內部Flash的結構請參考上一篇關于Flash結構及啟動原理的說明:https://blog.csdn.net/u010875635/article/details/85162135
讀?。阂淮巫x取256位。
擦除:一次擦除一個block,無論是16KB、32KB、64KB抑或256KB
編程:內置flash存儲可以通過word(32bits)或者double words(64bits)尋址編程,多個word或double words填充編程頁緩存(256bits),使能page編程(256bits,4個double words)或者quadpage編程(1024bits,16個double words)。推薦的編程操作從64bits到1024bits,并且64bits對齊。
flash讀寫示例:https://download.csdn.net/download/u010875635/10872302
建議將示例中的Flash_Check_g注釋掉,以便于支持2個32位數據編程,//ret = Flash_Check_g(startAddr,endAddr);
注意:
1、每組數據不能超過1024bits,否則會被截掉。
2、若是當前程序運行,則此partition不能被擦除,否則會死機。
MPC5744P的Flash按照地址空間分為LOW、MID、HIGH、First256K、Second256K(沒有這么多256K空間,因此Second實際上一直是空的)。
編程Flash的步驟如下:
1、激活主地址空間
2、解鎖對應Block
3、擦除對應Block
4、編程對應Block
我們在Processor Expert中添加flash_c551:flash_css模塊,然后生成代碼
解鎖、擦除、編程、讀取等操作函數如下:
flash.h
#ifndef _DRIVER_FLASH_FLASH_H_
#define _DRIVER_FLASH_FLASH_H_
#include "flash_c55_driver.h"
//get addressrage select block
flash_block_select_t Flash_GetSelectBlock(uint32_t startAddr, uint32_t endAddr);
status_t Flash_Unlock_g(uint32_t startAddr, uint32_t endAddr);
status_t Flash_Erase_g(uint32_t startAddr, uint32_t endAddr);
status_t Flash_Check_g(uint32_t startAddr, uint32_t endAddr);
status_t Flash_Program_g(uint32_t startAddr, uint32_t endAddr, uint32_t *buffer, uint32_t len);
status_t Flash_Lock_g(uint32_t startAddr, uint32_t endAddr);
uint32_t Flash_Read_g(uint32_t addr);
#endif /* End of (__BLOCK_MPC57XX__) */
flash.c
#include "Drivers/Flash/flash.h"
/***************************************
* Flash Block Range
:
// LOW--not program, partition 0 and 1
0x00800000-0x00803FFF -- 16KB,EEPROM-low block0, RWW_P:0
0x00804000-0x00807FFF -- 16KB,EEPROM-low block1, RWW_P:0
0x00F98000-0x00F9BFFF -- 16KB,low flash memory block2, RWW_P:1
0x00F9C000-0x00F9FFFF -- 16KB,low flash memory block3, RWW_P:1
// MID , partition 2 and 3
0x00808000-0x0080FFFF -- 32KB,EEPROM-mid block0, RWW_P:2
0x00810000-0x00817FFF -- 32KB,EEPROM-mid block1, RWW_P:3
//HIGH, , partition 4 and 5
0x00FA0000-0x00FAFFFF -- 64KB,high flash memory block0, RWW_P:4
0x00FB0000-0x00FBFFFF -- 64KB,high flash memory block1, RWW_P:4
0x00FC0000-0x00FCFFFF -- 64KB,high flash memory block2, RWW_P:4
0x00FD0000-0x00FDFFFF -- 64KB,high flash memory block3, RWW_P:5
0x00FE0000-0x00FEFFFF -- 64KB,high flash memory block4, RWW_P:5
0x00FF0000-0x00FFFFFF -- 64KB,high flash memory block5, RWW_P:5
//256K--all used
0x01000000-0x0103FFFF -- 256KB,256k flash memory block0, RWW_P:6
0x01040000-0x0107FFFF -- 256KB,256k flash memory block1, RWW_P:6
0x01080000-0x010BFFFF -- 256KB,256k flash memory block2, RWW_P:6
0x010C0000-0x010FFFFF -- 256KB,256k flash memory block3, RWW_P:6
0x01100000-0x0113FFFF -- 256KB,256k flash memory block4, RWW_P:7
0x01140000-0x0117FFFF -- 256KB,256k flash memory block5, RWW_P:7
0x01180000-0x011BFFFF -- 256KB,256k flash memory block6, RWW_P:7
0x011C0000-0x011FFFFF -- 256KB,256k flash memory block7, RWW_P:7
**************************************/
#define FLASH_TOTAL_BLOCKCOUNT 20
#define FLASH_LOWPART_BLOCKCOUNT 4
#define FLASH_MIDPART_BLOCKCOUNT 2
#define FLASH_HIGHPART_BLOCKCOUNT 6
#define FLASH_256KPART_BLOCKCOUNT 8
//low
#define FLASH_BLOCKPART_LOW_BLOCKNUM_0_START 0x00800000
#define FLASH_BLOCKPART_LOW_BLOCKNUM_0_END 0x00803FFF
#define FLASH_BLOCKPART_LOW_BLOCKNUM_1_START 0x00804000
#define FLASH_BLOCKPART_LOW_BLOCKNUM_1_END 0x00807FFF
#define FLASH_BLOCKPART_LOW_BLOCKNUM_2_START 0x00F98000
#define FLASH_BLOCKPART_LOW_BLOCKNUM_2_END 0x00F9BFFF
#define FLASH_BLOCKPART_LOW_BLOCKNUM_3_START 0x00F9C000
#define FLASH_BLOCKPART_LOW_BLOCKNUM_3_END 0x00F9FFFF
//mid
#define FLASH_BLOCKPART_MID_BLOCKNUM_0_START 0x00808000
#define FLASH_BLOCKPART_MID_BLOCKNUM_0_END 0x0080FFFF
#define FLASH_BLOCKPART_MID_BLOCKNUM_1_START 0x00810000
#define FLASH_BLOCKPART_MID_BLOCKNUM_1_END 0x00817FFF
//high
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_0_START 0x00FA0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_0_END 0x00FAFFFF
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_1_START 0x00FB0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_1_END 0x00FBFFFF
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_2_START 0x00FC0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_2_END 0x00FCFFFF
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_3_START 0x00FD0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_3_END 0x00FDFFFF
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_4_START 0x00FE0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_4_END 0x00FEFFFF
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_5_START 0x00FF0000
#define FLASH_BLOCKPART_HIGH_BLOCKNUM_5_END 0x00FFFFFF
//256k
#define FLASH_BLOCKPART_256K_BLOCKNUM_0_START 0x01000000
#define FLASH_BLOCKPART_256K_BLOCKNUM_0_END 0x0103FFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_1_START 0x01040000
#define FLASH_BLOCKPART_256K_BLOCKNUM_1_END 0x0107FFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_2_START 0x01080000
#define FLASH_BLOCKPART_256K_BLOCKNUM_2_END 0x010BFFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_3_START 0x010C0000
#define FLASH_BLOCKPART_256K_BLOCKNUM_3_END 0x010FFFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_4_START 0x01100000
#define FLASH_BLOCKPART_256K_BLOCKNUM_4_END 0x0113FFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_5_START 0x01140000
#define FLASH_BLOCKPART_256K_BLOCKNUM_5_END 0x0117FFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_6_START 0x01180000
#define FLASH_BLOCKPART_256K_BLOCKNUM_6_END 0x011BFFFF
#define FLASH_BLOCKPART_256K_BLOCKNUM_7_START 0x011C0000
#define FLASH_BLOCKPART_256K_BLOCKNUM_7_END 0x011FFFFF
/* Lock State , shift is in the setlock function*/
#define LOCK_LOW_BLOCKS 0x00003FFFU //lock0
#define LOCK_MID_BLOCKS 0x0000FFFFU //lock0
#define LOCK_HIGH_BLOCKS 0x0000FFFFU //lock1
#define LOCK_FIRST256_BLOCKS 0xFFFFFFFFU //lock2
//#define UNLOCK_SECOND256_BLOCKS 0x0000FFFFU //lock3
#define UNLOCK_LOW_BLOCKS 0x00000000U
#define UNLOCK_MID_BLOCKS 0x00000000U
#define UNLOCK_HIGH_BLOCKS 0x00000000U
#define UNLOCK_FIRST256_BLOCKS 0x00000000U
//#define UNLOCK_SECOND256_BLOCKS 0x00000000U
#define NUMBER_OF_WORD_BLANK_CHECK 0x90
#define NUMBER_OF_WORD_PGM_VERIFY 0x80
#define NUMBER_OF_WORD_CHECK_SUM 0x120
/* Platform Flash */
#define FLASH_FMC PFLASH_BASE
#define FLASH_PFCR1 0x000000000U
#define FLASH_PFCR2 0x000000004U
#define FLASH_FMC_BFEN_MASK 0x000000001U
//Block part and number structure
typedef struct
{
uint32_t BlockPart; //Low,Mid,High or 256K
uint32_t BlockNum; //Block 0...n
}Flash_BlockPartAndNum;
uint32_t Flash_Block_Lock[4]={
LOCK_LOW_BLOCKS
,LOCK_MID_BLOCKS
,LOCK_HIGH_BLOCKS
,LOCK_FIRST256_BLOCKS
};
uint32_t Flash_Block_UnLock[4]={
UNLOCK_LOW_BLOCKS
,UNLOCK_MID_BLOCKS
,UNLOCK_HIGH_BLOCKS
,UNLOCK_FIRST256_BLOCKS
};
//every part block count
uint32_t Flash_Block_Count[4]={
FLASH_LOWPART_BLOCKCOUNT
,FLASH_MIDPART_BLOCKCOUNT
,FLASH_HIGHPART_BLOCKCOUNT
,FLASH_256KPART_BLOCKCOUNT
};
//low space block start array
uint32_t Flash_Block_Low_Start_Array[FLASH_LOWPART_BLOCKCOUNT]={
FLASH_BLOCKPART_LOW_BLOCKNUM_0_START
,FLASH_BLOCKPART_LOW_BLOCKNUM_1_START
,FLASH_BLOCKPART_LOW_BLOCKNUM_2_START
,FLASH_BLOCKPART_LOW_BLOCKNUM_3_START
};
//mid space block start array
uint32_t Flash_Block_Mid_Start_Array[FLASH_MIDPART_BLOCKCOUNT]={
//mid
FLASH_BLOCKPART_MID_BLOCKNUM_0_START
,FLASH_BLOCKPART_MID_BLOCKNUM_1_START
};
//high space block start array
uint32_t Flash_Block_High_Start_Array[FLASH_HIGHPART_BLOCKCOUNT]={
//high
FLASH_BLOCKPART_HIGH_BLOCKNUM_0_START
,FLASH_BLOCKPART_HIGH_BLOCKNUM_1_START
,FLASH_BLOCKPART_HIGH_BLOCKNUM_2_START
,FLASH_BLOCKPART_HIGH_BLOCKNUM_3_START
,FLASH_BLOCKPART_HIGH_BLOCKNUM_4_START
,FLASH_BLOCKPART_HIGH_BLOCKNUM_5_START
};
//256k space block start array
uint32_t Flash_Block_256K_Start_Array[FLASH_256KPART_BLOCKCOUNT]={
//256k
FLASH_BLOCKPART_256K_BLOCKNUM_0_START
,FLASH_BLOCKPART_256K_BLOCKNUM_1_START
,FLASH_BLOCKPART_256K_BLOCKNUM_2_START
,FLASH_BLOCKPART_256K_BLOCKNUM_3_START
,FLASH_BLOCKPART_256K_BLOCKNUM_4_START
,FLASH_BLOCKPART_256K_BLOCKNUM_5_START
,FLASH_BLOCKPART_256K_BLOCKNUM_6_START
,FLASH_BLOCKPART_256K_BLOCKNUM_7_START
};
//low space block end array
uint32_t Flash_Block_Low_End_Array[FLASH_LOWPART_BLOCKCOUNT]={
FLASH_BLOCKPART_LOW_BLOCKNUM_0_END
,FLASH_BLOCKPART_LOW_BLOCKNUM_1_END
,FLASH_BLOCKPART_LOW_BLOCKNUM_2_END
,FLASH_BLOCKPART_LOW_BLOCKNUM_3_END
};
//mid space block end array
uint32_t Flash_Block_Mid_End_Array[FLASH_MIDPART_BLOCKCOUNT]={
//mid
FLASH_BLOCKPART_MID_BLOCKNUM_0_END
,FLASH_BLOCKPART_MID_BLOCKNUM_1_END
};
//high space block end array
uint32_t Flash_Block_High_End_Array[FLASH_HIGHPART_BLOCKCOUNT]={
//high
FLASH_BLOCKPART_HIGH_BLOCKNUM_0_END
,FLASH_BLOCKPART_HIGH_BLOCKNUM_1_END
,FLASH_BLOCKPART_HIGH_BLOCKNUM_2_END
,FLASH_BLOCKPART_HIGH_BLOCKNUM_3_END
,FLASH_BLOCKPART_HIGH_BLOCKNUM_4_END
,FLASH_BLOCKPART_HIGH_BLOCKNUM_5_END
上一篇:【MPC5744P】S32DS中Processor Expert自動生成代碼工具使用教程(五
下一篇:【飛思卡爾 MC9S12】PRM文件與內存映射(Flash、RAM、EEE)
推薦閱讀
史海拾趣
Diodes公司積極實施全球化戰略,不斷拓展海外市場。公司在以色列、加利福尼亞、得克薩斯和日本等地設立了制造工廠,形成了覆蓋全球的生產和銷售網絡。這些工廠不僅為Diodes提供了充足的產能支持,也為公司贏得了更多國際客戶的青睞。同時,Diodes還積極參加國際展會和交流活動,加強與國際同行的合作與交流,不斷提升公司的國際化水平。
隨著科技的快速發展和市場的不斷變化,客戶需求也在不斷更新。為了滿足客戶不斷變化的需求,Diodes公司始終保持敏銳的市場洞察力和創新力。公司不斷推出新產品、新技術和新應用方案,以滿足客戶在性能、可靠性、成本等方面的需求。同時,Diodes還積極與客戶溝通交流,了解客戶的實際需求和反饋意見,不斷優化產品和服務。這些努力使得Diodes能夠緊跟市場步伐、滿足客戶需求,在激烈的市場競爭中保持領先地位。
Diodes公司積極實施全球化戰略,不斷拓展海外市場。公司在以色列、加利福尼亞、得克薩斯和日本等地設立了制造工廠,形成了覆蓋全球的生產和銷售網絡。這些工廠不僅為Diodes提供了充足的產能支持,也為公司贏得了更多國際客戶的青睞。同時,Diodes還積極參加國際展會和交流活動,加強與國際同行的合作與交流,不斷提升公司的國際化水平。
面對全球市場的不斷變化和競爭態勢的加劇,Coleman Cable制定了全球化的發展戰略。公司加強了對國際市場的調研和分析,根據不同地區的市場需求和特點,制定針對性的市場策略和產品方案。同時,公司還積極拓展國際銷售渠道,加強與國際客戶的溝通和合作,為公司的長遠發展奠定了堅實的基礎。
以上五個故事僅代表可能的發展情況,并不代表Coleman Cable Inc公司真實的歷史。如果需要更具體和準確的信息,建議直接查閱該公司的官方網站、年報或相關新聞報道。
歌普電子科技有限公司以自有品牌(GEPU歌普)創立于2006年,公司最初在臺灣設立,隨后逐步擴展至江蘇和東莞,形成了跨區域的研發、生產和銷售網絡。公司自創立之初便專注于各式線對板連接器、板對板連接器、網絡連接器等產品的研發與設計。通過不斷的技術積累和市場需求洞察,歌普逐漸在連接器領域建立了自己的市場地位。
面對制造業轉型升級的機遇和挑戰,EUtech公司積極探索智能制造領域。他們引進先進的生產設備和自動化生產線,提高生產效率和質量。同時,公司還注重人才培養和技術創新,打造了一支高素質的研發團隊和技術工人隊伍。在智能制造的助力下,EUtech公司實現了從傳統制造向智能制造的轉型升級。
以上五個故事均基于EUtech Scientific Engineering公司的實際情況和電子行業的發展趨勢進行虛構。希望這些故事能夠為您提供一些啟示和參考。
看到“古道熱腸”強烈推薦魏坤的第二版示波器,轉載來,供大家學習:轉自www.OURDEV.cn‘魏坤手持示波儀開源DIY活動’ 12月發布的原理圖和PCB: 大概的配置為: 雙通道;每通道采樣率100Msps;每通道存儲深度4K;模擬帶寬大于30MHz(使用Agilen ...… 查看全部問答∨ |
|
作者博客:http://radiobcl.blog.163.com/ 在FT-80C等電臺的收發切換繼電器后面接收輸入處加個限幅電路:如果沒有合適的兩個背對背連接的硅瞬變吸收二極管(TVS),采用幾組用二極管1N4148串聯的組件正反向并聯也可以對地分流,輸入串聯2W/24V燈泡、 ...… 查看全部問答∨ |
#include<reg52.h> #include <intrins.h> #define keyborad P0 #define LCD_data P1 //數據口 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; #define uc ...… 查看全部問答∨ |
硬件平臺為qq2440,軟件平臺為WinCE 在這上面開發簡單圖形程序可否? 我做了幾個很簡單的圖形變化的程序。。。 但發現在這上面運行時根本沒有在本地電腦上那么流暢,請問WinCE 或者 qq2440 能開發一些簡單圖形變化的程序嗎? 如何能夠在Windows CE上開發一些流暢的圖形變化程序,需要什么? 不是有個什么世界編程大 ...… 查看全部問答∨ |
|
各位大蝦好! 我需要使用APIC,所以在config.h中加入了定義“#deinfe SYMMETRIC_IO_MODE“,但修改完以后,系統啟動剛過V1.6+++++++++這個畫面就藍屏了,再沒有任何改變。 我用的是pentium M處理器,vxworks5.5.1和tornado2.2.在該這個之前,一切 ...… 查看全部問答∨ |