uint8_t Write_ST_Flash(uint32_t addr, uint64_t* ptr, uint16_t ndword)
{
uint8_t page;
uint32_t PAGEError=0;
FLASH_EraseInitTypeDef EraseInitStruct;
/**不能超4K */
if(ndword > 512)
{
return 1;
}
/** 解锁FLASH寄存器 */
HAL_FLASH_Unlock();
/** 清除所有错误标志(如果不清除会导致写失败) */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
/** 计算用户编程地址在FLASH中哪个页(每页4K字节) */
/** 如果地址在Bank1则用下面这个公式计算页 */
page = (addr - FLASH_BASE) / FLASH_PAGE_SIZE;
/** 如果地址在Bank2则用下面这个公式计算页 */
// page = (addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; /* 擦除方式:页擦除 */
EraseInitStruct.Banks = FLASH_BANK_1; /* 擦除页所在的区域:BANK1 */
EraseInitStruct.Page = page; /* 擦除页的编号 */
EraseInitStruct.NbPages = 1; /* 擦除页的数量:1 */
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
/* error */
return 1;
}
for(uint16_t i=0; i<ndword; i++)
{
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, ptr[i]) == HAL_OK)
{
addr = addr + 8;
}
else
{
/* error */
return 1;
}
}
HAL_FLASH_Lock();
return 0;
}
————————————————
版权声明:本文为CSDN博主「学无-止境」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27718231/article/details/113076284
STM32L431内部flash读写 示例代码
最新推荐文章于 2024-03-30 16:29:37 发布