/*核心点是hal库调用这个全局变量的标志位使能后没有清除,每次进入检查标志位直接返回HAL_BUSY,手动处理清除一下标志然后就可以正常运行擦除函数。 */

感觉应该这是这个库的BUG。能用就好。

void WriteFlash(uint32_t addr,uint32_t *Data,uint32_t L)
{
	uint32_t i=0;

	HAL_FLASH_Unlock();
	
	FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
	FLASH_EraseInitTypeDef FlashSet;
	FlashSet.TypeErase = FLASH_TYPEERASE_PAGEERASE;
	FlashSet.PageAddress = addr;
	FlashSet.NbPages = 1;
	uint32_t PageError = 0;
	__HAL_UNLOCK(&pFlash);      /*核心点是hal库调用这个标志位使能后没有清除,每次进入检查标志位直接返回HAL_BUSY,手动处理一下就可以了 */
	
	int ret = HAL_FLASHEx_Erase(&FlashSet, &PageError);

	if(ret != HAL_OK) {
		printf("Erase Error[%d]\n",ret);
	}
	for(i=0;i<L;i++) {
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, addr+4*i, &Data[i]);
	}
	HAL_FLASH_Lock();
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐