針對STM32掉電保留函數,FLASH讀寫
一. stm32的FLASH分為
1.主存儲塊:用于儲存具體的程式代碼和使用者資料,主存儲塊是以頁為機關劃分的,
一頁大小為1KB。範圍為從位址0x08000000開始的128KB内。
2.資訊塊 :用于負責由stm32出廠是放置2KB的啟動程式(Bootloader)和512B的使用者配置資訊區
二.操作原則
對Flash 的寫入操作要 “先擦除後寫入”的原則;
stm32的内置flash 程式設計操作都是以頁為機關寫入的,而寫入的操作必須要以16位半字寬度資料位機關,允許跨頁寫,寫入非16位資料時将導緻stm32内部總線錯誤。
進行内置flash讀寫時,必須要打開内部Rc振蕩器。
頭檔案:
#ifndef __BSP_FLASH_H
#define __BSP_FLASH_H
#include "stm32f10x.h"
typedef enum {
FLASH_WRITE_OK = 1,
FLASH_WRIKE_NO = 0,
FLASH_READ_OK = 1,
FLASH_READ_NO = 0
}FLASH_FLAG ;
extern unsigned char FLASH_WRITE(unsigned short int * memory_data);
extern unsigned char FLASH_READ(unsigned short int * memory_data,unsigned short int n);
#endif /* __LED_H */
讀寫函數:
#include "bsp_flash.h"
FLASH_FLAG FLASH_STATUS;
static u32 count = 0;
/**---------------------------------------------------------------------------------
* @brief FLASH寫入必不可少步驟
* @param 輸入資料起始位址
* @retval 函數有無執行完畢
--------------------------------------------------------------------------------*/
unsigned char FLASH_WRITE(unsigned short int * memory_data)
{
static int t;
count = 0;
/*Enables or disables the Internal High Speed oscillator (HSI).*/
RCC_HSICmd(ENABLE);
/*打開FLASH可擦除控制器*/
FLASH_Unlock();
/*将flash三個标志位全清*/
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(0x8002000);
t = sizeof((const char *)memory_data);
while(count <= t)
{
/*flash 為一個位元組存儲,16位資料必須位址加2*/
FLASH_ProgramHalfWord((0x8002000 +count*2),*(memory_data+count));
count++;
if(count > t)
{
FLASH_STATUS = FLASH_WRIKE_NO;
return FLASH_STATUS;
}
}
/* Locks the FLASH Program Erase Controller.*/
FLASH_Lock();
RCC_HSICmd(DISABLE);
FLASH_STATUS = FLASH_WRITE_OK;
return FLASH_STATUS;
}
/**---------------------------------------------------------------------------------
* @brief FLASH讀出函數
* @param memory_data:輸出存放位址,n 輸出個數
* @retval 函數有無執行完畢
--------------------------------------------------------------------------------*/
unsigned char FLASH_READ(unsigned short int * memory_data,unsigned short int n)
{
count = 0;
while(count < n)
{
*(memory_data+count) = *(u16 *)(0x8002000 + count*2);
printf("\r %d \r",*(memory_data+count)); //讀取
count++;
if(count > n)
{
FLASH_STATUS = FLASH_READ_NO;
return FLASH_STATUS;
}
}
//FLASH_ErasePage(0x8002000);
FLASH_STATUS = FLASH_READ_OK;
return FLASH_STATUS;
}
/*********************************************END OF FILE**********************/
作者:柒月