[技术问答]

HK32F103RBT6 UART1 RX IDLE空闲中断标志清不掉

[复制链接]
920|9
手机看帖
扫描二维码
随时随地手机跟帖
laocuo1142| | 2021-1-16 11:38 | 显示全部楼层
看一下手册

使用特权

评论回复
531259672|  楼主 | 2021-1-16 16:39 | 显示全部楼层
应用手册上说关于IDLE中断不能清标志位是这样说的 535486002a53bee12e.png ,我自己的操作是先不开IDLE中断,然后在有数据发送过来,RXNE产生中断后,再开启IDLE中断。等IDLE产生中断了,清中断标志,处理数据后,再关闭IDLE中断。按照上面的往复运作就可以了。但是现在又有一个问题,我使用IDLE中断是为了使用DMA来接收UART的数据的,当启动了DMA接收UART数据后,RXNE就不能产生中断了。那上面的操作就实现不了了。如果不选MDA接收UART数据,RXNE能产生中断,但是DMA不能接收数据,我在IDLE中断中也处理不了什么了。我想实现的就是使用DMA来接收UART的数据。在STM32上都用的好好的,但是移植到HK32就有这个问题解决不了了

使用特权

评论回复
yyj8902| | 2021-1-17 19:55 | 显示全部楼层
这个问题你为什么要看ST的手册呢,可以看看HK的手册

使用特权

评论回复
531259672|  楼主 | 2021-1-18 00:19 | 显示全部楼层
hk的手册上面和st的是一样的。我的这个截图是hk的应用手册上的,是他们自己截的st的手册

使用特权

评论回复
annko2005| | 2021-1-18 08:50 | 显示全部楼层
建议用HK32F103xx后缀不带A的产品,在做串口通讯时不要用IDLE中断,带A的产品可以用。

使用特权

评论回复
jcky001| | 2021-1-18 08:56 | 显示全部楼层
用HK32F103xx后缀不带A的产品

使用特权

评论回复
531259672|  楼主 | 2021-1-18 10:40 | 显示全部楼层
annko2005 发表于 2021-1-18 08:50
建议用HK32F103xx后缀不带A的产品,在做串口通讯时不要用IDLE中断,带A的产品可以用。 ...

就是说如果用IDLE中断的话就用就 用带A的,如果不用IDLE中断首选不带A的。带A和不带A的有什么区别?我们现在用的是HK32F103RBT6不带A的

使用特权

评论回复
531259672|  楼主 | 2021-1-20 13:15 | 显示全部楼层
后来航顺代理帮忙解决了一下,比较几个重要的地方,我粘贴上来,共后面的人使用:
这里是关于串口的设置里面比较重要的地方:
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);

    USART_Cmd(USART1, ENABLE);


这里是关于中断处理的问题:
uint16_t Cnt = 0;

void USART1_IRQHandler(void)
{
       
       
        /* 使用了DMA的情况下, 能产生RXNE中断, 但在中断中是读不到RXNE标志的, 因为DMA已经将数据搬走了 */
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                USART1->DR;
        }
        else if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
        {       
                USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);  /* 使能总线空闲中断 */
                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   /* 使能接收中断 */
               
                Cnt = BUFF_SIZE_MAX - DMA_GetCurrDataCounter(DMA1_Channel5);
        DMA_Cmd(DMA1_Channel5, DISABLE);
                RxBuff[Cnt] = '\0';
        RxOverFlag = 1;
               
        DMA_Reset(DMA1_Channel5);               
        }
    else
    {
        /* 在RXNE中断中没有检测到RXNE标志, 1. 清除IDLE标志 */
        USART1->SR;
        USART1->DR;
        /* 2. 关闭RXNE中断使能IDLE中断 */
        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); /* 禁用接收中断 */
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);  /* 使能总线空闲中断 */
    }       
}

上面的代码已经解决了主要问题,供参考

使用特权

评论回复
ifxz0123| | 2021-1-20 14:48 | 显示全部楼层
本帖最后由 ifxz0123 于 2021-1-20 14:49 编辑

新版的HK32F103RBT6A,改掉了这个问题,可以直接使用ST的代码,今天我测试了一下。另外USB功能也可以用了

使用特权

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

本版积分规则

9

主题

65

帖子

2

粉丝