一、概要
STM8系列一般擁有如下幾種三種數據區(qū)
用戶啟動區(qū)域(UBC)
數據EEPROM(DATA)
主程序區(qū)
選項字節(jié)(Option byte)
用戶啟動區(qū)域(UBC)包含有復位和中斷向量表,它可用于存儲IAP及通訊程序;
數據EEPROM(DATA)區(qū)域可用于存儲用戶具體項目所需的數據;
主程序區(qū)是指在FLASH程序存儲器中用于存儲應用代碼的區(qū)域;
選項字節(jié)用于配置硬件特性和存儲器保護狀態(tài)。
作為應用而言,一般主要使用EEPROM(DATA),存放各種參數、或者離線數據、狀態(tài)數據等等。
下面以以STM8L052R8為例,簡單說明對其的訪問方法。
根據STM8L052R8的手冊,其有Memory信息如下:
■ Memories
– 64 KB Flash program memory and 256 bytes data EEPROM with ECC, RWW
– Flexible write and read protection modes
– 4 KB of RAM
可知其具有256字節(jié)的EEPROM。并帶有ECC校驗,和RWW(讀同時寫)功能。
RWW特性允許戶在執(zhí)行程序和讀程序存儲器時對DATA EEPROM區(qū)域進行寫操作,
因此執(zhí)行的時間被優(yōu)化了。相反的操作是不允許的:即不允許在寫程序寄存器是對其進行讀操作。
RWW特性是一直有效的而且可以在任意時刻使用
對EEPROM編程也有如下幾種方式,顧名思義,很容易理解其含義。
字節(jié)編程方式最易于理解,也最簡單。
字節(jié)編程
字編程
塊編程
二、更深入的細節(jié)
STM8系列有存儲器存取安全系統(tǒng)(MASS),在復位后,主程序和DATA區(qū)域都被自動保護以防止無意的寫操作。
在修改其內容前必須對其解鎖,而解鎖的機制由存儲器存取安全系統(tǒng)(MASS)來管理。(UBC始終為寫保護)
因此寫操作時需要先解除寫保護,并在完成寫入后恢復寫保護(視應用而定)。
Unlock的具體操作是,向FLASH_DUKR寄存器連續(xù)寫入兩個被叫作MASS密鑰的值:
第一個硬件密鑰: 0b1010 1110 (0xAE)
第二個硬件密鑰: 0b0101 0110 (0x56)
如果解鎖成功,FLASH_IAPSR中的DUL位被置為1,表示成功。
應用必須檢測這個標志才可進行后續(xù)操作。
(編程區(qū)與之類似,但寫入的是PUKR,且2個密鑰順序相反)
對EEPROM的讀寫其實非常簡單,就是直接對地址按字節(jié)進行賦值和取值。
但是在操作后,需要等待其操作完成。判斷方法是:
對于EEPROM(DATA)數據區(qū):FLASH_IAPSR寄存器的HVOFF(高壓結束標志位)變?yōu)?
對于編程區(qū):FLASH_IAPSR寄存器的EOP(編程結束標志位)變?yōu)?
另外,試圖向被保護頁進行寫操作時,會發(fā)生錯誤,此時FLASH_IAPSR得WR_PG_DIS標志位會置1。
所以,最終的判斷方法是:
HVOFF或者WR_PG_DIS被置為1,前者為正常介紹,后者表示出錯
三、示例代碼
地址范圍定義(讀寫范圍為0~127字節(jié))
#define DATA_MEMORY_START_ADDR (FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS)
#define DATA_MEMORY_STOP_ADDR (FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS + 128)
初始化函數
void flash_init(void)
{
// 設置編程時間,指定標準編程時間即可
FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
// 解鎖EEPROM區(qū)域(注意type是Data)
FLASH_Unlock(FLASH_MemType_Data);
// 等待解鎖成功
// 本質是判斷FLASH->IAPSR寄存器的DUL標志位是否變?yōu)?。1表示寫保護消除,0為保護中
// 任何時候都可以通過變更此標志位為0來恢復寫保護狀態(tài)
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
}
讀函數
uint8_t flash_read(uint32_t FlashAddr, uint8_t *dest, uint8_t nbyte)
{
uint8_t i = 0;
// 越界判斷
if((FlashAddr < DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte > DATA_MEMORY_STOP_ADDR)) {
return FALSE;
}
// 按字節(jié)讀
for(i=0; i *(dest+i)=FLASH_ReadByte(FlashAddr+i); // 等待操作完成,此處未處理錯誤 FLASH_WaitForLastOperation(FLASH_MemType_Data); } return nbyte; } 寫函數 uint8_t flash_write(uint32_t FlashAddr, uint8_t *source, uint8_t nbyte) { uint8_t i = 0; // 越界判斷 if((FlashAddr < DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte > DATA_MEMORY_STOP_ADDR)) { return FALSE; } // 按字節(jié)寫 for(i=0;i FLASH_ProgramByte((FlashAddr+i),*(source + i)); // 等待操作完成,此處未處理錯誤 FLASH_WaitForLastOperation(FLASH_MemType_Data); } return nbyte; } 四、庫函數實現解析 FLASH_Unlock函數 void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType) { /* Unlock program memory */ if(FLASH_MemType == FLASH_MemType_Program) { FLASH->PUKR = FLASH_RASS_KEY1; FLASH->PUKR = FLASH_RASS_KEY2; } /* Unlock data memory */ // 連續(xù)兩次賦值密鑰(固定值) if(FLASH_MemType == FLASH_MemType_Data) { FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */ /* 0xAE */ FLASH->DUKR = FLASH_RASS_KEY1; /* 0x56 */ } } FLASH_ReadByte、FLASH_ProgramByte、FLASH_EraseByte 由下可知,讀寫擦出均為直接操作地址。 uint8_t FLASH_ReadByte(uint32_t Address) { /* Read byte */ return(*(PointerAttr uint8_t *) (MemoryAddressCast)Address); } void FLASH_ProgramByte(uint32_t Address, uint8_t Data) { *(PointerAttr uint8_t*) (MemoryAddressCast)Address = Data; } void FLASH_EraseByte(uint32_t Address) { *(PointerAttr uint8_t*) (MemoryAddressCast)Address = FLASH_CLEAR_BYTE; /* Erase byte */ } FLASH_WaitForLastOperation 操作等待 FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType)) { uint16_t timeout = OPERATION_TIMEOUT; uint8_t flagstatus = 0x00; /* Wait until operation completion or write protected page occurred */ // 程序區(qū)等待IAPSR的EOP或者WR_PG_DIS標識位被置為1 if(FLASH_MemType == FLASH_MemType_Program) { while((flagstatus == 0x00) && (timeout != 0x00)) { flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); timeout--; // 貼心的超時處理 } } else { // 數據區(qū)的話,等待IAPSR的HVOFF或者WR_PG_DIS標識位被置為1 while((flagstatus == 0x00) && (timeout != 0x00)) { flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF | FLASH_IAPSR_WR_PG_DIS)); timeout--; // 貼心的超時處理 } } if(timeout == 0x00) { // 超時 flagstatus = FLASH_Status_TimeOut; } return((FLASH_Status_TypeDef)flagstatus); } 以上,相比直接操作寄存器,用庫做STM開發(fā)還是比較有效率的。
上一篇:STM8L151 在IAR中實現Flash/EEPROM的擦寫
下一篇:MCU STM8L051F3xx EEPROM 操作筆記
推薦閱讀
史海拾趣
隨著技術的不斷進步,ADI開始逐步拓展其產品線,從最初的運算放大器逐步擴展到信號處理、數據轉換等多個領域。這些技術突破不僅鞏固了ADI在電子行業(yè)的地位,也為其帶來了更多的商業(yè)機會。同時,ADI始終保持著對新技術的高度關注,不斷投入研發(fā),確保公司在激烈的市場競爭中保持領先地位。
面對未來市場的機遇和挑戰(zhàn),EUPEC制定了明確的發(fā)展戰(zhàn)略。公司將繼續(xù)加大技術創(chuàng)新和研發(fā)投入力度,推動電力半導體技術的進步和應用拓展。同時,EUPEC還將加強與國際知名企業(yè)的合作與交流,不斷提升自身的競爭力和影響力。在應對市場變化和挑戰(zhàn)的過程中,EUPEC將始終堅持以客戶為中心的理念,為客戶提供更優(yōu)質的產品和服務。
請注意,以上故事是基于EUPEC公司的發(fā)展歷程和相關信息進行概括和編寫的,并非完全基于事實的直接敘述。如需更詳細和準確的信息,請參考相關官方資料或新聞報道。
為了進一步提升競爭力,AITSEMI公司積極尋求與產業(yè)鏈上下游企業(yè)的戰(zhàn)略合作。通過與晶圓制造、封裝測試等環(huán)節(jié)的領軍企業(yè)建立緊密的合作關系,AITSEMI不僅確保了穩(wěn)定的供應鏈和優(yōu)質的產品質量,還成功實現了產業(yè)鏈的垂直整合,為公司的長遠發(fā)展奠定了堅實的基礎。
為了加速國際化進程,金宇半導體于2020年制定了詳細的國際化戰(zhàn)略。公司首先在歐洲設立了研發(fā)中心,以吸引更多國際頂尖人才加入。隨后,金宇半導體又通過一系列并購整合動作,收購了多家在特定領域具有領先技術的海外企業(yè)。這些并購不僅增強了金宇半導體的技術實力和市場影響力,還為其在全球范圍內的業(yè)務拓展提供了有力支持。通過國際化戰(zhàn)略的實施,金宇半導體正逐步成為一家具有全球競爭力的半導體企業(yè)。
隨著新能源汽車產業(yè)的快速發(fā)展,富芯森美敏銳地捕捉到了這一市場機遇。公司投入大量資源研發(fā)車規(guī)級功率半導體器件,產品設計遵循APQP標準,制造管理符合IATF 16949要求,質量檢驗則嚴格遵循AEC-Q101標準。這些舉措使得富芯森美的車規(guī)級產品能夠滿足汽車行業(yè)的嚴苛要求,成功打入新能源汽車供應鏈體系,為公司帶來了新的增長點。
Curtis一直致力于環(huán)保和低碳技術的研發(fā)與應用。公司的產品和服務廣泛應用于電動汽車、混合動力汽車等環(huán)保型交通工具中,為減少碳排放、推動綠色出行做出了積極貢獻。同時,Curtis還積極參與各種環(huán)保活動和社會公益項目,通過實際行動踐行環(huán)保理念。
<p><strong><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋體; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">華為技術</span></strong><strong><span lang="EN ...… 查看全部問答∨ |
2008北京奧運會即將到來,全世界聚焦中國,國家大力實施奧運旅游戰(zhàn)略。07年,在全國旅游信息化工作會議上國家旅游局副局長杜江提出,“旅游資訊網建議使用全球旅游專用的.travel后綴域名。” Travel域名是專屬于旅游行業(yè)的新興全球頂級域名,與 ...… 查看全部問答∨ |
我們很多測量的時候都使用無源探頭,而這個看似很簡單的部件常常被大家忽略,要很好地測量,探頭還是很有講究的。下面幾點是示波器使用中需要注意的問題: 首先是帶寬,這個通常會在探頭上寫明,多少MHz。如果探頭的帶寬不夠,示波器的帶寬再高也 ...… 查看全部問答∨ |
Sirius 無線模塊: 性能介紹: # Technical info "Siriusisr35xx" 1 Chipset Solution "Infineon E-GOLDvoice( ...… 查看全部問答∨ |
為什么evc編譯出的程序能在開發(fā)板上運行,vs2005編譯出的卻不能? 同樣的hello wince程序,我的開發(fā)板是armv4i的,用evc選擇cpu為armv4i編譯出來能在開發(fā)板上運行,用vs2005選擇windows mobile 5.0 pocket pc sdk(armv4i)編譯出來卻無法運行?… 查看全部問答∨ |
|
用formality進行rtl和綜合后網表進行比對,發(fā)現兩個問題1.沒有匹配的點很多,reference多于implementation的2.verify的時候報了很多錯請問這是為什么啊 如何修改?ps:svf已經加了,另外設置忽略full case為false,不知道怎么辦,請高手指點… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 華為余承東:鴻蒙智能駕駛領先行業(yè),2026年實現L4自動駕駛
- 深圳發(fā)布全國首個全域開放自動駕駛技術指引
- 接近L4級 無人駕駛特斯拉Model Y上路測試
- 緊急自動靠邊停車系統(tǒng)AEP是如何工作的?
- 整合智能戰(zhàn)線,奇瑞智能化轉型走向輔助駕駛和座艙的大一統(tǒng)
- 香港科技大學開發(fā)出新型F3T傳感器 為機器人觸覺感知帶來突破
- 研究人員開發(fā)鋰沉積行為調控策略 提高全固態(tài)電池的性能和循環(huán)壽命
- 億緯鋰能瞄準2026,布局全固態(tài)電池生產工藝突破
- 人形機器人產業(yè)標準互認計劃啟動;地瓜機器人完成1億美元的A輪融資
- 中國廠商主導全球新能源汽車電池市場,寧德時代穩(wěn)居首位