OpenEdv-开源电子网

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

stm32H743IIt6串口中断接收卡死问题

[复制链接]

16

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2013-12-21
在线时间
8 小时
发表于 2022-5-21 10:46:58 | 显示全部楼层 |阅读模式
10金钱
最近做项目用stm32H743IIT6采用串口中断方式和迪文串口屏进行通信,串口程序是移植官网例程,和屏幕通信的时候经常串口接收中断经常卡死,程序没有跑飞,主程序正常运行,就是串口中断再也进不去了。哪位大神给看看,最好@原子哥给解答下
void USART2_IRQHandler(void)                       
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntEnter();   
#endif
        if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))  //接收到数据
        {
        HAL_UART_Receive(&UART2_Handler,&Res,1,1000);
                     USART2_RX_BUF[Uart2RxCount++]=Res ;
                    if(Readtime==1)  Uart2frame=15;  //接收时间参数
                    else Uart2frame=9;  //普通LCD指令
                    if(USART2_RX_BUF[0]==0x5A)
                                {
                                        if(Uart2RxCount==(USART2_RX_BUF[2]+3)) //接收完毕(USART2_RX_BUF[2]+3)
                                        {
                                                 if(Uart2RxCount==6)  //应答指令
                                                 {
                                                         Uart2RxCount=0;
//                                                         Beep(10);
                                                 }
                                                 else{
                                                        Usartflag|=0x02; //bit1置1
                                                        Uart2RxCount=0;
                                      Beep(10);
                                                 }
                                        }
                         }
                         else Uart2RxCount=0;
                         if(Uart2frame==15)              //接收完一组13帧数据
                  {
        if((USART2_RX_BUF[5]==0x10)&&(USART2_RX_BUF[6]==0x04))   //接收到时钟数据
                                {
                                        if((Usartflag&0x02)>>1)
                                        {
                                                 Usartflag&=0xFD; //清标志位
                                                 timeack=1;
                                                 year=USART2_RX_BUF[7];
                                                 month=USART2_RX_BUF[8];
                                                 day=USART2_RX_BUF[9];
                                                 hour=USART2_RX_BUF[11];
                                                 minute=USART2_RX_BUF[12];
                                                 second=USART2_RX_BUF[13];
                                        }
                                }
                  }       
        }
        HAL_UART_IRQHandler(&UART2_Handler);       
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntExit();                                                                                           
#endif
}

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

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2022-5-21 16:11:05 | 显示全部楼层
你可以在中断里一直接收, 配合空闲中断用,效率高。接收完弄个标志位。在主循环处理接收到的数据。
回复

使用道具 举报

16

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2013-12-21
在线时间
8 小时
 楼主| 发表于 2022-5-21 17:12:50 | 显示全部楼层
wklhwkl 发表于 2022-5-21 16:11
你可以在中断里一直接收, 配合空闲中断用,效率高。接收完弄个标志位。在主循环处理接收到的数据。

这种中断接收处理,我在F103的板子也是这样做的,没有问题,但是这个芯片上经常出问题
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-5-23 11:49:01 | 显示全部楼层
帮顶            
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2022-5-11
在线时间
6 小时
发表于 2022-5-23 20:40:38 | 显示全部楼层
你试试把应答拿出中断,放在主程序里面试试。
一般情况下,内核速度越快的芯片,中断里面越不要放太多条指令。
很不稳定
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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