OpenEdv-开源电子网

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

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

[复制链接]

11

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-9-29
在线时间
24 小时
发表于 2016-12-21 14:04:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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协议的规定进行相应的处理,并且里面包含把返回帧发回串口。




我主要的思路就是利用定时器来延时,但一直找不到问题,大家能帮我看看是我的思路有问题吗?或者有更简单的方法做定时器延时吗?谢谢

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-25 23:59:00 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 20:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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