完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#define FLASH_POWERDATA_ADDR ((uint32_t)0x0800E000)
void Save_ConfigData(void) { FLASH_Unlock_Fast(); FLASH_ErasePage_Fast(FLASH_POWERDATA_ADDR); FLASH_BufReset(); FLASH_BufLoad(FLASH_POWERDATA_ADDR, (u32)ConfigInfo.iMaxVoltage, (u32)ConfigInfo.iMaxCurrent, (u32)ConfigInfo.itime1, (u32)ConfigInfo.iTime2); FLASH_ProgramPage_Fast(FLASH_POWERDATA_ADDR); FLASH_Lock_Fast(); } void Read_ConfigData(void) { ConfigInfo.iMaxVoltage = *(u32 *)(FLASH_POWERDATA_ADDR); ConfigInfo.iMaxCurrent = *(u32 *)(FLASH_POWERDATA_ADDR+0x04); ConfigInfo.iTime1 = *(u32 *)(FLASH_POWERDATA_ADDR+0x08); ConfigInfo.iTime2 = *(u32 *)(FLASH_POWERDATA_ADDR+0x0C); if(0xFFFF == ConfigInfo.iMaxVoltage) { InitPowerInfo(); Save_ConfigData(); } } 一共就这几行代码,每次Read出来都是0XFFFF。 有没有跟ST-LINK Utility类似的工具啊,可以外部读取Flash内容,从而先确定是没写进去,还是读出问题了啊,函数接口又都是void类型,完全不知道问题出在哪里。 |
|
相关推荐
5个回答
|
|
|
您好,若你需要读取FLASH的存储内容,只需要读对应的地址就可以了。附件为CH32V103 FLASH读操作例程,你可以参考下。注意下,若你在读之前有解除读保护操作,且解除之后并没有写入,那读出来就会是0xFFFF。
|
|
|
|
|
|
|
|
|
|
|
|
您好,若你是FLASH写入出现问题,当采用快速编程方式时,需要先执行快速编程模式解锁操作,然后再进行操作,如下图。具体可参考我们手册闪存操作流程和EVT FLASH例程。
CH32V103应用手册:http://www.wch.cn/downloads/CH32xRM_PDF.html CH32V103EVT例程:http://www.wch.cn/downloads/CH32V103EVT_ZIP.html |
|
|
|
|
|
我用demo代码,没问题。
然后用自己的代码,就不行了。 用到了ADC-DMA中断, 外部中断,Freertos. EXTI0_IRQHandler中调用的Flash写入,为了排除是不是中断函数里不能读写Flash。 我把代码加在Main中了 main读了Flash,不过出来全部是0xFF。 随后执行写入操作(标准写,不是Fast)。 这时候暂停代码,发现停止在 FLASH_WaitForLastOperation函数入口。 void Read_ConfigData(void){ ConfigInfo.iMaxVoltage = *(__IO uint16_t *)(FLASH_POWERDATA_ADDR); ConfigInfo.iMaxCurrent = *(__IO uint16_t *)(FLASH_POWERDATA_ADDR+0x04); ConfigInfo.iTime1 = *(__IO uint16_t *)(FLASH_POWERDATA_ADDR+0x08); ConfigInfo.iTime2 = *(__IO uint16_t *)(FLASH_POWERDATA_ADDR+0x0C); ConfigInfo.iAutoTime = *(__IO uint16_t *)(FLASH_POWERDATA_ADDR+0x10); ConfigInfo.iInterval= *(__IO uint16_t *)(FLASH_POWERDATA_ADDR+0x014); if(0xFFFF == ConfigInfo.iMaxVoltage) { InitPowerInfo(); Save_ConfigData(); }} void Save_ConfigData(void){ /*FLASH_Unlock_Fast(); FLASH_ErasePage_Fast(FLASH_POWERDATA_ADDR); FLASH_BufReset(); FLASH_BufLoad(FLASH_POWERDATA_ADDR, (u32)ConfigInfo.iMaxVoltage, (u32)ConfigInfo.iMaxCurrent, (u32)ConfigInfo.iTime1, (u32)ConfigInfo.iTime2); FLASH_ProgramPage_Fast(FLASH_POWERDATA_ADDR); FLASH_Lock_Fast();*/ volatile FLASH_Status FLASHStatus = FLASH_COMPLETE; volatile TestStatus MemoryEraseStatus = PASSED; uint32_t EraseCounter = 0x0, Address = 0x0; uint32_t WRPR_Value = 0xFFFFFFFF; uint32_t NbrOfPage; __disable_irq(); FLASH_Unlock(); WRPR_Value = FLASH_GetWriteProtectionOptionByte(); NbrOfPage = (PAGE_WRITE_END_ADDR - FLASH_POWERDATA_ADDR) / FLASH_PAGE_SIZE; if((WRPR_Value & FLASH_PAGES_TO_BE_PROTECTED) != 0x00) { FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++) { FLASHStatus = FLASH_ErasePage(FLASH_POWERDATA_ADDR + (FLASH_PAGE_SIZE * EraseCounter)); if(FLASHStatus != FLASH_COMPLETE) { printf("FLASH Erase ERR at Page%drn", EraseCounter + 60); } printf("FLASH Erase Page%d...rn", EraseCounter + 60); } Address = FLASH_POWERDATA_ADDR; while((Address < PAGE_WRITE_END_ADDR) && (MemoryEraseStatus != FAILED)) { if((*(__IO uint16_t *)Address) != 0xFFFF) { MemoryEraseStatus = FAILED; } Address += 2; } if(MemoryEraseStatus == FAILED) { printf("Erase Flash FAIL!rn"); printf("rn"); } else { printf("Erase Flash PASS!rn"); } Address = FLASH_POWERDATA_ADDR; //while((Address < PAGE_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE)) FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iMaxVoltage); Address = Address + 2; FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iMaxCurrent); Address = Address + 2; FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iTime1); Address = Address + 2; FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iTime2); Address = Address + 2; FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iAutoTime); Address = Address + 2; FLASHStatus = FLASH_ProgramHalfWord(Address, ConfigInfo.iInterval); Address = Address + 2; while((Address < PAGE_WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE)) { FLASHStatus = FLASH_ProgramHalfWord(Address, 0xAA); } /* Address = PAGE_WRITE_START_ADDR; while((Address < PAGE_WRITE_END_ADDR) && (MemoryProgramStatus != FAILED)) { if((*(__IO uint16_t *)Address) != Data) { MemoryProgramStatus = FAILED; } Address += 2; } if(MemoryProgramStatus == FAILED) { printf("Memory Program FAIL!rn"); } else { printf("Memory Program PASS!rn"); } */ } FLASH_Lock(); __enable_irq();} |
|
|
|
|
|
您好,我们FLASH标准库函数中有多处调用到FLASH_WaitForLastOperation这个函数,你可以通过打印调试的方式看程序具体是停止在哪个函数里了
|
|
|
|
|
只有小组成员才能发言,加入小组>>
326 浏览 0 评论
CH582M HOST发送数到设备后,提交IN一直是2A是什么问题?
848 浏览 0 评论
1452 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
3413 浏览 2 评论
2820 浏览 1 评论
安卓手机支持外接otg扩展坞 然后使用ch340+ch9329控制电脑吗
1808浏览 1评论
1459浏览 1评论
343浏览 0评论
CH582M HOST发送数到设备后,提交IN一直是2A是什么问题?
860浏览 0评论
467浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:24 , Processed in 0.853274 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1295