OpenEdv-开源电子网

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

UCOS-iii串口中断,信号量异常

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-10
在线时间
2 小时
发表于 2016-10-14 08:49:39 | 显示全部楼层 |阅读模式
我是基于STM32F407上的uCOS-iii的串口中断软件。
1、在中断服务程序中,缓存字符,判断是否接受到回车换符“\r\n”,如果接收到回车符,中断设置不同的相应标志位USART_RX_STA(全局变量),软件补充一个字符结束符号 0x0,然后向系统发送一个信号量。
2、任务代码中,接受到信号量,清除USART_RX_STA, 并对串口接收到字符进行解析,对比。
3、现在的异常现象,在接收到随机字符串,时间间隔在20ms~1S时间不等,如果任务中对缓存UART1_RX_BUF读取解析,会随机出现硬件异常中断。
4、如果不执行该段代码,怎么发串口数据都不出现异常,求解。

5、程序代码如下:


串口UART1的中断
void USART1_IRQHandler(void)
{
        u8 Res;
        OS_ERR err;
        OSIntEnter();   
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                Res =(USART1->DR);
                if((USART_RX_STA&0x8000)==0)
                {
                        if(USART_RX_STA&0x4000)
                        {
                                if('\n' !=  Res)USART_RX_STA=0;
                                else
                                {       
                                  UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        USART_RX_STA |= 0x8000;
                        }
                        else
                        {       
                                if('\r' == Res) //'\r'
                                {
                                        UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        UART1_RX_BUF[USART_RX_STA&0X3FFF]= 0x0;
                                        USART_RX_STA++;
                                        USART_RX_STA|=0x4000;
                                        OSSemPost(&PackSemaphore,OS_OPT_POST_FIFO,&err);                               
                                }
                                else
                                {
                                        UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if( USART_RX_STA > (UART1_REC_LEN-5)) USART_RX_STA=0;
                                }                 
                        }
                }                    
  }
        OSIntExit();   
}
       
执行的任务代码:
void pack_Pro_task(void *p_arg)
{
    OS_ERR err;
          uint32_t tick=0x0;
          while(1)
          {
                         OSSemPend(&PackSemaphore,0,OS_OPT_PEND_BLOCKING,0,&err);
                        DRV_PRINT("pktick:%d\r\n",tick++);
                        if(USART_RX_STA&0x8000)
                        {

                        }
                        USART_RX_STA=0x0;
                       
                        //DRV_PRINT("%s",UART1_RX_BUF);
//      if(COMERR==command_parsing((char *)UART1_RX_BUF,&ComParStruct))   ---------------------------------->执行注释的带,系统会随机出现异常,异常时,执行次数不定
//                        {
//                //        DRV_PRINT("command line err!\r\n");
//                        }
//                        else
//                        {
//                  //  DRV_PRINT("command line ok! ID:%d\r\n",ComParStruct.CommandId);
//                                if(SET_AD9913_RF ==ComParStruct.CommandId)
//                                {
//                                  uint32_t freq = ComParStruct.CommandParameter0*1000000;
//                                //printf("%d\r\n",freq);
//                                   AD9913SetRfFrequency(freq);
//                                }
//                        }
          }
}


~~~~求解~~~~~

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

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-10
在线时间
2 小时
 楼主| 发表于 2016-10-14 12:02:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-10
在线时间
2 小时
 楼主| 发表于 2016-10-14 13:05:03 | 显示全部楼层
问题找到了。经过2个小时,每次数据20ms间隔测试,OK,继续测试2个钟
初步有两个问题,
1、信号来那个位置错误,回车换行符号'\r' '\n', ‘\n’数据接受到才是结束 ,信号量应该是这个位置
2、上位机串口工具,发送字符串时,多了一个回车换行符
信号来那个放的位置错了。

if(USART_RX_STA&0x4000)
{
      if('\n' !=  Res)USART_RX_STA=0;
        else
         {        
              UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
              USART_RX_STA++;
              USART_RX_STA |= 0x8000;
           }
          else
           {        
               if('\r' == Res) //'\r'
                {
                     UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                     USART_RX_STA++;
                      UART1_RX_BUF[USART_RX_STA&0X3FFF]= 0x0;
                      USART_RX_STA++;
                      USART_RX_STA|=0x4000;
                      OSSemPost(&ackSemaphore,OS_OPT_POST_FIFO,&err);                                
                   }
                 else
                  {
                     UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                      USART_RX_STA++;
                      if( USART_RX_STA > (UART1_REC_LEN-5)) USART_RX_STA=0;
                    }                 
                 }
这段代码改为:

if(USART_RX_STA&0x4000)
{
      if('\n' !=  Res)USART_RX_STA=0;
       {       
           UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
           USART_RX_STA++;               
           UART1_RX_BUF[USART_RX_STA&0X3FFF]= 0x0;
           USART_RX_STA++;
           USART_RX_STA |= 0x8000;       
           OSSemPost(&ackSemaphore,OS_OPT_POST_FIFO,&err);       
         }
}
else
{       
    if('\r' == Res) //'\r'
        {
            UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
            USART_RX_STA++;       
            USART_RX_STA|=0x4000;                                        
       }
      else
      {
         UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
         USART_RX_STA++;
         if( USART_RX_STA > (UART1_REC_LEN-5)) USART_RX_STA=0;
       }                 
}




回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-10
在线时间
2 小时
 楼主| 发表于 2016-10-14 18:20:05 | 显示全部楼层
还有就是UCOS的任务堆栈溢出。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 22:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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