完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,我现在遇到FLASH写入的问题,我使用的是HAL库。 1、正常写入,整bank擦除,能够成功写入flash 2、写入后卡死,擦除几个page,无法写入,并且程序卡死 以下为卡死的代码: /* Unlock the Flash to enable the flash control register access *************/ HAL_FLASH_Unlock(); /* Erase the user Flash area (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ /* Get the 1st page to erase */ FirstPage = GetPage(ADDR_FLASH_PAGE_500); /* Get the number of pages to erase from 1st page */ NbOfPages = GetPage(ADDR_FLASH_PAGE_501) - FirstPage + 1; /* Get the bank */ BankNumber = GetBank(ADDR_FLASH_PAGE_500); /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.Banks = BankNumber; EraseInitStruct.Page = FirstPage; EraseInitStruct.NbPages = NbOfPages; if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) { printf("Erase errorrn"); } else { // printf("Erase OKrn"); } -------------------------------------------------------------------------------------------------------- 写入 Address = ((uint32_t)ADDR_FLASH_PAGE_500); status = FLASH_If_Write(Address, (uint32_t*) ramsource, 512 / 4); ------------------------------------------------------------------------------------------------------- 摘抄部分写入函数:卡死在这里 uint32_t FLASH_If_Write(uint32_t destination, uint32_t *p_source, uint32_t length) { uint32_t status = FLASHIF_OK; uint32_t bank_to_erase, error = 0; uint32_t i = 0; uint32_t bank_active =0; uint8_t retry=0; FLASH_EraseInitTypeDef pEraseInit; //----------------------------------卡死在这里----------------------这里就卡主了-----------------------程序无法运行下去 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, destination, *((uint64_t *)(p_source + 2*i))) == HAL_OK) { printf("HAL_FLASH_Program HAL_OK rn"); } -------------------------------------------------------------------------------------------------------------------------------------- 请问下大家,为什么整个bank擦除能用,擦除几页就不能用? |
|
相关推荐
1 条评论
12个回答
|
|
楼主,你写flash时,是不是没设临界段啊?这样也会造成卡死。
|
|
|
|
还有一个可能就是FLASH擦除期间,必须禁止数据fetch。请楼主自查程序
|
|
|
|
如果擦除整个可以写,可以考虑一下写入的地址不再擦除页的范围之内。
|
|
|
|
自己看下地址,是不是溢出了
|
|
|
|
可以在程序中把flash的Page固定死,一个一个的擦除,每擦除一个修改程序重新擦除,可以定位到擦除哪一个页出问题,然后看看这页是否溢出。
|
|
|
|
你好!感谢你的回复,目前没有设置临界段。但是应该不影响,我只写512字节就停止,后面lock之后就是while(1)。应该不会出临界段。 |
|
|
|
flash擦除的时候没有注意fetch问题,因为测试内容比较单一,只有flash擦除,所以应该不会有fetch打断。 |
|
|
|
你好,我擦除和写入的都是第500页。可以确定写入的flash已经擦除过了。 |
|
|
|
你好,我现在测试的地址是第500页,我现在的STM32L476是由512页的。没有溢出 |
|
|
|
你好!我测试了擦除单页,并写入单页。同样的结果。擦除成功,但是写入时卡死。下面是测试结果: --------------------------------------------------------------- FirstPage = 240 NbOfPages = 1 Erase OK, BankNumber = 1 destination = 0x8078000 source = 0x3020100 FLASH->SR = 0x0 后面本应该反馈flash_program成功或者失败,但是程序卡死,不往下运行了。 |
|
|
|
首先,写入的地址为什么是页地址?没看到在哪转换为Flash地址啊
Address = ((uint32_t)ADDR_FLASH_PAGE_500); status = FLASH_If_Write(Address, (uint32_t*) ramsource, 512 / 4); 其次,你要写入的是一串数据,但没看到你调用for循环之类的 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, destination, *((uint64_t *)(p_source + 2*i))) == HAL_OK) { printf("HAL_FLASH_Program HAL_OK rn"); } |
|
|
|
擦除之前要解锁,写完以后要加锁
// 擦除该页面 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 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addrbuf, DataBuf) == HAL_OK) { addrbuf += 4; } else { retvalue = HAL_ERROR; i = FLASH_PAGE_SIZE_IN_WORD; } } } HAL_FLASH_Lock(); return retvalue; |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
621 浏览 1 评论
1962 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1068 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1487 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1924 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 18:30 , Processed in 0.670534 second(s), Total 65, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号