问题:
该问题客户提出,发生在STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了STM32 片上Flash 模拟了一个EEPROM 的功能,用于存贮数据。在软件调试时,发现开启此功能,会影响到USART 通信,导致偶尔发生个别数据接收不到的现象。
调研:
检查其软件代码,发现其中对Flash 上数据的更新操作分为如下几个步骤:
1. 保存Flash 页上的数到RAM 中;
2. 擦除Flash 页;
3. 修改RAM 中的数据;
4. 将RAM 中的数据写回Flash 页上;
对照STM32 的数据手册,查找到相关的数据:
1. 字写入时间 40uS ~ 70uS;
2. 页擦除时间 40mS;
检查软件代码,找到对USART 的设置:
1. 波特率115200BPS;
2. 帧格式为 1 个起始位,8 个数据位,2 个停止位;
检查软件代码,发现其对USART 的接收数据采用中断的方式进行读取。
结论:
通过计算,USART 的每个字节帧的传输时间为:该时间大于Flash 的字写入时间,小于Flash 的页擦除时间。所以,在Flash 页擦除期间有可能发生多次字节帧的传输。而在此其间,由于Flash 接口不可用,CPU 不能取指令,导致中断得不到及时响应,从而发生接收到的数据未及时读走而被覆盖的现象。
处理:
在内存中建立循环缓冲区,开启 DMA 通道。一旦 USART 有数据接收到,由 DMA 负责将其传输至循环缓冲区中。软件定期检测循环缓冲区中是否有接收到的数据,如果有则加以处理。