[应用相关] 串口连续接收同时写入FLASH数据不全

[复制链接]
4264|46
 楼主| elephant00 发表于 2024-6-24 09:57 | 显示全部楼层 |阅读模式
在学习写一个Bootloader的过程中,想要通过串口助手直接把bin文件发到STM32并写入到APP_FLASH。

35kB的bin文件,只能成功写入十几个字节,还每次都不一样多。
把波特率从115200降低到9600时能写入6kB数据,继续降低到2400时能写入7kB数据到Flash。
还请大佬指教~

                    userapplen =0;
                    timeout = HAL_MAX_DELAY;
                    /* Clean the input path */
                    __HAL_UART_FLUSH_DRREGISTER(&huart1);
                uint32_t data32[UART_BUF_SIZE / 4];
                HAL_StatusTypeDef state;
                HAL_FLASH_Unlock();
                    while(1)
                    {
                            state = HAL_UART_Receive(&huart1, uart_buf, 4, 5000);
                            memcpy(data32, uart_buf, 4);
                            // 关闭总中断
                            __disable_irq();
                            // 写Flash
                            HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, APPLICATION_ADDRESS + userapplen, data32[0]);
                            printf("Programming\r\n");
                            // 开启总中断
                            __enable_irq();
                            if(state != HAL_OK)
                            {
                                    HAL_FLASH_Lock();
                                    printf("Programming completed Successfully! %ldBtye\r\n", userapplen += huart1.RxXferCount);
                                    break;
                            }
                            userapplen += 4;
                    }
LcwSwust 发表于 2024-6-24 11:55 | 显示全部楼层
你觉得printf耗时多长?这期间有没有在接收数据?收到的数据当你要处理时还在不在?
coody 发表于 2024-6-24 14:50 | 显示全部楼层
接收与写入速度不同导致,要求接收速度慢于写入速度。
这种应用应该使用应答式,接收一帧,写入完成后,应答,对方发下一帧。
呐咯密密 发表于 2024-6-24 16:13 | 显示全部楼层
这个要做好数据接收和写入的时间控制
AdaMaYun 发表于 2024-6-24 22:14 | 显示全部楼层
通过串口助手直接把bin文件发到STM32并写入到APP_FLASH
xch 发表于 2024-6-25 09:24 | 显示全部楼层
串口通信程序呢? 用啥接收模式
LOVEEVER 发表于 2024-6-25 19:16 | 显示全部楼层
串口连续接收同时写入FLASH数据是不是时序不对导致的问题
l63t89 发表于 2024-6-30 23:08 | 显示全部楼层
在串口接收数据后,使用了HAL_UART_Receive函数每次只接收4个字节,这可能导致数据接收速度慢,从而影响到写入Flash的效率。
l63t89 发表于 2024-6-30 23:08 | 显示全部楼层
推荐使用HAL_FLASH_Program_IT函数进行批量写入
l63t89 发表于 2024-6-30 23:08 | 显示全部楼层
使用HAL_FLASH_Program_IT等批量编程函数,按照Flash编程单位(字、半字或字节)进行批量写入,减少Flash编程操作的次数。
stormwind123 发表于 2024-7-1 17:05 | 显示全部楼层
可能是波特率设置不当
laocuo1142 发表于 2024-7-1 19:00 | 显示全部楼层
接收缓冲区大小不足
flycamelaaa 发表于 2024-7-1 20:00 | 显示全部楼层
如果没有设置超时机制,或者超时时间设置过短,也可能导致数据接收不完整。
powerantone 发表于 2024-7-1 21:00 | 显示全部楼层
调整波特率,或者增加接收缓冲区大小
stormwind123 发表于 2024-7-1 22:00 | 显示全部楼层
优化写入Flash的代码
dspmana 发表于 2024-7-4 19:43 | 显示全部楼层
FLASH写入操作的速度可能跟不上串口接收数据的速度,导致数据缓冲区溢出,进而丢失数据。
benjaminka 发表于 2024-7-4 21:17 | 显示全部楼层
降低串口的波特率可以减缓数据的接收速度,这样STM32就有足够的时间将接收到的数据写入FLASH。然而,这可能会增加数据传输的总时间。
linfelix 发表于 2024-7-7 14:09 | 显示全部楼层
处理串口接收和FLASH写入的程序逻辑中可能存在缺陷,如没有正确处理异常情况,或者写入操作没有正确检查状态等。
jkl21 发表于 2024-7-7 17:10 | 显示全部楼层
在FLASH写入操作完成后,检查写入状态,确保数据已经正确写入。如果有错误,可以重试写入操作。
wengh2016 发表于 2024-7-9 21:03 | 显示全部楼层
FLASH写入操作具有一定的延迟,可能导致在写入过程中丢失部分数据。为了解决这个问题,可以在写入FLASH之前先将数据暂存到RAM中,然后在FLASH写入完成后,再将数据从RAM中搬移到FLASH。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1031

主题

3946

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部