單片機內部flash讀寫


1、自定義工程名稱。
2、選擇英文路徑,否則會丟 失啟動文件而無法編譯通過, 需要手動添加啟動文件: startup_stm32l431xx.s
3、選擇MDK-ARM V5開發軟件, 即KEIL5軟件

代碼編寫說明
1、按鍵KEY1按下時,把數據寫入MCU的flash
2、按鍵KEY2按下時,把寫入MCU的flash數據並讀取出來,打印數據。
調用函數:
1、HAL_FLASH_Unlock(void);//解鎖
2、FLASH_EraseInitTypeDef FLASH_EraseInitSturcture;//配置需要擦除的參數
3、HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef pEraseInit, uint32_tPageError);//擦除
4、HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);//寫數據到flash
5、HAL_FLASH_Lock(void);//鎖住
6、HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//檢測按鍵
7、void HAL_Delay(uint32_t Delay);//延時
8、HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//點亮和熄滅LED
9、uint8_t OneWord=(__IO uint32_t)addr;//讀取地址數據
10、printf();//打印數據到串口函數 需要重新定義函數fputc();才能正常使用printf();
int fputc(int ch,FILE*f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return HAL_OK;
}

代碼編寫說明
• FLASH讀寫流程:
1、對FLASH寫入數據流程:
1)解鎖FLASH:調用HAL_FLASH_Unlock(void);
2)擦除FLASH:調用HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef pEraseInit, uint32_t PageError);
3)寫入數據到FLASH:調用HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
4)鎖住FLASH:調用HAL_FLASH_Lock(void);
2、FLASH讀取數據流程 直接讀取相應的FLASH地址即可:通過(__IO uint32_t)ADDR讀取該地址數據

代碼編寫實現
#define strLen sizeof(strWriteToFlash1)/sizeof(uint8_t) //寫入數據的長度
#define ADDR 0x0803f800 //寫地址
寫入FLASH數據:

void writeflash(int addr, uint32_t* writeFlashData)
{
uint32_t PageError = 0;
int i=0; HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef f;
f.Banks=1;
f.NbPages=1;
f.Page=255;
f.TypeErase=0;
HAL_FLASHEx_Erase(&f,&PageError);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,addr,writeFlashData[i]);
HAL_FLASH_Lock();
}

代碼編寫實現
while(1)循環內程序:

if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
{
printf("KEY1 Press\r\n");
writeflash(ADDR,(uint32_t*)&writeFlashData);//擦除並寫入數據 HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//LED電平翻轉
}
}
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)
{
printf("KEY2 Press\r\n"); ReadFlashData(ADDR,sizeof(writeFlashData),R_OldFlash);//讀取寫入的數據
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); //LED電平翻轉 }}
```
**讀取FLASH數據**:
`void ReadFlashData(int addr,uint32_t strSize,uint8_t* ReadData)
{
uint8_t OneWord; for(int i=0;i<strSize;i++)
{
OneWord=*(__IO uint32_t*)addr;
ReadData[i]=OneWord;
addr++;
}
printf("Read the flash data:>>%s<<,address:%x\r\n",ReadData,addr-strSize);// 顯示該地址的數據
}`
**擴展實驗**:將移植flash.c,該文件有實現寫數 據到FLASH的多種方式,如寫字符串數據到 FLASH等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM