概述
STM32C011 系列微控制器內(nèi)置 Flash 存儲器,支持程序存儲與數(shù)據(jù)保存,具備頁面擦除、雙字寫入、讀寫保護等功能。本文將簡要介紹 STM32C011 的 Flash 結(jié)構(gòu)與特性,并通過實際代碼示例,講解 Flash 的擦除、寫入與讀取等基本操作。
最近在弄ST的教程,需要樣片的可以加群申請:615061293/925643491 。
硬件準備
首先需要準備一個開發(fā)板,這里我準備的是自己繪制的開發(fā)板,需要的可以進行申請。 主控為STM32C011F4P6

視頻教學
https://www.bilibili.com/video/BV1KTBtY4EpD
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
源碼下載
https://download.csdn.net/download/qq_24312945/90228577
參考程序
https://github.com/CoreMaker-lab/STM32C011_TSSOP20
https://gitee.com/CoreMaker/STM32C011_TSSOP20
生成STM32CUBEMX
用STM32CUBEMX生成例程,這里使用MCU為STM32C011F4P6。 配置時鐘樹,配置時鐘為48M。

串口配置
查看原理圖,PA0和PA1設置為開發(fā)板的串口。

配置串口,速率為115200。

堆棧設置

若無法正常運行需要修改優(yōu)化等級。

串口重定向
打開魔術棒,勾選MicroLIB

在main.c中,添加頭文件,若不添加會出現(xiàn) identifier "FILE" is undefined報錯。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數(shù)聲明和串口重定向:
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
FLASH
STM32C011 的嵌入式 Flash 通過 AHB 總線與 Cortex-M0+ CPU 連接,支持訪問、擦除和編程操作。
Flash 構(gòu)成:
● 存儲單元:Flash 單元為 64 位寬,用于存儲代碼及數(shù)據(jù)。
● 主存儲器結(jié)構(gòu):
○ 共 16 頁,每頁大小為 2 KB,總計 32 KB。
● 信息塊區(qū)域:
○ 包括選項字節(jié)(2 KB)、工程字節(jié)(1 KB)、OTP(1 KB)及系統(tǒng)存儲器(6 KB)。


要向 FLASH 寫入數(shù)據(jù),需要依次完成以下四個步驟:
- 解鎖 FLASH
- 擦除 FLASH
- 寫入 FLASH
鎖定 FLASH 需要注意,F(xiàn)LASH 的擦除只能按頁或整塊進行。 STM32C011F4P6 的 FLASH 容量為 16 KB,共分為 8 頁,每頁大小為 2 KB。 我們可以將數(shù)據(jù)寫入第 7 頁,其地址范圍為 0x08003800 - 0x08003FFF。 單次寫入的單位為 64 位(8 字節(jié))。
數(shù)據(jù)初始化
● WriteFlashData:
○ 這是一個待寫入的 64 位數(shù)據(jù)數(shù)組,包含 3 個雙字(64 位)數(shù)據(jù)。
○ 每個元素的大小是 8 字節(jié),總計 24 字節(jié)的數(shù)據(jù)。
● addr 和 Page:
○ addr 是目標地址,表示從 Flash 的第 7 頁(Page 7)開始寫入。
○ STM32 的 Flash 以 2 KB 為一頁,因此第 7 頁的起始地址是 0x08003800。
/* USER CODE BEGIN 0 */
uint64_t WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//數(shù)據(jù)
uint32_t addr = 0x08003800;//page 7
uint32_t Page = 7;
void PrintFlashTest(uint32_t L,uint32_t Page);
void WriteFlashTest(uint32_t L,uint64_t Data[],uint32_t Page,uint32_t addr);
/* USER CODE END 0 */
FLASH 讀寫
/* USER CODE BEGIN 4 */
/* FLASH 寫入程序 */
void WriteFlashTest(uint32_t L, uint64_t Data[], uint32_t Page, uint32_t addr)
{
uint32_t i = 0;
uint32_t PageError = 0;
// 1/4 解鎖 FLASH
if (HAL_FLASH_Unlock() != HAL_OK)
{
printf("Error: Failed to unlock FLASH.n");
return;
}
// 2/4 初始化擦除結(jié)構(gòu)體并擦除指定頁
FLASH_EraseInitTypeDef FlashSet;
FlashSet.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除類型:頁擦除
FlashSet.Page = Page; // 頁索引
FlashSet.NbPages = 1; // 一次擦除 1 頁
if (HAL_FLASHEx_Erase(&FlashSet, &PageError) != HAL_OK)
{
printf("Error: Failed to erase FLASH. PageError: %dn", PageError);
HAL_FLASH_Lock();
return;
}
printf("FLASH Page %u erased successfully.n", Page);
// 3/4 將數(shù)據(jù)寫入指定地址
for (i = 0; i < L; i++)
{
if (HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, addr + 8 * i, Data[i]) != HAL_OK)
{
printf("Error: FLASH program failed at address 0x%08X.n", addr + 8 * i);
HAL_FLASH_Lock();
return;
}
}
printf("FLASH programming completed successfully.n");
// 4/4 鎖住 FLASH
HAL_FLASH_Lock();
}
/* FLASH 讀取并打印程序 */
void PrintFlashTest(uint32_t L, uint32_t addr)
{
uint32_t i = 0;
uint64_t data = 0;
printf("Reading FLASH data from address 0x%08X:n", addr);
for (i = 0; i < L; i++)
{
data = *(__IO uint64_t *)(addr + i * 8); // 按 64 位讀取數(shù)據(jù)
printf("Address: 0x%08X, Data: 0x%016llXn", addr + i * 8, data);
}
printf("FLASH read completed.n");
}
/* USER CODE END 4 */
測試 FLASH 寫入和讀取功能,分為兩次寫入操作,并在每次寫入后進行驗證。 ● 兩次寫入操作,分別測試不同數(shù)據(jù)的寫入和讀取。 ● 驗證寫入是否正確,通過讀取打印結(jié)果進行比對。
/* USER CODE BEGIN 2 */
printf("=== First Write and Read ===n");
WriteFlashTest(3,WriteFlashData,Page,addr);
PrintFlashTest(3,addr);//WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//數(shù)據(jù)
printf("n=== Modify Data and Rewrite ===n");
WriteFlashData[0]=0x9999;
WriteFlashData[1]=0x8888;
WriteFlashData[2]=0x7777;
WriteFlashTest(3,WriteFlashData,Page,addr);
PrintFlashTest(3,addr);
/* USER CODE END 2 */
演示
測試結(jié)果如下所示。

第一次寫入。

第二次寫入。

STM32CubeProgrammer讀取。

-
stm32cubemx
+關注
關注
5文章
287瀏覽量
16972
發(fā)布評論請先 登錄
STM32C011的芯片不能被IAR識別到,為什么?
采用cubemx將stm32c011的NRST引腳配置成ADC口,輸入一拉低就復位怎么解決?
轉(zhuǎn):STM32L011x/021x啟動模式注意事項
stm32 HAL庫Flash該如何去操作
STM32 Flash操作介紹
使用stm32f030c8t6進行flash操作報錯這是為什么
使用STM32C0輕松實現(xiàn)從8bit到32bit的平臺升級
STM32學習心得三十三:FLASH閃存編程原理與實驗
STM32F103:內(nèi)部Flash的讀寫
DS11100_STM32L011x3, STM32L011x4單片機數(shù)據(jù)手冊
MHMF011L1C3-操作手冊 - PANATERM Ver6.0 松下
STM32C011開發(fā)(1)----開發(fā)板測試
STM32C011開發(fā)(2)----nBOOT_SEL設置

STM32C011開發(fā)(3)----Flash操作
評論