以下外部中断程序已经做了两天了 ,可还是进不了外部中断,崩溃中......该中断的功能很简单,就是三个按键 分别控制对应的三个灯
/*---------INCLUDE------------*/
#include "stm32f10x.h"
#include <stdio.h>
/*--------LED相关定义------------*/
#define RCC_LED RCC_APB2Periph_GPIOE
#define LED_PORT GPIOE
#define DS1 GPIO_Pin_3
#define DS2 GPIO_Pin_4
#define DS3 GPIO_Pin_5
#define DS4 GPIO_Pin_6
#define LED_ALL DS1|DS2|DS3|DS4
/*--------KEY相关定义------------*/
#define RCC_KEY RCC_APB2Periph_GPIOE
#define KEY_PORT GPIOE
#define KEY1 GPIO_Pin_8
#define KEY1_EXTI_LINE EXTI_Line8
#define KEY1_PORT_SOURCE GPIO_PortSourceGPIOE
#define KEY1_Pin_SOURCE GPIO_PinSource8
#define KEY1_IRQn EXTI9_5_IRQn
#define KEY2 GPIO_Pin_9
#define KEY2_EXTI_LINE EXTI_Line9
#define KEY2_PORT_SOURCE GPIO_PortSourceGPIOE
#define KEY2_Pin_SOURCE GPIO_PinSource9
#define KEY2_IRQn EXTI9_5_IRQn
#define KEY3 GPIO_Pin_10
#define KEY3_EXTI_LINE EXTI_Line10
#define KEY3_PORT_SOURCE GPIO_PortSourceGPIOE
#define KEY3_Pin_SOURCE GPIO_PinSource10
#define KEY3_IRQn EXTI15_10_IRQn
/*-----------Private variables-----------*/
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*-------------定时器相关定义-----------*/
static u8 fac_us=0;
static u16 fac_ms=0;
/*-----------函数声明-------------*/
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
void Turn_on_LED_ALL(void);
void Turn_off_LED_ALL(void);
void Led_Turn_on_1(void);
void Led_Turn_on_2(void);
void Led_Turn_on_3(void);
void Led_Turn_on_4(void);
/*---------------初始化函数----------------*/
void LED_Init(void) //初始化LED
{
RCC_APB2PeriphClockCmd(RCC_LED,ENABLE);
GPIO_InitStructure.GPIO_Pin = DS1|DS2|DS3|DS4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT,&GPIO_InitStructure);
}
void KEY_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY1|KEY2|KEY3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}
void KEY_EXTI_Init(void)
{
EXTI_ClearITPendingBit(EXTI_Line8);
EXTI_ClearITPendingBit(EXTI_Line9);
EXTI_ClearITPendingBit(EXTI_Line10);
GPIO_EXTILineConfig(KEY1_PORT_SOURCE, KEY1_Pin_SOURCE);
EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(KEY2_PORT_SOURCE, KEY2_Pin_SOURCE);
EXTI_InitStructure.EXTI_Line = KEY2_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(KEY3_PORT_SOURCE, KEY3_Pin_SOURCE);
EXTI_InitStructure.EXTI_Line = KEY3_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Config(void)
{
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
/* Configure the Priority Group to 2 bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* Enable the EXTI Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = KEY1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = KEY2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = KEY3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*------------主函数---------------*/
int main(void)
{
LED_Init();
delay_init(72);
Turn_off_LED_ALL();/*关闭所有的LED指示灯*/
delay_ms(500);
Led_Turn_on_1();
delay_ms(500);
Turn_off_LED_ALL();
delay_ms(500);
Led_Turn_on_1();
delay_ms(500);
Turn_off_LED_ALL();
delay_ms(500);
Led_Turn_on_1();
delay_ms(500);
Turn_off_LED_ALL();
delay_ms(500);
KEY_Init();
KEY_EXTI_Init();
NVIC_Config();
while(1) //等待中断
{
}
}
/*--------------函数配置--------------*/
void Turn_on_LED_ALL(void) //打开所有灯
{
GPIO_SetBits(LED_PORT,LED_ALL);
}
void Turn_off_LED_ALL(void) //关闭所有灯
{
GPIO_ResetBits(LED_PORT,LED_ALL);
}
void Led_Turn_on_1(void) //打开灯1
{
/* Turn On LED1 */
GPIO_SetBits(LED_PORT, DS1);
}
void Led_Turn_on_2(void) //打开灯2
{
/* Turn On LED2 */
GPIO_SetBits(LED_PORT, DS2);
}
void Led_Turn_on_3(void) //打开灯3
{
/* Turn On LED3 */
GPIO_SetBits(LED_PORT, DS3);
}
void Led_Turn_on_4(void) //打开灯4
{
/* Turn On LED3 */
GPIO_SetBits(LED_PORT, DS4);
}
/*-------------延时函数----------------*/
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延迟毫秒函数
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延迟微秒函数
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
关于中断响应函数
void EXTI9_5_IRQHandler(void) //KEY1 KEY2
{
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
GPIO_SetBits(GPIOE, GPIO_Pin_4);
EXTI_ClearITPendingBit(EXTI_Line8);
}
else
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
GPIO_SetBits(GPIOE, GPIO_Pin_5);
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
void EXTI15_10_IRQHandler(void) //KEY3
{
if(EXTI_GetITStatus(EXTI_Line10) != RESET)
{
GPIO_SetBits(GPIOE, GPIO_Pin_6);
EXTI_ClearITPendingBit(EXTI_Line10);
}
}
|