OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9969|回复: 21

关于串口空闲中断的问题,一上电就进入空闲中断

[复制链接]

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
发表于 2021-4-7 13:42:16 | 显示全部楼层 |阅读模式
1金钱
void UART8_Init(void)
{
    huart8.Instance = UART8;
    huart8.Init.BaudRate = 115200;
    huart8.Init.WordLength = UART_WORDLENGTH_8B;
    huart8.Init.StopBits = UART_STOPBITS_1;
    huart8.Init.Parity = UART_PARITY_NONE;
    huart8.Init.Mode = UART_MODE_TX_RX;
    huart8.Init.HwFlowCtl = UART_HWCONTROL_NONE;
          huart8.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart8);
       
                HAL_NVIC_SetPriority(UART8_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(UART8_IRQn);         
       
          __HAL_UART_ENABLE_IT(&huart8, UART_IT_IDLE);
          __HAL_UART_CLEAR_IDLEFLAG(&huart8);
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(uartHandle->Instance==UART8)
    {
        __HAL_RCC_UART8_CLK_ENABLE();
        __HAL_RCC_DMA1_CLK_ENABLE();
        __HAL_RCC_GPIOE_CLK_ENABLE();

        /**UART8 GPIO Configuration
        PE1     ------> UART8_TX
        PE0     ------> UART8_RX
        */
        GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull=GPIO_PULLUP;                        //上拉
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF8_UART8;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
                       

        GPIO_InitStruct.Pin = GPIO_PIN_2;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull=GPIO_PULLUP;                        //上拉
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
        /* UART8 DMA Init */
        /* UART8_RX Init */
        hdma_uart8_rx.Instance = DMA1_Stream0;
        hdma_uart8_rx.Init.Request = DMA_REQUEST_UART8_RX;
        hdma_uart8_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
        hdma_uart8_rx.Init.PeriphInc = DMA_PINC_DISABLE;
        hdma_uart8_rx.Init.MemInc = DMA_MINC_ENABLE;
        hdma_uart8_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        hdma_uart8_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        hdma_uart8_rx.Init.Mode = DMA_NORMAL;
        hdma_uart8_rx.Init.Priority = DMA_PRIORITY_HIGH;
        hdma_uart8_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        if (HAL_DMA_Init(&hdma_uart8_rx) != HAL_OK)
        {

        }         
        __HAL_LINKDMA(uartHandle,hdmarx,hdma_uart8_rx);
                                           
        HAL_UART_Receive_DMA(&huart8, uart8ReceiveBuff, BUFF_SIZE); //开启DMA接收
    }
}


一上电没有发送数据就会进入空闲中断,不知道什么原因,其它时候都是正常的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8627
金钱
8627
注册时间
2020-5-11
在线时间
4059 小时
发表于 2021-4-7 13:52:03 | 显示全部楼层
专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 13:57:03 | 显示全部楼层
LcwSwust 发表于 2021-4-7 13:52
因为它本来就空闲啊

是这样的吗?可是标准库第一次上电就不会进入空闲中断
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8627
金钱
8627
注册时间
2020-5-11
在线时间
4059 小时
发表于 2021-4-7 13:58:19 | 显示全部楼层
MCJ 发表于 2021-4-7 13:57
是这样的吗?可是标准库第一次上电就不会进入空闲中断

哦,那就在使能中断前清除中断标志试试。
专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:01:20 | 显示全部楼层
试过了,不行
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:04:06 | 显示全部楼层
LcwSwust 发表于 2021-4-7 13:58
哦,那就在使能中断前清除中断标志试试。

试过了不行
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8627
金钱
8627
注册时间
2020-5-11
在线时间
4059 小时
发表于 2021-4-7 14:04:41 | 显示全部楼层
MCJ 发表于 2021-4-7 14:01
试过了,不行

这两句交换一下呗
__HAL_UART_ENABLE_IT(&huart8, UART_IT_IDLE);
__HAL_UART_CLEAR_IDLEFLAG(&huart8);
专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:08:11 | 显示全部楼层
LcwSwust 发表于 2021-4-7 14:04
这两句交换一下呗
__HAL_UART_ENABLE_IT(&huart8, UART_IT_IDLE);
__HAL_UART_CLEAR_IDLEFLAG(&huart8) ...

刚才就把__HAL_UART_CLEAR_IDLEFLAG(&huart8);放到前面试了,还是一上电就进空闲中断
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8627
金钱
8627
注册时间
2020-5-11
在线时间
4059 小时
发表于 2021-4-7 14:13:39 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-4-7 14:14 编辑
MCJ 发表于 2021-4-7 14:08
刚才就把__HAL_UART_CLEAR_IDLEFLAG(&huart8);放到前面试了,还是一上电就进空闲中断

其实我没用过HAL库,没用过空闲中断,百度了一下发现清标志的操作有点怪,你按这方法试一下:
傲游截图20210407141213.jpg
专治疑难杂症
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:26:15 | 显示全部楼层
LcwSwust 发表于 2021-4-7 14:13
其实我没用过HAL库,没用过空闲中断,百度了一下发现清标志的操作有点怪,你按这方法试一下:

这个好像标准库需要这样操作,我debug看了idle这位,开启中断前确实清除了置位,但是开启后,直接又置位了,同事ORE寄存器也变成1了,也就是发生了溢出中断,很奇怪
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-7 14:37:25 | 显示全部楼层
是不是别的部分影响到了这里,我是有一次用H743的QSPI口,同时使用W25Q256的QSPI和串口,去掉这个SPI初始化就好了,但是开启就出故障了。最后发现是QSPI的初始化口与实际硬件的QSPI连接口不是同一个,所以造成了口线乱了,导致一直进不去空闲中断。同理,你可以把其余的全部初始化去掉,看看还是不是依旧开机进入空闲中断。,逐一排查。
海纳百川者,荣耀伴一生!
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:50:19 | 显示全部楼层
shumivan 发表于 2021-4-7 14:37
是不是别的部分影响到了这里,我是有一次用H743的QSPI口,同时使用W25Q256的QSPI和串口,去掉这个SPI初始化 ...

我现在用的也是H743,我刚开始也是怀疑哪里影响到了,后来我直接用STM32CUBEMX生成的程序,然后加上空闲中断,发现也是一样的现象
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-7 14:53:45 | 显示全部楼层
你这个有没有涉及到内存保护的问题,我是不使用那些.不过这个H743也出问题的情况比较多.
海纳百川者,荣耀伴一生!
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 14:56:50 | 显示全部楼层
shumivan 发表于 2021-4-7 14:53
你这个有没有涉及到内存保护的问题,我是不使用那些.不过这个H743也出问题的情况比较多.

Cache什么的我都没打开
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-7 14:58:37 | 显示全部楼层
MCJ 发表于 2021-4-7 14:56
Cache什么的我都没打开

你与原子哥的例程对比一下关键性的区别在哪
海纳百川者,荣耀伴一生!
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 15:01:52 | 显示全部楼层
shumivan 发表于 2021-4-7 14:58
你与原子哥的例程对比一下关键性的区别在哪

原子哥好像没有UART DMA接收的例程
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-7 15:13:34 | 显示全部楼层
MCJ 发表于 2021-4-7 15:01
原子哥好像没有UART DMA接收的例程

有阿.怎么没有,H743阿波罗的例程就有
海纳百川者,荣耀伴一生!
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 16:32:10 | 显示全部楼层
shumivan 发表于 2021-4-7 15:13
有阿.怎么没有,H743阿波罗的例程就有

我看原子哥用的都是DMA发送,串口中断接收,没有用空闲中断把
回复

使用道具 举报

12

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2019-10-29
在线时间
56 小时
 楼主| 发表于 2021-4-7 16:56:01 | 显示全部楼层
shumivan 发表于 2021-4-7 15:13
有阿.怎么没有,H743阿波罗的例程就有

刚才论坛里随便下了个别人写的,也是一样的问题,上电就进一次空闲中断
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-7 16:57:28 | 显示全部楼层
MCJ 发表于 2021-4-7 16:56
刚才论坛里随便下了个别人写的,也是一样的问题,上电就进一次空闲中断

上电确实是进一次,这个确实.那只是初始化的时候进入一次.
海纳百川者,荣耀伴一生!
回复

使用道具 举报

0

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
706
金钱
706
注册时间
2020-8-15
在线时间
54 小时
发表于 2021-7-30 14:47:20 | 显示全部楼层
我也遇到了这个问题,使能空闲中断前后把标志位清掉,还是会进入空闲中断,解决不掉最后实在callback函数里面加了个静态标志位,第一次进入callback函数时清零,返回
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-5-14
在线时间
20 小时
发表于 2022-8-5 14:26:29 | 显示全部楼层
解决了吗,各位大佬,想知道结果,我现在也碰到了这样的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-8 16:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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