1 MCU 片内Flash 读写
REF:
https://blog.csdn.net/oJianZhiTianYa1/article/details/45393217
https://blog.csdn.net/jingling122/article/details/100898806
https://blog.csdn.net/cym_anhui/article/details/88958188
https://blog.csdn.net/weixin_41294615/article/details/87610039
https://blog.csdn.net/weixin_30871701/article/details/95371971
https://blog.csdn.net/sunyiming537/article/details/8189022/
2 下图是Flash写的过程:
3 下图是Flash页擦除过程:
4 下图为Flash全擦除过程
5 code添加
编译环境
1 MDK-5.26
2 STM32CUBEMX 5.6.0
main.c文件加入
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//int fputc(int ch, FILE *f)
//{
// HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
// return ch;
//}
uint32_t WriteFlashData = 0x12345678;
uint32_t addr = 0x08003000;
/*FLASH写入程序*/
void writeFlashTest(void)
{
/* 1/4解锁FLASH*/
HAL_FLASH_Unlock();
/* 2/4擦除FLASH*/
/*初始化FLASH_EraseInitTypeDef*/
/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
/*擦除页数*/
/*擦除地址*/
FLASH_EraseInitTypeDef FlashSet;
FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
FlashSet.PageAddress = addr;
FlashSet.NbPages = 1;
/*设置PageError,调用擦除函数*/
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&FlashSet, &PageError);
/* 3/4对FLASH烧写*/
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, WriteFlashData);
/* 4/4锁住FLASH*/
HAL_FLASH_Lock();
}
/*FLASH读取打印程序*/
void printFlashTest(void)
{
uint32_t temp = *(__IO uint32_t*)(addr);
printf("addr is:0x%x, data is:0x%x\r\n", addr, temp);
}
/* USER CODE END 0 */
在main函数中添加如下code来测试读写。
/*Flash TEST*/
WriteFlashData = 0x12345678;
writeFlashTest();
printFlashTest();
WriteFlashData = 0x87654321;
writeFlashTest();
printFlashTest();
6 测试:
//==========================Add Flash===============================================
uint32_t WriteFlashData = 0x12345678;
uint32_t addr = 0x08001000;
/*
*********FLASH写入程序********************
*/
void writeFlashTest(void)
{
/* 1/4解锁FLASH*/
HAL_FLASH_Unlock();
/* 2/4擦除FLASH*/
/*初始化FLASH_EraseInitTypeDef*/
/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
/*擦除页数*/
/*擦除地址*/
FLASH_EraseInitTypeDef FlashSet;
FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
FlashSet.PageAddress = addr;
FlashSet.NbPages = 1;
/*设置PageError,调用擦除函数*/
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&FlashSet, &PageError);
/* 3/4对FLASH烧写*/
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, WriteFlashData);
/* 4/4锁住FLASH*/
HAL_FLASH_Lock();
}
/*FLASH读取打印程序*/
void printFlashTest(void)
{
uint32_t temp = *(__IO uint32_t*)(addr);
printf("addr is:0x%x, data is:0x%x\r\n", addr, temp);
}
void writeFlashTest_1(uint32_t addr,uint32_t WriteFlashData)
{
/* 1/4解锁FLASH*/
HAL_FLASH_Unlock();
/* 2/4擦除FLASH*/
/*初始化FLASH_EraseInitTypeDef*/
/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
/*擦除页数*/
/*擦除地址*/
FLASH_EraseInitTypeDef FlashSet;
FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
FlashSet.PageAddress = addr;
FlashSet.NbPages = 1;
/*设置PageError,调用擦除函数*/
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&FlashSet, &PageError);
/* 3/4对FLASH烧写*/
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, WriteFlashData);
/* 4/4锁住FLASH*/
HAL_FLASH_Lock();
}
/*FLASH读取打印程序*/
void printFlashTest_1(uint32_t addr)
{
uint32_t temp = *(__IO uint32_t*)(addr);
printf("addr is:0x%x, data is:0x%X\r\n", addr, temp);
}
//===============================================================