本帖最后由 logan0279 于 2023-3-3 16:39 编辑
----------------------230303更新二-----------------------
问题二经与官方技术人员沟通,提供更新的ch32v10x_flash.c文件替换原工程文件后解决。
----------------------230303更新--------------------------
经评论指出,之前描述的问题一,是本人疏忽导致的理解有误。RTC_Init()函数调用Delay延时,所以Delay_Init须在RTC_Init之前。
之前描述的问题二,经过这两天的反复测试,问题可以稳定复现,复现过程如下:
新建一个工程,新建有关FLASH操作的文件,该文件包含两个函数,一个向指定地址写数据,一个读取指定地址数据,两个函数均严格按照官方例程编写。
在main.c文件中,调用读数据函数先读一次数据,再写入数据,然后再读数据验证写数据是否成功时,使用printf打印出的数据会是写入之前的0xFF。
最近在学习CH32V103C8T6,遇见两个十分奇怪的问题。
问题一:RTC启用LSE时,如果直接参照官方的例程,使用RTC_Init(),则RTC初始化不会成功。一开始以为是电容不对,更换了多个容值的电容都不行。后来在RTC_Init()函数前,添加官方例程的Delay_Init()后,RTC功能便可以正常使用。如果将Delay_Init()注释掉,则RTC又会失败。
问题二:通过USART通讯向FLASH写入数据,写数据后完成立即读取数据,验证写数据是否成功,若成功则向上位机返回写成功信息。奇怪的是,上位机下发写数据指令后,收不到从机返回的信息,使用读从机信息的指令可以发现改数据是成功的。于是在写完数据后马上读出相应地址的数据发送给上位机,发现写完数据后马上读出的数据尽然是写之前的数据。在OLED显示界面调出读该地址数据,显示的数据也是改之后的。只有在写完数据之后,马上去相应地址读数据会读出来写之前的数据。
曾以为是延时问题,在写数据后添加一个1S的延时,再去读数据,依然是写之前的数据。此时,去OLED界面读相同地址的数据,显示的却是写入的新数据。
问题二的解决办法是在写数据的函数末尾,添加一段OLED显示字符的代码。上位机再发送写数据指令之后,从机便可以正常返回写成功的信息了。更新:问题二的在写FLASH的函数加上一句读FLASH的代码(读数据的地址与写数据的地址不能相同),也可正常工作了。
|