硬汉嵌入式论坛

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

[UART] H7的HAL库串口空闲中断只能接收16字节

[复制链接]

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2023-6-5 18:26:00 | 显示全部楼层 |阅读模式
本帖最后由 MaxDYi 于 2023-6-5 18:38 编辑

请教硬汉哥,我在使用HAL库中新加的空闲中断处理函数HAL_UARTEx_ReceiveToIdle_DMA进行DMA空闲中断,结果一次只能收到16字节的数据,怀疑是串口的FIFO打开导致的,但是已经在CubeMX中关闭了FIFO。尝试使用HAL_UARTEx_ReceiveToIdle_IT进行空闲中断,效果也是一样,DMA搬运16个字节后就停止了。


现象:
现象.png



主要代码:

[C] 纯文本查看 复制代码
#define UART_BUFFER_LENGTH 256[/size][/font][/color]
[/color][/size][/font]#pragma location = ".RAM_D1"
uint8_t Uart_Buffer[UART_BUFFER_LENGTH];

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if (huart->Instance == UART8)
    {

        if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE)
        {

        }
        else if (huart->ReceptionType == HAL_UART_RECEPTION_STANDARD)
        {
            HAL_UART_DMAStop(huart);
            uint16_t RecCount = strlen(Uart_Buffer)-1;
            printf("length: %d\r\n", RecCount);
            printf("%s\r\n", Uart_Buffer);
            memset(Uart_Buffer, 0, UART_BUFFER_LENGTH);

            HAL_UARTEx_ReceiveToIdle_DMA(&huart8, (uint8_t *)Uart_Buffer, UART_BUFFER_LENGTH);
        }        
    }
}



CubeMX配置:
配置1.png 配置2.png








回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2023-6-5 19:12:59 | 显示全部楼层
IDLE很容易触发,跟发送间隙有关系。
回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2023-6-5 19:25:12 | 显示全部楼层
普通模式改成循环模式来玩呗。这样不会停,不然间隔超时直接给你中断了。
回复

使用道具 举报

75

主题

683

回帖

908

积分

金牌会员

积分
908
发表于 2023-6-5 23:03:40 | 显示全部楼层
RX打开上拉试试,另外你在中断里面printf很危险,删掉之后再试
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-6 22:09:37 | 显示全部楼层
cctv180 发表于 2023-6-5 19:25
普通模式改成循环模式来玩呗。这样不会停,不然间隔超时直接给你中断了。

这样怎么判断是不是一帧呢?
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-6 22:10:24 | 显示全部楼层
emwin 发表于 2023-6-5 19:12
IDLE很容易触发,跟发送间隙有关系。

那请问在没有帧头帧尾的情况下怎么判断串口收到一帧合适呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-6-7 09:24:54 | 显示全部楼层
如果已经排除了16个字节后没有一个字符的帧间隔。
还有关键的一点,你使用DMA,你的RAM空间的Cache处理了没。如果没用处理,你直接做strlen是有问题的。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-7 10:06:52 | 显示全部楼层
eric2013 发表于 2023-6-7 09:24
如果已经排除了16个字节后没有一个字符的帧间隔。
还有关键的一点,你使用DMA,你的RAM空间的Cache处理了 ...

没有打开Cache,DMA的内存空间定义在RAM.D1
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-6-7 11:23:40 | 显示全部楼层
不知道H7有没有串口超时中断,我用起来还不错,可以自由设定超时的字节数目。 G4系列有这个功能。 这个不同于idle中断,是独立的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-6-7 11:38:42 | 显示全部楼层
caicaptain2 发表于 2023-6-7 11:23
不知道H7有没有串口超时中断,我用起来还不错,可以自由设定超时的字节数目。 G4系列有这个功能。 这个不同 ...

可以,H7也支持超时中断。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-7 12:10:07 | 显示全部楼层
eric2013 发表于 2023-6-7 09:24
如果已经排除了16个字节后没有一个字符的帧间隔。
还有关键的一点,你使用DMA,你的RAM空间的Cache处理了 ...

测试了应该是电脑发送的问题,用单片机和单片机通信就可以完整接收
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-7 12:10:27 | 显示全部楼层
caicaptain2 发表于 2023-6-7 11:23
不知道H7有没有串口超时中断,我用起来还不错,可以自由设定超时的字节数目。 G4系列有这个功能。 这个不同 ...

我研究下这个,谢谢
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2023-6-7 13:27:20 | 显示全部楼层
caicaptain2 发表于 2023-6-7 11:23
不知道H7有没有串口超时中断,我用起来还不错,可以自由设定超时的字节数目。 G4系列有这个功能。 这个不同 ...

请问有例程可以参考下吗
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-6-7 14:45:25 | 显示全部楼层
MaxDYi 发表于 2023-6-7 13:27
请问有例程可以参考下吗

我也没有找到例程,只是自行在HAL库代码中分析,然后使用。
主要是以下3个HAL库函数:
void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue);
HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart);

HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,  uint32_t Tickstart, uint32_t Timeout);
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:18 , Processed in 0.216512 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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