打印
[应用相关]

串口连续接收同时写入FLASH数据不全

[复制链接]
2452|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
这个要做好数据接收和写入的时间控制

使用特权

评论回复
5
AdaMaYun| | 2024-6-24 22:14 | 只看该作者
通过串口助手直接把bin文件发到STM32并写入到APP_FLASH

使用特权

评论回复
6
丙丁先生| | 2024-6-25 08:34 | 只看该作者
从你的描述来看,问题可能出在串口接收数据的速度和Flash写入速度不匹配。当你降低波特率时,串口接收数据的速度变慢,因此可以写入更多的数据。但是,这并不意味着你的代码有问题。

为了解决这个问题,你可以尝试以下方法:

1. 增加缓冲区大小:将UART_BUF_SIZE的值增大,以便一次性接收更多的数据。这样可以减少接收数据的时间,提高写入Flash的速度。

2. 使用DMA传输:使用DMA(直接内存访问)传输可以减轻CPU的负担,提高数据传输速度。你可以使用STM32的DMA功能来实现这个目的。

3. 优化Flash写入算法:你可以尝试优化你的Flash写入算法,以减少写入时间。例如,你可以一次写入多个字节,而不是一个字节一个字节地写入。

4. 调整波特率:尝试使用不同的波特率进行通信,以找到一个合适的值,使得串口接收数据的速度和Flash写入速度相匹配。

希望这些建议能帮助你解决问题。

使用特权

评论回复
7
xch| | 2024-6-25 09:24 | 只看该作者
串口通信程序呢? 用啥接收模式

使用特权

评论回复
8
LOVEEVER| | 2024-6-25 19:16 | 只看该作者
串口连续接收同时写入FLASH数据是不是时序不对导致的问题

使用特权

评论回复
9
l63t89| | 2024-6-30 23:08 | 只看该作者
在串口接收数据后,使用了HAL_UART_Receive函数每次只接收4个字节,这可能导致数据接收速度慢,从而影响到写入Flash的效率。

使用特权

评论回复
10
l63t89| | 2024-6-30 23:08 | 只看该作者
推荐使用HAL_FLASH_Program_IT函数进行批量写入

使用特权

评论回复
11
l63t89| | 2024-6-30 23:08 | 只看该作者
使用HAL_FLASH_Program_IT等批量编程函数,按照Flash编程单位(字、半字或字节)进行批量写入,减少Flash编程操作的次数。

使用特权

评论回复
12
stormwind123| | 2024-7-1 17:05 | 只看该作者
可能是波特率设置不当

使用特权

评论回复
13
laocuo1142| | 2024-7-1 19:00 | 只看该作者
接收缓冲区大小不足

使用特权

评论回复
14
flycamelaaa| | 2024-7-1 20:00 | 只看该作者
如果没有设置超时机制,或者超时时间设置过短,也可能导致数据接收不完整。

使用特权

评论回复
15
powerantone| | 2024-7-1 21:00 | 只看该作者
调整波特率,或者增加接收缓冲区大小

使用特权

评论回复
16
stormwind123| | 2024-7-1 22:00 | 只看该作者
优化写入Flash的代码

使用特权

评论回复
17
dspmana| | 2024-7-4 19:43 | 只看该作者
FLASH写入操作的速度可能跟不上串口接收数据的速度,导致数据缓冲区溢出,进而丢失数据。

使用特权

评论回复
18
benjaminka| | 2024-7-4 21:17 | 只看该作者
降低串口的波特率可以减缓数据的接收速度,这样STM32就有足够的时间将接收到的数据写入FLASH。然而,这可能会增加数据传输的总时间。

使用特权

评论回复
19
linfelix| | 2024-7-7 14:09 | 只看该作者
处理串口接收和FLASH写入的程序逻辑中可能存在缺陷,如没有正确处理异常情况,或者写入操作没有正确检查状态等。

使用特权

评论回复
20
jkl21| | 2024-7-7 17:10 | 只看该作者
在FLASH写入操作完成后,检查写入状态,确保数据已经正确写入。如果有错误,可以重试写入操作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

3060

帖子

7

粉丝