完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先,我很抱歉我无法提供代码,因为我能够重现此问题的一切都是专有的。鉴于此,我正在寻找高级调试技术来诊断 UART 中断触发的这种间歇性故障。
总体问题是,我们注意到该设备似乎一次“丢弃”数十个字节,这似乎是由于 UART Rx 中断没有触发,即使在 UART 线上点击显示数据到达。 相关设备和设置的概述: 我正在使用运行运行 Keil RTX 的 STM32L152 的旧设备。所有逻辑电平均为 3.3V,UART 时钟频率为 16MHz,系统时钟为 32MHz,波特率为 115200。UART Rx 中断具有 RTX 实现可用的最高优先级,UART 中断配置为在错误和接收到数据时触发. 当 UART Rx 线上接收到数据时,会从数据寄存器中读取数据,将其放入循环缓冲区中,然后将信号发送至高优先级 RTOS 任务以解析数据。如果检测到错误标志,则通过读取标志清除中断标志,然后读取数据寄存器。 到目前为止已经尝试了什么: 此设置在 99% 的情况下都能完美运行,但我们注意到大块字节被丢弃。使用Keil 的事件查看器,我们可以看到即使RTOS 处于空闲模式(即不处于处理程序模式),UART Rx 中断有时也不会触发。 NVIC 似乎没有为任何其他中断提供服务,并且 UART 状态寄存器中唯一设置的标志是来自先前发送的帧的 TXE 和 TC。此外,跟踪配置寄存器的状态,我们已经确认启用的中断配置没有改变。 我们已经确认数据通过我们放置在电路板上的 FTDI UART/USB 接头到达设备的 Rx 线路。我们已经验证,无论 RTOS 任务正在运行、是否发生错误(帧、溢出等)或波特率(我们观察到波特率为 9600 时的行为),问题仍然存在。发生这种情况时,通过 UART 传输的数据量通常为几十个字节。 这不是缓冲区溢出,因为我们已经大大扩展了循环缓冲区的大小,并确保在这些情况下检查缓冲区溢出的代码不会返回 true。 我们还在我们生产的所有设备中观察到这种行为,而不仅仅是我正在开发的设备,而且它似乎与 USART2 隔离,即使使用了 UART 1-4。 我在 RTX 文档中没有发现我认为可能导致此问题的任何内容,并且完全没有想法。在任何具体的解决方案中,我只需要让我们的“我们错过了一些东西,所以重试上一个命令”补丁更健壮。 |
|
相关推荐
1个回答
|
|
错过中断的原因是在中断发生期间写入 STM32L1 的 EEPROM。EEPROM 库与闪存库共享内存控制器。因此,写入 EEPROM bank 1 会占用 flash bank 1 的内存控制器和总线资源。但是,您可以在读取一个 bank 的同时写入另一个 bank,大多数程序执行都是这种情况。出现此问题是因为工程师将 USART2 上的设备操作的数据放入 EEPROM 的 bank 1 中,由于这两个 bank 的内存地址是连续的,因此未被捕获。当 USART2 上的设备生成更新此数据的命令时,EEPROM 写入将停止(~3. 2ms) 处理器的指令获取意味着中断向量指向的 ISR 代码无法被获取和执行以解决任何生成的中断。对于大多数 EEPROM 写入,这种情况不会发生,因为数据存储器地址位于我们未从中执行代码的存储区中。
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2720 浏览 1 评论
3236 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3645 浏览 6 评论
6033 浏览 21 评论
1334浏览 4评论
208浏览 3评论
196浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
441浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:32 , Processed in 1.224655 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号