STM32F0使用FLASH
- /* Private typedef -----------------------------------------------------------*/
- typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
- /* Private define ------------------------------------------------------------*/
- #define FLASH_PAGE_SIZE ((uint32_t)0x00000400) /* FLASH Page Size */
- #define FLASH_USER_START_ADDR ((uint32_t)0x08003000) /* Start @ of user Flash area */
- #define FLASH_USER_END_ADDR ((uint32_t)0x08003000) /* End @ of user Flash area */
- #define DATA_32 ((uint32_t)0x12345678)
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- uint32_t EraseCounter = 0x00, Address = 0x00;
- uint32_t Data = 0x3210ABCD;
- uint32_t NbrOfPage = 0x00;
- __IO FLASH_Status FLASHStatus = FLASH_COMPLETE;
- __IO TestStatus MemoryProgramStatus = PASSED;
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- //void delayus(uint16_t u16us)
- //{
- // uint16_t i,j;
- //
- // for(i=0;i<u16us;i++)
- // {
- // // for(j=0;j<30;j++)
- // {
- // __NOP();
- // }
- // }
- //}
- void FlashRead()
- {
- /* Lock the Flash to disable the flash control register access (recommended
- to protect the FLASH memory against possible unwanted operation) *********/
- FLASH_Lock();
- /* Check if the programmed data is OK
- MemoryProgramStatus = 0: data programmed correctly
- MemoryProgramStatus != 0: number of words not programmed correctly ******/
- Address = FLASH_USER_START_ADDR;
- // MemoryProgramStatus = PASSED;
- CONFIG_A = *(__IO uint16_t *)Address; Address = Address + 2;
- CONFIG_B = *(__IO uint16_t *)Address; Address = Address + 2;
- CONFIG_C = *(__IO uint16_t *)Address; Address = Address + 2;
- }
- void FlashSave()
- {
- /*!< At this stage the microcontroller clock setting is already configured,
- this is done through SystemInit() function which is called from startup
- file (startup_stm32f0xx.s) before to branch to application main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f0xx.c file
- */
- /* Unlock the Flash to enable the flash control register access *************/
- FLASH_Unlock();
- /* Erase the user Flash area
- (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
- /* Clear pending flags (if any) */
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
- /* Define the number of page to be erased */
- // NbrOfPage = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
- /* Erase the FLASH pages */
- // for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
- {
- if (FLASH_ErasePage(FLASH_USER_START_ADDR )!= FLASH_COMPLETE)
- {
- /* Error occurred while sector erase.
- User can add here some code to deal with this error */
- while (1)
- {
- TM1620_DISPLAY_DOT(999,0,PAGEB);//B999标识存储器错误
- }
- }
- }
- /* Program the user Flash area word by word
- (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
- Address = FLASH_USER_START_ADDR;
- // while (Address < FLASH_USER_END_ADDR)
- // {
- if (FLASH_ProgramHalfWord(Address, CONFIG_A) == FLASH_COMPLETE)
- {
- }
- else
- {
- /* Error occurred while writing data in Flash memory.
- User can add here some code to deal with this error */
- delayus(100);
- }
- Address = Address + 2;
- if (FLASH_ProgramHalfWord(Address, CONFIG_B) == FLASH_COMPLETE)
- {
- }
- else
- {
- /* Error occurred while writing data in Flash memory.
- User can add here some code to deal with this error */
- delayus(100);
- }
- Address = Address + 2;
- if (FLASH_ProgramHalfWord(Address, CONFIG_C) == FLASH_COMPLETE)
- {
- }
- else
- {
- /* Error occurred while writing data in Flash memory.
- User can add here some code to deal with this error */
- delayus(100);
- }
- }
复制代码
|