[求助]CH592读取FLASH并串口输出问题

技术交流群没人理,还是使用论坛罢。

使用如下代码:

 FLASH_ROM_READ(0x00036000, version, 2);

UART0_SendByte(version[1]);
这样来读取两个字节,输出第二个字节。

是在TMOS系统框架下运行的。为一个事件的一部分。

现在的问题是:

第一次串口接收指令,读取地址的flash,但是没有在串口有输出,此时接收其他指令,该串口有输出那条指令对应的内容,然后再接收flash的指令,就可以读取并串口输出了。这样一次之后就可以一直读取并输出了。但是重新上电就又不行了,又要重新操作一遍。目前感觉是TMOS直接无视了第一次的flash读取串口输出,没有任何调试信息打印。

提问

1、flash读取是否需要初始化?

2、是flash读取时间较慢导致TMOS阻塞了吗(有试过读取flash后延迟5ms再串口输出但还是不行)?

会不会是flash不支持按字读取需要对齐?


注意codeflash要4字节对齐操作。
FLASH_ROM_READ(0x00036000, version, 2);”
这样调用,读取长度为“2”而非“4”,会比预期多读出2个字节,填到version数组后面的version[2] version[3]中,可能越界访问导致异常。

"第一次串口接收指令,读取地址的flash,但是没有在串口有输出"
这个现象不太正常。即使有一点不规范,也是可以读到数据的。UART0_SendByte(version[1]);所在的TMOS事件可以执行到吗?事件的安排是否异常。


1、flash读取是否需要初始化?

不用初始化。

2、是flash读取时间较慢导致TMOS阻塞了吗(有试过读取flash后延迟5ms再串口输出但还是不行)?

操作flash本身即是阻塞操作,操作大面积的flash是有可能导致其他TMOS事件延迟的。只读取4个字节只占用ms级别的时间开销,一般影响不大。

沁恒risc-v蓝牙芯片的flash使用注意点 - JayWell - 博客园


感谢解答,

已了解flash相关使用规范;

已解决串口输出问题,系接收解析逻辑有误,数据长度正好是FIFO的整数倍且未判断出包尾,导致既没有因为超时而触发超市中断置位,也没有因为未到达触发点而触发中断置位,于是命令未及时动作导致没有清空数组,而每次只读取第一条命令导致出现了串口阻塞的假象,其实功能正常。


还有一个小小的问题,

因为找不到FLASH_EEPROM_CMD( uint8_t cmd, uint32_t StartAddr, void *Buffer, uint32_t Length );的函数具体内容,想知道函数内进行flash操作时有无禁用中断,如果禁用了那可以减少代码复杂度,如果没禁用,为确保长字节4K写入无误,需要禁用中断。因为没看到例程有禁用所以问一下,虽然例程也没开中断而且写的字节也不长就是了。


只有登录才能回复,可以选择微信账号登录