天天看點

stm32 Flash讀寫獨立函數[庫函數]

針對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**********************/      

作者:柒月