求助,stm32L151 cubemx写内部FLASH不正常
HAL_StatusTypeDef statu;FLASH_EraseInitTypeDef f;
uint32_tAddress=0x08010000;
uint32_tdata=0x12345678;
uint32_t PageError = 0;//set page error
HAL_FLASH_Unlock();//解锁
//erase flash
f.TypeErase = FLASH_TYPEERASE_PAGES;
f.PageAddress = Address;
f.NbPages = 1;
HAL_FLASHEx_Erase(&f, &PageError);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data);
HAL_FLASH_Lock();//锁
这个程序放在初始化里,是可以写成功的,如果放在主循环或者是外部触发的情况去写,就不成功,请大侠们帮我看看,是怎么回事?还是其它的设置不对?谢谢!!
看看循环里是不是有改变了初始化参数的现象 看上去没毛病呀!
主程序中用中断了吗?
听说开了中断后,在擦写Flash时,可能会出有意想不到问题。只是听说,没找到根据 楼主要尝试去读取HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data)这个函数的返回值是什么,靠这个进一步去判断。 程序看不出啥问题,单步调试能通过吗 谢谢各位的帮助
// 在某页面地址中写一个页面的数据,按字(uint32_t)写入
HAL_StatusTypeDefFlash_Write_aPage_Words(uint32_t pageaddr, uint32_t *words)
{
uint32_t i, addrbuf, page_no, page_start_addr;
uint32_t PageError = 0;
FLASH_EraseInitTypeDefEraseInitStruct;
HAL_StatusTypeDef retvalue;
page_no = pageaddr / FLASH_PAGE_SIZE; // 计算该地址处于哪个页面
page_start_addr= page_no* FLASH_PAGE_SIZE; // 页面开始地址,按字节计算
HAL_FLASH_Unlock();
// 擦除该页面
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = page_start_addr;
EraseInitStruct.NbPages = 1;
PageError = 0;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
retvalue = HAL_ERROR; // 页面擦除失败 ,退出
}
else
{ // 页面擦除成功,写入该页面的数据
retvalue = HAL_OK;
addrbuf= page_start_addr;
for(i=0;i<FLASH_PAGE_SIZE_IN_WORD;i++) // 一个页面按字节算为64个单元
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addrbuf, words) == HAL_OK)
{
addrbuf += 4;
}
else
{
retvalue = HAL_ERROR;
i = FLASH_PAGE_SIZE_IN_WORD;
}
}
}
HAL_FLASH_Lock();
returnretvalue;
} 初始化的时候没有问题,在没有进入主循环之前我尝试多次进行读写,都没问题,但是一旦进入主循环,就不行了,在各位大牛的帮助提示下,发现是擦除出现问题了,FLASH_FLAG_WRPERR,提示为写保护标志出错,我所有中断都关掉,还是会出现这个问题,干脆忽略这个错误,强行擦除,又正常,
status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); 应该是哪儿没有配置对?
说明你的flash有在被操作.其实最大可能就是systick.flash是独占式的,如果timeout,那就是有可能被占了,建议调试看看
页:
[1]