① AVR單片機中如何寫flash,目前能夠讀出來,就是不知道怎麼將變數寫到flash任意地址中
如果是在單片機程序中寫Flash,這是一個很復雜的過程,
Atmega單片機
Flash分為兩個區:可讀寫區(RWW),不可讀寫區(NRWW)
RWW:
read-while-write,也就是常說的
bootloader
區,
NRWW:no-read-while-write
一般的應用程序是在NRWW區的,也就是說不可以對flash進行操作,但是你可以寫一段
程序下載
到RWW區,然後這一段的程序可能對整個Flash進行讀寫操作,所以你要實現寫Flash的話,你的應用程序必須跳轉到RWW區,將要寫的地址傳給它,然後由該部分的程序去完成操作,然後再跳回你的應用程序
② 單片機對flash的讀寫問題
stc單片機中的flash是程序存儲器 如果你要保存數據可以保存到EEPROM中,stc中有2K~10幾K不等,至於到底STC中的flash中能否用於保存除程序之外的數據,沒有研究過.......
③ 單片機中,對Flash的讀寫與外部RAM/EEPROM讀寫有什麼不一樣
FLASH是程序存儲器,嚴格來講是不允許MCU寫的,但是出於某些功能有的單片機允許MCU寫,但是為了安全寫FLASH會有一種相對復雜的操作。EEPROM是電可擦寫存儲器,他相對寫FLASH來說比較簡單,不同廠商的單片機EEPROM的操作也會有所不同。前面兩種都屬於間接定址,最後RAM是最簡單的讀寫,可以直接定址操作的。
④ 單片機讀寫flash為什麼必須是偶數地址
如果是操作16位匯流排,那麼訪問時必須按偶數地址對齊。
否則就不一定受這樣的限制。例如對串列Flash進行讀操作是可以對奇地址進行單位元組讀取的。
⑤ 新手請問師傅們我該如何通過spi讀寫這個單片機內FLASH
按寫的這個順序來操作啊。
先在偏移02h的寄存器寫好地址、在偏移03h的寄存器寫好數據,
然後向04h、05h寫入A5h、C3h解開防寫,
接著向00h依次寫入58A9h和A958h解鎖FLASH操作,
然後改寫01h寄存器的第4位到第2位,寫入FLASH操作命令,並將第0位置1,啟動操作,
回讀01h寄存器直到第0位變成0,表明操作完成,
⑥ 51單片機如何讀寫內置的Flash
寫進去還是很簡單的,用stc-isp一下子就寫進去了,要讀出來就麻煩了,寫進去的時候已經加密了,很難得反編譯的。
⑦ 如何用單片機讀寫FLASH
W25X_16嗎?SPI介面,要看你是何種單 片機,有硬體SPI介面和沒有配件SPI介面的區別在於讀寫一個位元組的方法不一樣,其餘上層函數是一樣的。如果是STM32單片機,野火和正點原子常式里的都有完整的源文件。
⑧ 讀寫flash和eprom的區別
FLASH的全稱是FLASH EEPROM,但跟常規EEPROM的操作方法不同。FLASH和EEPROM的最大區別是FLASH按扇區操作,EEPROM則按位元組操作,二者定址方法不同,存儲單元的結構也不同,FLASH的電路結構較簡單,同樣容量占晶元面積較小,成本自然比EEPROM低,因而適合用作程序存儲器,EEPROM麻煩的多,所以更「人性化」的MCU設計會集成FLASH和EEPROM兩種非易失性存儲器,而廉價型設計往往只有FLASH,EEPROM在運行中可以被修改,而FLASH在運行時不能修改,EEPROM可以存儲一些修改的參數,Flash中存儲程序代碼和不需要修改的數據,所謂的Flash是用來形容整個存儲單元的內容可以一次性擦除。所以,理論上凡是具備這樣特徵的存儲器都可以稱為Flash memory。EEPROM裡面也分FF-EEPROM和FLASH EEPROM的,現在大家所講的Flash memory實際上分為兩大類,一類是Floating Gate Debice,一類是Charge Trapping Debice,這里的分類標准主要是program與crase的機制不同。
一:FLASH和EEPROM的區別
1:相同點是兩者都能掉電存儲數據
2:不同點是:
A:FALSH寫入時間長,EEPROM寫入時間短。
B:FLASH擦寫次數少(10000次),EEPROM次數多(1000000次)
二:單片機的數據存儲器不能用FLASH,因為:
1:FLASH有一定的擦除,寫入次數,一般的單片機的FLASH擦除寫入次數的標稱值是10000次。
2:FLASH寫入數據需要比較長的時間,大約需要4-6ms,而且寫FLASH需要加上9V的高壓,麻煩。
三:至於EEPROM,可以作為數據存儲器,但是單片機如atmegal28,一般用RAM作為數據存儲器,因為EEPROM工藝復雜,成本高,適合於存儲掉電保護的數據,而這類數據往往不需要太多,所以一般的單片機都沒在內部集成EEPROM,需要的時候可以讓單片機外掛24C01一類的串列EEPROM。
區別:
1、 FLASH按扇區操作,EEPROM則按位元組操作
2、 FLASH寫入時間長,EEPROM寫入時間短
3、 FLASH擦寫次數少(10000次),EEPROM次數多(1000000次)
4、 FLASH的電路結構簡單,成本低,EEPROM工藝復雜,成本高
⑨ 如何用單片機讀寫FLASH
就是這段程序了。我一直用的。不懂的可以找我
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0X82// SYSCLK<24M
#define IAP_ADDRESS 0X0000
void IAP_Disable()//Make MCU if safe state
{
//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
//一次連續的IAP 操作完成之後建議關閉IAP 功能,不需要每次都關
IAP_CONTR = 0; //關閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
IAP_ADDRH = 0x80; // ??? 0x80 ????
IAP_ADDRL = 0;
}
//讀一位元組,調用前需打開IAP 功能,入口:DPTR = 位元組地址,返回:A = 讀出位元組
uchar Byte_Read(uint addr)
{
IAP_CONTR=ENABLE_IAP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD=CMD_READ; //IAP/ISP/EEPROM 位元組讀命令
IAP_ADDRL=addr; //設置目標單元地址的高8 位地址
IAP_ADDRH=addr>>8; //設置目標單元地址的低8 位地址
IAP_TRIG=0X5A;//先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG=0XA5;//送完A5h 後,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable();//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態
return IAP_DATA;
}
//位元組編程,調用前需打開IAP 功能,入口:DPTR = 位元組地址, A= 須編程位元組的數據
void Byte_Program(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;//打開 IAP 功能, 設置Flash 操作等待時間
IAP_CMD=CMD_PROGRAM;//IAP/ISP/EEPROM 位元組編程命令
IAP_ADDRL=addr;//設置目標單元地址的高8 位地址
IAP_ADDRH=addr>>8; //設置目標單元地址的低8 位地址
IAP_DATA=dat;//要編程的數據先送進IAP_DATA 寄存器
IAP_TRIG=0X5A;//先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG=0XA5; //送完A5h 後,ISP/IAP 命令立即被觸發起動
_nop_();
IAP_Disable();//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
}
void Sector_Erase(uint addr) //擦除扇區, 入口:DPTR = 扇區地址
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
IAP_Disable();
}