硬汉嵌入式论坛

 找回密码
 立即注册
查看: 664|回复: 8
收起左侧

[技术讨论] 工作两三年了,头一次碰到串口不进中断的情况,求助大神看看

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-8-7 11:00:07 | 显示全部楼层 |阅读模式
具体情况是这样的,公司项目升级,16年的代码,用的固件库和ucos,串口一切正常;现在项目升级用的是hal库和freertos,串口死活不进中断,硬件串口部分基本没变,下面是原理图,大概原理就是 SWITCH_EN 为 1,M
CU_OT2_RX 和 MCU_UART4_TX 相连,OT2这个串口的接收直接接到 URART 4的发送,相当于OT2有数据了,这部分数据可以通过muc处理接收,同时也直接转到 UART4 直接发送(至于为啥这样设计,就是数据量太大,一包就有1k,2k的数据量),硬件这样设计,用老代码

一切正常,用我新写的代码,UART4和OT2这两个串口就不正常了,但是RADIO这个串口就正常
1.png
同样我把SWITCH_EN 设置为 0,UART4 和RADIO这俩就连接到一起了,这俩就不正常工作量,OT2串口就恢复正常了


太奇怪了!!!!,折磨了我好多天了。。。不知道各位同行有无相关处理经验,求教!!!


代码很成熟了,用了两三年没出现过啥问题,
4.png Snipaste_2023-08-07_10-58-05.png 3.png
回复

使用道具 举报

3

主题

35

回帖

44

积分

新手上路

积分
44
发表于 2023-8-7 11:10:16 | 显示全部楼层
这个问题光看你的代码看不出来
串口不进中断的话,建议你先比对一下相关gpio和usart相关寄存器的配置是否正常
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-7 11:29:45 | 显示全部楼层
对比了一下,固件库里是先配置的串口,再配置的dma,hal库则是相反的,我试着改了一下他俩的位置,结果是ot2接收,短接的uart4可以直接转发出去,但是mcu接收不到
66.png
回复

使用道具 举报

3

主题

35

回帖

44

积分

新手上路

积分
44
发表于 2023-8-7 13:39:23 | 显示全部楼层
lky 发表于 2023-8-7 11:29
对比了一下,固件库里是先配置的串口,再配置的dma,hal库则是相反的,我试着改了一下他俩的位置,结果是ot ...

程序跑起来后,通过keil仿真,再检查peripherals里寄存器配置,对比以下俩个工程文件里 涉及到UART4的GPIO寄存器和UART/UART4寄存器是否有异同
回复

使用道具 举报

0

主题

215

回帖

215

积分

高级会员

积分
215
发表于 2023-8-7 14:34:49 | 显示全部楼层
两个办法试试
1. 直接比较下初始化完成后的寄存器差异看看。
2. 用LL库
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-7 15:00:21 | 显示全部楼层
24841500 发表于 2023-8-7 11:10
这个问题光看你的代码看不出来
串口不进中断的话,建议你先比对一下相关gpio和usart相关寄存器的配置是否 ...

问题已解决,稍后会发帖,感谢给出建议
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-7 15:00:47 | 显示全部楼层
24841500 发表于 2023-8-7 13:39
程序跑起来后,通过keil仿真,再检查peripherals里寄存器配置,对比以下俩个工程文件里 涉及到UART4的GPI ...

问题已解决,稍后会发帖,感谢给出建议
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-7 15:01:26 | 显示全部楼层
regbbs 发表于 2023-8-7 14:34
两个办法试试
1. 直接比较下初始化完成后的寄存器差异看看。
2. 用LL库

问题已解决,稍后会发帖,感谢给出建议
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-8-7 15:21:45 | 显示全部楼层
问题已解决,问题出在HAL_UART_Init函数里,这个函数先配置的dma(HAL_UART_MspInit函数),再配置的uart寄存器UART_SetConfig(),而固件库正好是相反的,所以我尝试修改了HAL_UART_Init函数,把UART_SetConfig函数写到HAL_UART_MspInit前面,但是这个UART_SetConfig函数会获取时钟pclk = HAL_RCC_GetPCLK2Freq();所以还要在串口初始化的最前面加上时钟使能,至此问题解决
1.png
2.png
3.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 01:48 , Processed in 0.318950 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表