|
/**********************************(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);
} |
|