搜索
bottom↓
回复: 2

大家帮忙看下,外部中断事件错误

[复制链接]

出0入0汤圆

发表于 2014-10-21 11:30:14 | 显示全部楼层 |阅读模式
/**********************************(c) COPYRIGHT 2014 CYF**************************************
*        File        Name                                                :        AM2303.C
*        Author                                                                : CYF
*        Version                                                                :        V1.0.0.0
*        Date                                                                        : 2014.10.16
*        Description                                                :        am2303 drive base to RT-Thread
*********************************************************************************************/

/*        include---------------------------------------------------------------------------------*/
#include"rtthread.h"

#include"stm32f10x.h"

#include"exti.h"

/*        define---------------------------------------------------------------------------------*/

/*        variables-----------------------------------------------------------------------------*/


//static        struct        rt_event        event_Door1;
//static        struct        rt_event        event_Door2;
//static        struct        rt_event        event_AC220V;
//static        struct        rt_event        event_DC48V;
//static        struct        rt_event        event_LED1;
//static        struct        rt_event        event_LED2;
static        struct        rt_event        event;

/*        functions-----------------------------------------------------------------------------*/
static        void        RCC_EXTI_Configuration(void)
{
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG,ENABLE);                       
}

static        void        GPIO_EXTI_Configuration(void)
{
                GPIO_InitTypeDef        GPIO_InitStructure;
               
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;  //  PD10 浮空输入 连接LM339芯片的OUT1 第一路开关量检测输入
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                                   //  PD11 浮空输入 连接LM339芯片的OUT2 第二路开关量检测输入
                GPIO_Init(GPIOD, &GPIO_InitStructure);                                                                                              //  PD12 浮空输入 连接LM339芯片的OUT3 第三路开关量检测输入
               
                /*GPIOG 管脚定义*/
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //  PG0 上拉输入 掉电状态检测1
                GPIO_Init(GPIOG, &GPIO_InitStructure);                          //  PG1 浮空输入 掉电状态检测2                                                                                                                                                                  //  PD13 浮空输入 连接LM339芯片的OUT4 第四路开关量检测输入
}

static        void        EXTI_EXTI_Configuration(void)
{
                EXTI_InitTypeDef EXTI_InitStructure;

                GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource10 );
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource11 );
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource12 );
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13 );         
                EXTI_InitStructure.EXTI_Line = EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13;
       
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;         //设置为上升沿和下降沿都发送终端请求
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);
               
               
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource0 );
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource1 );
                EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;               
       
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;         //设置为上升沿和下降沿都发送终端请求
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);
}

static        void        NVIC_EXTI_Configuration(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;
//                NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

                NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //中断通道
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      //从优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
       
                NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                 //中断通道
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;      //从优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
       
                NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                 //中断通道
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //从优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
}

static        void        rt_hw_exti_init(void)
{
                RCC_EXTI_Configuration();
                GPIO_EXTI_Configuration();
                EXTI_EXTI_Configuration();
                NVIC_EXTI_Configuration();                
}

static        void        rt_sw_exti_init(void)
{
//           rt_event_init(&event_Door1,"Door1",RT_IPC_FLAG_FIFO);
//           rt_event_init(&event_Door2,"Door2",RT_IPC_FLAG_FIFO);
//           rt_event_init(&event_LED1,"LED1",RT_IPC_FLAG_FIFO);
//           rt_event_init(&event_LED2,"LED2",RT_IPC_FLAG_FIFO);
//           rt_event_init(&event_DC48V,"DC48V",RT_IPC_FLAG_FIFO);
//           rt_event_init(&event_AC220V,"AC220V",RT_IPC_FLAG_FIFO);
           rt_event_init(&event,"event",RT_IPC_FLAG_FIFO);       
}

void exit0_interrupt_handle(void)
{
           if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
                {
                 EXTI_ClearITPendingBit(EXTI_Line0);
                 rt_event_send(&event,(1<<3));
                // AC220V_Flag = GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_0);                         
                }
}

void exit1_interrupt_handle(void)
{
           if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
                {
                 EXTI_ClearITPendingBit(EXTI_Line1);
                 rt_event_send(&event,(1<<4));
                // AC220V_Flag = GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_0);                         
                }
}

void exit15_10_interrupt_handle(void)
{
           if(EXTI_GetITStatus(EXTI_Line10)!= RESET)
                {
                        EXTI_ClearITPendingBit(EXTI_Line10);
                        rt_event_send(&event,(1<<5));
                //        LED1_Flag = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10);
                }
           if(EXTI_GetITStatus(EXTI_Line11)!= RESET)
                {
                        EXTI_ClearITPendingBit(EXTI_Line11);
                        rt_event_send(&event,(1<<6));
                //        LED2_Flag = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11);
                }
          if(EXTI_GetITStatus(EXTI_Line12)!= RESET)
                {
                        EXTI_ClearITPendingBit(EXTI_Line12);
                        rt_event_send(&event,(1<<7));
//                        Door_Flag1 = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12);
//                        if(!Door_Flag1)          Door1_Alarm_Flag = 0x01;
                       
                }
         if(EXTI_GetITStatus(EXTI_Line13)!= RESET)
                {
                        EXTI_ClearITPendingBit(EXTI_Line13);
                        rt_event_send(&event,(1<<8));
//                        Door_Flag2 = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13);
//                        if(!Door_Flag2)          Door2_Alarm_Flag = 0x01;
                       
                }
}

void        thread_exti_entry(void *parameter)
{
         rt_uint32_t e;

         rt_hw_exti_init();
         rt_sw_exti_init();

         while(1)
         {
                  if(rt_event_recv(&event,(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8),
                        RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e)==RT_EOK)
//                        rt_kprintf("有外部中断报警信息,请查看设备\n");
                        {
                           if((e&0x08)==0x08)
                                rt_kprintf("AC220V 报警信息,请查看设备\n");
                           if((e&0x10)==0x10)
                                rt_kprintf("DC48V 报警信息,请查看设备\n");
                           if((e&0x20)==0x20)
                                rt_kprintf("LED1 报警信息,请查看设备\n");
                           if((e&0x40)==0x40)
                                rt_kprintf("LED2 报警信息,请查看设备\n");
                           if((e&0x80)==0x80)
                                rt_kprintf("Door1 报警信息,请查看设备\n");
                           if((e&0x100)==0x100)
                                rt_kprintf("Door2 报警信息,请查看设备\n");
                        }
         }
}

这是我基于RTTHREAD 2.0写的外部中断的程序,各位大写帮忙看下,为什么老是报Door2报警信息。而其他的外部中断根本就进不去。


两外,这是我在stm32f10x_it.c中的程序:
void EXTI0_IRQHandler(void)
{
         extern void exit0_interrupt_handle(void);
         rt_interrupt_enter();
         exit0_interrupt_handle();
         rt_interrupt_leave();
}

void EXTI1_IRQHandler(void)
{
        extern void exit1_interrupt_handle(void);
        rt_interrupt_enter();
        exit1_interrupt_handle();
        rt_interrupt_leave();
}
void EXTI15_10_IRQHandler(void)
{
        extern void exit15_10_interrupt_handle(void);
        rt_interrupt_enter();
        exit15_10_interrupt_handle();
        rt_interrupt_leave();
}


下面是我在application.c中的程序:
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t exti_stack[ 1024 ];
static struct rt_thread exti_thread;
extern void        thread_exti_entry(void *);

下面为启动线程:
result = rt_thread_init(&exti_thread,
                            "exti",
                            thread_exti_entry,
                            RT_NULL,
                            (rt_uint8_t*)&exti_stack[0],
                            sizeof(exti_stack),
                            18,
                            10);
    if (result == RT_EOK)
    {
        rt_thread_startup(&exti_thread);
    }

出0入0汤圆

发表于 2014-10-22 10:01:30 | 显示全部楼层
1 单独调试你的外部中断功能
2 把接收到的事件e(32bit)打印出来

出0入0汤圆

 楼主| 发表于 2014-10-22 15:16:41 | 显示全部楼层
pangweishen 发表于 2014-10-22 10:01
1 单独调试你的外部中断功能
2 把接收到的事件e(32bit)打印出来

调试过了,e就是0x00000100.但是我硬件什么都没操作,测量中端口一直是高电平。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 11:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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