硬汉嵌入式论坛

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

[UART] 串口异常中断的求助

[复制链接]

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2022-8-11 14:08:32 | 显示全部楼层 |阅读模式
我用H750做开发,使用的是HAL库,
系统用FreeRTOS。

串口功能之前用DMA + IDLE中断 + 信号量接收不定长数据,
接收和发送都用到了队列,
工作得好好的。

后来感觉调试串口做得太复杂,
又有信号量又有队列又有DMA又有中断的,
程序异常的时候可能反而不能有效打印调试信息了。

所以我就想把发送改成最基本的HAL_UART_Transmit
接收改成单个字节中断接收。

通过识别收到换行符的时候来插入队列。

但是奇怪的是,
我只要调用HAL_UART_Transmit发送一个字节,
就会不断进入在串口中断,卡死程序。


进入中断程序以后,我通过调试发现,
USART1的ISR寄存器的值为0x0000080F。


我开启了USART的全局中断。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2022-8-11 14:30:36 | 显示全部楼层
这种的,我推荐楼主发送和接收都用那个_IT后缀的发送和接收API,然后配合发送完成和接收完成的中断回调函数,效果还是不错的。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2022-8-11 14:50:45 | 显示全部楼层
但是我想要使用 stdio 输出信息,
所以就要重写 putchar 这个函数,
如果发送一个字符串,就会连续调用。

要是发送函数也用_IT的话,
是不是得在 putchar 里面的发送之前,
等待中断函数设置发送完成的标志位呢?

这样发送一个字符串会不会变得很占资源呢?
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2022-8-11 15:07:52 | 显示全部楼层
非常感谢。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2022-8-11 18:11:45 | 显示全部楼层
只是串口打印的话,什么dma、中断都不用,简单粗暴最好
int fputc(int ch, FILE *f)
{
huart1.Instance->TDR = (ch & (uint16_t)0x01FF);
while (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) == RESET);
return ch;
}

波特率1.5Mbps,爽到不要不要的;

如果只是想学习、玩技术的话另当别论。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 14:55 , Processed in 0.185983 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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