定时器中断服务函数处理问题

2019-07-20 17:48发布

本帖最后由 lkjhbbb 于 2016-12-21 19:27 编辑

我做的项目是基于485的modbus的一个通讯,然后第一步已经先实现了所需的功能,代码如下:
int main(void)
{
        delay_init();
        uart_init(9600);   //串口初始化
        TIM2_Configuration();//TIM2  MDOBUS-3.5T
        
        while(1)
        {
                if(Uart1_rev_flag == 0x01)
                {        
                        Uart1_rev_flag = 0x00;//接收一帧数据标志清零
                    delay_ms(5);
                        GPIO_ResetBits(GPIOB, GPIO_Pin_0);//485send
                        ParseRecieve();//数据帧处理函数
                delay_ms(5);//发送完成后不能马上置于接收状态
                        GPIO_SetBits(GPIOB,GPIO_Pin_0);//485接收
                        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//允许接收中断        
                }
        }
        
}

其中为当接收完一帧数据后所给定的标志位,当接收到数据后,Uart1_rev_flag == 0x01,便会进行相应的处理,而实验现象也基本符合结果,但是在我的处理函数中加了两个延时函数   delay_ms(5);,因为项目要求,这两个延时不能直接加在主程序中,我就打算利用定时来做延时,但是试了好一阵子一直出不来现象,然后用中断调节,单步也跳的结果很乱找不出问题,下面给我修改后的程序,能帮我看一下我的思路有问题吗
主函数改为:
while(1)
        {
                if(Uart1_rev_flag == 0x01)
                {        
                        Uart1_rev_flag = 0x00;//接收一帧数据标志清零
                        fistdly = 1;      //标志第一次延时开始
                        fst_time = 0;    //延时时间计数
                  
                        
                }
               
                if(first_flag == 0x01)     //进行第一次延时后的处理
                {        
                        first_flag = 0x00;
                        fistdly = 0;
                  
                        GPIO_ResetBits(GPIOB, GPIO_Pin_0);//485send
                        ParseRecieve();//数据帧处理函数
                        second_dly =1;
                        fst_time = 0;
                        second_time = 0;
                        
                }
               
                if(second_flag == 0x01)     //进行第二次延时后的处理
                {
                        second_flag = 0x00;
                        second_dly =0;
                        GPIO_SetBits(GPIOB,GPIO_Pin_0);//485接收
                        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//允许接收中断        
                        second_time = 0;
                }
               
        }



然后是用定时器定为1秒,在中断服务程序里面进行操作:
void TIM2_IRQHandler(void)
{


   if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//判断是否发生TIM2更新中断
   {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除TIM2的中断待处理位
                TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM2待处理标志位
           
               
           if(fistdly ==1)   //第一次延时
           {
                   if(fst_time<5)
                           fst_time++;
                   else
                           first_flag = 0x01;              //当延时5秒后给定标志位
           }
           
           if(second_dly ==1)
                {
                   if(second_time<5)
                           second_time++;
                   else
                           second_flag = 0x01;            
           }   
        }

}



在主程序中,ParseRecieve();这个是主要对modbus协议的规定进行相应的处理,并且里面包含把返回帧发回串口。




我主要的思路就是利用定时器来延时,但一直找不到问题,大家能帮我看看是我的思路有问题吗?或者有更简单的方法做定时器延时吗?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。