日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32之内部FLASH例程

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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例程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。