完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用STM32G0B1写内部的Flash时出现问题,代码:
#pragma arm section code = "RAMCODE" uint32_t NorFlash_Write_ttu(uint16_t operateCmd, uint32_t startAddr, uint32_t * pPageDatas, uint16_t datasLen) { uint16_t writeCount = datasLen / 8; //因为datasLen传入的长度是固定1024(按byte算的),而实际写Flash是按64字节写入的,所以这里转换为uint64_t类型时的长度 uint16_t i; uint8_t retry = 3; HAL_StatusTypeDef status = HAL_OK; // 清除Flash待处理标识 //__HAL_FLASH_CLEAR_FLAG(HAL_FLASH_GetError()); // 解锁Flash写 HAL_FLASH_Unlock(); // 检查BUSY状态 do { status = FLASH_WaitForLastOperation(10); if((HAL_ERROR == status) || (--retry == 0)) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } }while(HAL_TIMEOUT == status); // 擦除将要写入的地址页 if(operateCmd 0x0002) //设标志判断是否需要擦除 { FLASH_PageErase(FLASH_BANK_1, (startAddr - NORFLASH_START_ADDRESS) / NORFLASH_PAGE_SIZE); retry = 3; do { status = FLASH_WaitForLastOperation(10); if((HAL_ERROR == status) || (--retry == 0)) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } }while(HAL_TIMEOUT == status); // 注:擦除完成后控制寄存器(CR寄存器)的擦除使能位(PER位)不会自动清除,需要手动清除 CLEAR_BIT(FLASH->CR, FLASH_CR_PER); } // 写入数据 for(i = 0; i < writeCount; ++i) { // 写入Flash,注意写入时是64位写入,i*2是因为pPageDatas是uint32_t类型(为了代码兼容) if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, startAddr + i * 8, *(uint64_t *)(pPageDatas+i*2)) != HAL_OK) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } } // 加锁FLASH HAL_FLASH_Lock(); // 判断写入结果 return HAL_OK; } #pragma arm section 遇到的问题是,基于nucleo-g0b1re开发板,新建的工程实现这个写flash操作和一个串口输出log,每次起来后在HAL_FLASH_Unlock()之后,状态寄存器(SR)都会置位0x000000A0,即PGA编程对齐错误和PGSERR编程顺序错误;另外unlock()之后的FLASH_WaitForLastOperation()中清除SR寄存器语句之后,会置位成0x00040000,即CFGBSY 编程或擦除配置繁忙位置1,所以把HAL_FLASH_Lock()屏蔽了,执行这个会导致程序hard_fault 有在HAL_Init()和SystemClock_Config()处加断点查看SR寄存器,此时就已经是0x000400A0。有怀疑芯片坏了,但换芯片后仍旧有问题。 求教如何解决,或相关的代码 |
|
相关推荐
1个回答
|
|
1. 锁定状态:如果FLASH被锁定了,无法进行写操作,需要先解锁。
2. 时钟问题:确保系统时钟和FLASH控制器时钟配置正确,以便正确操作FLASH。 3. 编程算法错误:使用错误的编程算法可能导致无法写入FLASH。确保使用正确的编程算法,例如使用HAL库提供的编程函数。 4. 访问权限错误:如果没有正确配置FLASH访问权限,可能导致写操作失败。确保正确配置FLASH的读写权限。 5. 电源供应问题:如果电压不稳定或电源噪声大,可能导致FLASH写入失败。确保提供稳定的电源供应。 6. 硬件连接问题:检查是否正确连接了FLASH引脚,包括VCC、GND、读写控制引脚、数据线等。 7. 地址错误:确保写入的地址范围正确,并且没有超出FLASH的有效地址范围。 8. 软件错误:检查代码逻辑是否正确,是否有其他操作导致FLASH写入失败。 如果以上方法都无法解决问题,建议参考STM32G0系列的参考手册和相关文档,查找更具体的解决方法。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1632 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1559 浏览 1 评论
985 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1605 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
540浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
512浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 17:47 , Processed in 0.618174 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号