内部FLASH和EEPROM这种掉电后还能保存内容的内存统称为non-volatile memory(NVM),STM32L053内部有2K的EEPROM.6 M0 U: p" F1 S, y' z: k' u$ _
内部EEPROM的页大小为一个Word为单位,擦除是必须以页为单位,所以库函数里的擦除函数也是每次擦除4个字节:3 e7 ^& G8 t1 s4 ~/ p9 `$ ?3 L
3 ?8 u& M: z+ w7 H# x- <p>/** </p><p> * @brief Erase a word in data memory. </p><p> * @param Address: specifies the address to be erased. </p><p> * @note To correctly run this function, the HAL_FLASHEx_DATAEEPROM_Unlock() function </p><p> * must be called before. </p><p> * Call the HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access </p><p> * and Flash program erase control register access(recommended to protect </p><p> * the DATA_EEPROM against possible unwanted operation). </p><p> * @retval HAL status </p><p> */ </p><p>HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address) </p><p>{ </p><p> HAL_StatusTypeDef status = HAL_OK; </p><p> </p><p> /* Check the parameters */ </p><p> assert_param(IS_FLASH_DATA_ADDRESS(Address)); </p><p> </p><p> /* Wait for last operation to be completed */ </p><p> status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); </p><p> </p><p> if(status == HAL_OK) </p><p> { </p><p> /* Clean the error context */ </p><p> ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE; </p><p> </p><p> /* Write "00000000h" to valid address in the data memory" */ </p><p> *(__IO uint32_t *) Address = 0x00000000; </p><p> </p><p> status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); </p><p> } </p><p> </p><p> return status; </p><p>} </p>
复制代码
: o) s0 r$ W. j9 k% B 写EEPROM的顺序和使用flash类似,要先解锁(UNLOCK) 才能写,写的时候可以字节、半字、字为单位都可以。* \9 X& m6 ]4 U7 S- o
- K- ?1 d5 w6 [$ ?( s$ E写的时候可以不擦除,内部会自动擦除。需要注意的是写EEPROM会消耗固定的时间,所以需要在程序对时间要求严格时
/ P3 r4 w8 v- n% P# k
$ W, m/ M& R) t6 H8 E正确安排写EEPROM的时机。
+ H- \# k' l4 ]) Z! h5 T h" J0 }% o7 I
写EEPROM的函数如下:* `) F4 I) I7 w$ U Z2 H( m4 a
) m: P/ @! W c
- <p>void EEPROM_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite) </p><p>{ </p><p> uint16_t t; </p><p> HAL_FLASHEx_DATAEEPROM_Unlock(); </p><p> for(t = 0;t < NumToWrite;t++) </p><p> { </p><p> HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE,DATA_EEPROM_BASE + WriteAddr + t,*(pBuffer + t)); </p><p> } </p><p> HAL_FLASHEx_DATAEEPROM_Lock(); </p><p>} </p>
复制代码
: a- X5 x N) M; [$ S& y" emain函数里面先写EEPROM,然后再读出来验证是否和写一样,一样的话点亮LED:3 v/ |8 l% V: I. @) z- I/ u7 l
V+ ~6 H9 c- [: x3 O% X
- <p>#include "main.h" </p><p>uint8_t Test[25] = "http://www.eepw.com.cn/"; </p><p>uint8_t Buff[25]; </p><p>int main(void) </p><p>{ </p><p> uint8_t res; </p><p> HAL_Init(); </p><p> SystemClock_Config(); </p><p> LED_Init(); </p><p> EEPROM_Write(0,Test,25); </p><p> EEPROM_Read(0,Buff,25); </p><p> res = strcmp((const char*)Buff,(const char*)Test); </p><p> if(0 == res) </p><p> { </p><p> while(1) </p><p> { </p><p> HAL_Delay(500); </p><p> LED_TOG; </p><p> } </p><p> } </p><p>} </p><p></p>
复制代码
& s3 M6 f+ j! G6 j) R: \7 Z+ ^ X) J K8 Y( F. D) l' V$ C- M/ x
|