STM32之内部FLASH例程
生活随笔
收集整理的這篇文章主要介紹了
STM32之内部FLASH例程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include "stm32f10x.h"
#include <string.h>/* STM32 內部 FLASH 配置 */
#define STM32_FLASH_SIZE 512 /* 所選STM32的FLASH容量大小(單位為K) */#if STM32_FLASH_SIZE < 256#define STM_SECTOR_SIZE 1024 /* < 256為1K字節頁, >=256 為2K頁 */
#else #define STM_SECTOR_SIZE 2048
#endif/* 應用程序區域 */
#define APP_REGION (0x8000000 + 0x80000 - STM_SECTOR_SIZE)/* RCC時鐘配置 */
void RCC_config()
{ ErrorStatus HSEStartUpStatus;/* RCC寄存器設置為默認配置 */RCC_DeInit();/* 打開外部高速時鐘 */RCC_HSEConfig(RCC_HSE_ON);/* 等待外部高速時鐘穩定 */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) { /* 設置HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 設置PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* 設置PCLK1 = HCLK / 2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* 設置FLASH代碼延時 */FLASH_SetLatency(FLASH_Latency_2);/* 使能預取址緩存 */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* 設置PLL時鐘源為HSE倍頻9 72MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* 使能PLL */RCC_PLLCmd(ENABLE);/* 等待PLL穩定 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/* 設置PLL為系統時鐘源 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待系統時鐘源切換到PLL */while(RCC_GetSYSCLKSource() != 0x08);}
}/* 扇區緩沖區 */
static uint8_t flash_buf[STM_SECTOR_SIZE];/* 讀flash */
void read_flash(uint32_t addr, uint8_t *buf, uint16_t size)
{uint16_t i;for(i = 0; i < size; i++){buf[i] = *(__IO uint8_t *)(addr + i);}
} /* 寫flash */
void write_flash(uint32_t addr, uint8_t *buf, uint16_t size)
{uint32_t addr_base;uint16_t len;uint16_t i;/* 檢查地址合法性 */if(addr < FLASH_BASE ||(addr >= (FLASH_BASE + 1024 * STM32_FLASH_SIZE)))assert_param(0);/* 將數據循環寫入flash */while(size) {/* 扇區基地址 */addr_base = (addr / STM_SECTOR_SIZE) * STM_SECTOR_SIZE;/* 讀出整個扇區內容 */read_flash(addr_base, flash_buf, STM_SECTOR_SIZE);/* 需要寫入的長度 */len = ((addr + size) > (addr_base + STM_SECTOR_SIZE)) ? (addr_base + STM_SECTOR_SIZE - addr) : size;/* 將需要改變的內容替換掉 */memcpy(flash_buf + addr - addr_base, buf, len);/* 解鎖 */FLASH_Unlock();/* 擦除整片扇區 */FLASH_ErasePage(addr_base);/* 寫使能 */FLASH->CR &= FLASH_CR_OPTWRE; /* 重新將內容寫入扇區 */for(i = 0; i < STM_SECTOR_SIZE / 2; i++, addr_base += 2) /* 從頭寫到尾 */FLASH_ProgramHalfWord(addr_base, *((uint16_t *)flash_buf + i));/* 鎖定 */FLASH_Lock();/* 將數據偏移len */addr += len;buf += len;size -= len;}
}int main()
{uint8_t buf[5] = {1, 2, 3, 4, 5};uint8_t test[5];/* 時鐘配置 */RCC_config();write_flash(APP_REGION, buf, 5);read_flash(APP_REGION, test, 5);while(1){}
}
?
總結
以上是生活随笔為你收集整理的STM32之内部FLASH例程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LwIP之netbuf
- 下一篇: USB描述符