外部中断和定时器联用后的一个小BUG

2019-08-15 16:22发布

void TIM5_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
        {
                g_mode.mode();
        }
        TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}

这是一个函数定时访问

void EXTI1_IRQHandler(void)
{
        g_exti.exti_flag ++;                                                                                                                                                                                                               
        g_mode.MODE_data.exti_count = g_exti.exti_flag;                                                                                                                                                                                                                                       
        EXTI_ClearITPendingBit(EXTI_Line1);                                                                                                                                                                 
}

这是一个外部中断  记下访问次数赋给  g_mode.MODE_data.exti_count

void Mode(void)
{
        if(g_mode.MODE_data.timer1_flag == 0)
        {
                g_mode.MODE_data.timer1_flag = 1;                                                                                                                                                                        //ÅD¶Ï±êÖ¾ÖÃ1
               
                if(g_mode.MODE_data.exti_count--)
                {                       
                                GPIO_ResetBits(GPIOA,GPIO_Pin_7);        //下面是另一个定时器写的定时函数
                                SoftwareTimers.Register_fun(g_motor.motor_left, 1, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 5, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 10, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_mid, 15, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 20, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 25, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_right, 30, 0);
                               
                                SoftwareTimers.Register_fun(g_camera.camera_on, 35, 0);
                                SoftwareTimers.Register_fun(g_camera.camera_off, 40, 0);
                               
                                SoftwareTimers.Register_fun(g_motor.motor_mid, 45, 0);
                               
                                SoftwareTimers.Register_fun(g_mode.clear_flag, 46, 0);
                }
        }
}

void Clear_Flag(void)
{
        g_mode.MODE_data.timer1_flag = 0;
}


这是那个定时触发的函数,标志最后清除

#ifndef __EXTI_H
#define __EXTI_H

#include "user_conf.h"  
#define pulse_mode_rising         1                               
#define capture_pulse 1

typedef struct
{
        u32 exti_flag;
        void(*exti_init)(void);       
}Exti_Fun;

void Exti_Init_Fun(void);

extern Exti_Fun g_exti;

#endif  


头文件exti.h

#ifndef __MODE_H
#define __MODE_H

#include "user_conf.h"  

typedef struct
{
        u8 timer1_flag;
        u32 exti_count;
}modedata;


typedef struct
{
  modedata MODE_data;
        void(*mode)(void);
        void(*clear_flag)(void);
}Mode_Fun;

void Mode(void);
void Clear_Flag(void);

extern Mode_Fun g_mode;

#endif


头文件 mode.h

现在的BUG是  外部中断来了之后  函数在if(g_mode.MODE_data.exti_count--) 判断不过,实时调试g_mode.MODE_data.exti_count为5为6仍进不去
我如果我把if(g_mode.MODE_data.exti_count--) 去掉
会定时触发


请各位看一下




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wxjhby
1楼-- · 2019-08-16 16:01
我想说 不可能进不去的,试试设一个简单的变量,不要这么多的结构体
cromarti
2楼-- · 2019-08-16 17:52
试试在定义exti_coun前面加volatile,原因可以百度volatile的用处
一路有你
3楼-- · 2019-08-16 23:06
 精彩回答 2  元偷偷看……

一周热门 更多>