OpenEdv-开源电子网

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

关于“中断处理函数、中断回调函数” 的请教

[复制链接]

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-9-25
在线时间
17 小时
发表于 2018-5-21 16:44:52 | 显示全部楼层 |阅读模式
1金钱
         下面我把我的问题先说一下:               我的两个板子使用UART通信,对接受的一方来说,采用中断接受方式:每接受1个字节中断一次,接受满一帧再处理数据(每帧包括HEAD1、HEAD2、长度、数据、校验字节)。在每个中断回调函数里面用状态机来实现。代码是在cubeMX生成的,根本没有理会中断处理函数,只需要从写回调函数,处理还比较可靠的。

               做手上这个项目,用了原子哥的F429核心板,也用了他们的程序。再用我的中断回调函数就不行了。

               不知道为什么!

最佳答案

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

还是用我们例程吧。cube搞来搞去,不好搞。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-21 16:44:53 | 显示全部楼层
还是用我们例程吧。cube搞来搞去,不好搞。
回复

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-9-25
在线时间
17 小时
 楼主| 发表于 2018-5-21 16:46:19 | 显示全部楼层
下面是我以前的程序:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{               
        if(UartHandle->Instance==USART3)
        {
                switch (State_Receive)
                {
                        case State_Receive_Head1:
                                if(aRxBuffer[0]==0xAA)
                                        State_Receive=State_Receive_Head2;                                
                                break;
                        case State_Receive_Head2:                        
                                if(aRxBuffer[0]==0x55)
                                        State_Receive=State_Receive_Len;               
                                else if(aRxBuffer[0]==0xAA)
                                        State_Receive=State_Receive_Head2;
                                else
                                        State_Receive=State_Receive_Head1;        
                                break;
                        case State_Receive_Len:
                                if((aRxBuffer[0]==LEN_REC_Error)||(aRxBuffer[0]==LEN_REC_Success)||(aRxBuffer[0]==LEN_REC_DoorOpen)||(aRxBuffer[0]==LEN_REC_Working)||(aRxBuffer[0]==LEN_REC_Idle))
                                {
                                        State_Receive=State_Receive_Data;
                                        Len_Rec=aRxBuffer[0];
                                        Type_Rec=aRxBuffer[0];
                                        Check_Sum=0;
                                }
                                else
                                        State_Receive=State_Receive_Head1;
                                break;
                        case State_Receive_Data:
                                RxBuffer[Type_Rec-Len_Rec]=aRxBuffer[0];
                                Check_Sum^=aRxBuffer[0];
                                Len_Rec--;
                                if(Len_Rec==0)
                                        State_Receive=State_Receive_Check;
                                break;
                        case State_Receive_Check:
                                //if(Check_Sum==aRxBuffer[0])
                                osSemaphoreRelease(bSemRECHandle);                                       
                                State_Receive=State_Receive_Head1;
                                break;
                        default:
                                break;
                }
        }
        HAL_UART_Receive_IT(&huart3,aRxBuffer,1);               
回复

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-9-25
在线时间
17 小时
 楼主| 发表于 2018-5-21 16:48:56 | 显示全部楼层
这是原子《FreeRTOS实验4-1 FreeRTOS中断测试实验》中usart.c的部分代码。搞不明白,为啥既有中断处理函数,又有中断回调函数。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//èç1ûêÇ′®¿ú1
        {
                if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
                {
                        if(USART_RX_STA&0x4000)//½óêÕμ½áË0x0d
                        {
                                if(aRxBuffer[0]!=0x0a)
                                        USART_RX_STA=0;//½óêÕ′íÎó,ÖØD¿aê¼
                                else
                                        USART_RX_STA|=0x8000;        //½óêÕíê3éáË
                        }
                        else //»1ûêÕμ½0X0D
                        {       
                                if(aRxBuffer[0]==0x0d)
                                        USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))
                                                USART_RX_STA=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ          
                                }                 
                        }
                }

        }
}

//′®¿ú1ÖD¶Ï·tÎñ3ìDò
void USART1_IRQHandler(void)                       
{
        u32 timeout=0;
        u32 maxDelay=0x1FFFF;

        HAL_UART_IRQHandler(&UART1_Handler);        //μ÷óÃHAL¿aÖD¶Ï′|àí1«óÃoˉêy
       
        timeout=0;
  while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//μè′y¾íD÷
        {
         timeout++;////3¬ê±′|àí
     if(timeout>maxDelay) break;               
       
        }
     
        timeout=0;
        while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//ò»′Î′|àííê3éÖ®oó£¬ÖØD¿aÆôÖD¶Ï2¢éèÖÃRxXferCountÎa1
        {
         timeout++; //3¬ê±′|àí
         if(timeout>maxDelay) break;       
        }
}
#endif       

/*ÏÂÃæ′úÂëÎòÃÇÖ±½ó°ÑÖD¶Ï¿ØÖÆÂß¼-D′ÔúÖD¶Ï·tÎñoˉêyÄú2¿¡£*/
/*


//′®¿ú1ÖD¶Ï·tÎñ3ìDò
void USART1_IRQHandler(void)                       
{
        u8 Res;
        if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
        {
        HAL_UART_Receive(&UART1_Handler,&Res,1,1000);
                if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
                {
                        if(USART_RX_STA&0x4000)//½óêÕμ½áË0x0d
                        {
                                if(Res!=0x0a)USART_RX_STA=0;//½óêÕ′íÎó,ÖØD¿aê¼
                                else USART_RX_STA|=0x8000;        //½óêÕíê3éáË
                        }
                        else //»1ûêÕμ½0X0D
                        {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ          
                                }                 
                        }
                }                    
        }
        HAL_UART_IRQHandler(&UART1_Handler);       
}
#endif       
*/
回复

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-9-25
在线时间
17 小时
 楼主| 发表于 2018-5-22 07:56:59 | 显示全部楼层
u8 aRxBuffer[1];

void USART1_IRQHandler(void)                       
{
        u32 timeout=0;
        u32 maxDelay=0x1FFFF;

        HAL_UART_IRQHandler(&UART1_Handler);        //μ÷óÃHAL¿aÖD¶Ï′|àí1«óÃoˉêy
       
        timeout=0;
  while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//μè′y¾íD÷
        {
         timeout++;////3¬ê±′|àí
     if(timeout>maxDelay) break;               
        }
     
        timeout=0;
        while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//ò»′Î′|àííê3éÖ®oó£¬ÖØD¿aÆôÖD¶Ï2¢éèÖÃRxXferCountÎa1
        {
         timeout++; //3¬ê±′|àí
         if(timeout>maxDelay) break;       
        }
       
        switch (State_Receive)
        {               
                case State_Receive_Head1:
                        if(aRxBuffer[0]==0xAA)
                        {
                                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);                                       
                                State_Receive=State_Receive_Head2;                       
                        }
                        break;
                case State_Receive_Head2:                       
                        if(aRxBuffer[0]==0x55)
                        {
                                State_Receive=State_Receive_Data;               
                                RxIndex=0;
                        }
                        else if(aRxBuffer[0]==0xAA)
                                State_Receive=State_Receive_Head2;
                        else
                                State_Receive=State_Receive_Head1;       
                        break;       
                case State_Receive_Data:
                        RxBuffer[RxIndex+2]=aRxBuffer[0];
                        RxIndex++;
                        if(RxIndex>=25)
                        {
                                State_Receive=State_Receive_Head1;       
                                RxIndex=0;                               
                                //osMessagePut(Queue_RecHandle,1,osWaitForever);
                        }
                        break;
        }                               
               
}

用原子哥的,把我的状态机揉进去,好了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 17:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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