OpenEdv-开源电子网

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

stm32f417串口中断收数据“死机”

[复制链接]

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-3-23
在线时间
54 小时
发表于 2016-1-29 11:55:13 | 显示全部楼层 |阅读模式
5金钱
1.程序中只开启了串口接收中断,排除其他的干扰。2.实现功能:PC发送一帧数据,ARM回传接收到的帧数和错误帧数;
3.波特率为2.5MHZ,PC发送帧头ff ff ff ff ff ff + 帧长度 04 00 + 1024Byte数据(0-255循环);ARM接收到数据后,判断帧头是否满足,提取帧长度,接收数据并比较数据是否接收正确,如果错误则错误标志位加1.
将错误标志位,接收帧数量发送到PC机。

4.在DEBUG模式下,上位机发送1032byte/帧,帧间隔为10ms,发送几秒后,串口便“死机”了。

死机表现为:PC发送一帧数据,这时ARM应该回传接收到的帧数和错误帧数,但事实并没有回传任何数据。这时停止程序运行,发现程序停止在main函数中。

最佳答案

查看完整内容[请看2#楼]

问题已经解决了。把中断里面的数据判断和组帧发送的操作都移到main函数中,同时加大缓存,将PC机发送间隔改为0ms都可以正常接收。深刻的认识到,与中断无关的操作不要放在中断中。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-3-23
在线时间
54 小时
 楼主| 发表于 2016-1-29 11:55:14 | 显示全部楼层
问题已经解决了。把中断里面的数据判断和组帧发送的操作都移到main函数中,同时加大缓存,将PC机发送间隔改为0ms都可以正常接收。深刻的认识到,与中断无关的操作不要放在中断中。
回复

使用道具 举报

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-3-23
在线时间
54 小时
 楼主| 发表于 2016-1-29 11:57:35 | 显示全部楼层
中断函数如下:
void USART1_IRQHandler(void) //just test
{

        //èç1ûóD½óêÕêy¾YμÄÖD¶Ï£¬½óêÕêy¾Y
        if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
        {
                if(uart4_i<1032)
                {
                        g_cmdFromUartLow.dat[uart4_i] = USART_ReceiveData(USART1);
                        uart4_i++;
                }
                else
                {
                        USART_ReceiveData(USART1);
                        uart4_i = 0;
                }
                       
                usart4_rcv_datalen        = uart4_i;
               
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        }       
       
        //è&#231;1&#251;·¢éúò&#231;3&#246;£&#172;&#207;è&#182;áSR,&#212;ù&#182;áDR&#188;&#196;′&#230;&#198;÷£&#172;&#188;′&#191;é&#199;&#229;3y2&#187;&#182;&#207;è&#235;&#214;D&#182;&#207;μ&#196;&#206;êìa
        if(  (USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)||(USART_GetFlagStatus(USART1,USART_FLAG_FE)==SET)\
       ||(USART_GetFlagStatus(USART1,USART_FLAG_PE)==SET)||(USART_GetFlagStatus(USART1,USART_FLAG_NE)==SET))
        {
                USART_GetFlagStatus(USART1,USART_FLAG_ORE); //&#182;áè&#161;SR&#188;&#196;′&#230;&#198;÷
                USART_ReceiveData(USART1);                  //&#182;áè&#161;DR&#188;&#196;′&#230;&#198;÷
               
                USART_GetFlagStatus(USART1,USART_FLAG_FE);
                USART_ReceiveData(USART1);

                USART_GetFlagStatus(USART1,USART_FLAG_PE);
                USART_ReceiveData(USART1);

                USART_GetFlagStatus(USART1,USART_FLAG_NE);
                USART_ReceiveData(USART1);
        }       
       
        if(uart4_i > len + 8)
        {
                uart4_i = 0;
        }
        else if(uart4_i == 1)
        {
                len = 0;
        }
        else if(uart4_i == 2)  //&#197;D&#182;&#207;&#214;&#161;í·
        {
                if((g_cmdFromUartLow.dat[0] != 0xff)||(g_cmdFromUartLow.dat[1] != 0xff))
                        uart4_i = 0;
        }
        else if(uart4_i == 4)
        {
                if((g_cmdFromUartLow.dat[3] != 0xff)||(g_cmdFromUartLow.dat[2] != 0xff))
                        uart4_i = 0;
        }
        else if(uart4_i == 6)
        {
                if((g_cmdFromUartLow.dat[5] != 0xff)||(g_cmdFromUartLow.dat[4] != 0xff))
                        uart4_i = 0;
        }
        else if(uart4_i == 8) //&#189;óê&#213;&#214;&#161;3¤&#182;è
        {
                len = (u16)(g_cmdFromUartLow.dat[6]<<8) + g_cmdFromUartLow.dat[7];
                if(len != 1024)
                        uart4_i = 0;

        }
        else if(uart4_i == len + 8) //&#189;óê&#213;íêò&#187;&#214;&#161;êy&#190;Y
        {
                uart4_i = 0;
                for(uart3_i=0;uart3_i<1024;uart3_i++) //&#182;&#212;&#195;&#191;&#184;&#246;×&#214;&#189;ú&#189;&#248;DD±è&#189;&#207;
                {
                        temp = (u8)uart3_i;
                        if(temp != g_cmdFromUartLow.dat[uart3_i+8])
                        {
                                err_flag = 1;
                        }
                }
                if(err_flag == 1)
                {
                        err_frame = err_frame + 1;
                        err_flag = 0;
                }
                dat_frame = dat_frame + 1;
                SendByte[1]  = (u8) (err_frame >> 56);  //&#189;&#171;&#189;óê&#213;μ&#189;μ&#196;&#214;&#161;êyoí′í&#206;ó&#214;&#161;êyí¨1y′&#174;&#191;ú·¢&#203;í3&#246;è¥
                SendByte[2]  = (u8) (err_frame >> 48);
                SendByte[3]  = (u8) (err_frame >> 40);
                SendByte[4]  = (u8) (err_frame >> 32);
                SendByte[5]  = (u8) (err_frame >> 24);
                SendByte[6]  = (u8) (err_frame >> 16);
                SendByte[7]  = (u8) (err_frame >> 8 );
                SendByte[8]  = (u8) (err_frame >> 0 );
                SendByte[9]  =  0xaa;
                SendByte[10] = (u8) (dat_frame >> 56);
                SendByte[11] = (u8) (dat_frame >> 48);
                SendByte[12] = (u8) (dat_frame >> 40);
                SendByte[13] = (u8) (dat_frame >> 32);
                SendByte[14] = (u8) (dat_frame >> 24);
                SendByte[15] = (u8) (dat_frame >> 16);
                SendByte[16] = (u8) (dat_frame >> 8 );
                SendByte[17] = (u8) (dat_frame >> 0 );
                UART1_Send(SendByte,18);                 
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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