通过上面的图配置寄存器,有23个外部中断如图下 根据外部中断,9 System configuration controller (SYSCFG) 的章节,SYSCFG external interrupt configuration register 1(SYSCFG_EXTICR1~4)配置中断源和引脚,
相关中断看参考手册SYSCFG 和中断和事件、Core_m4 NVIC 的章节 1、配置按键中断的步骤
(1)配置PA0和PC13的GPIO引脚的类型模式 (2)配置在SYSCFg中断源和引脚 (3)使能相关时钟,(GPIO和SYSCFG) (4)/* 选择 EXTI 中断源 */ (5)配置嵌套向量中断控制器NVIC 编程如下、 #include “ygcKeyItr.h”
void ygcNVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn; NVIC_Init(&NVIC_InitStruct); }
void ygcEXTI_Key_Config(void) { /定义一个GPIO_InitTypeDef类型的结构体/ GPIO_InitTypeDef GPIO_InitStructure; //使能GPIO时钟 RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC,ENABLE); // 配置PA0和PC13 输入模式引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // 定时PC13引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; GPIO_Init(GPIOC, &GPIO_InitStructure); //使能SYSCFG时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* 连接 EXTI 中断源 到key1引脚 / SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOA, EXTI_PinSource0); / 连接 EXTI 中断源 到key2引脚 */ SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOC, EXTI_PinSource13);
/*初始化中断源*/
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line0;//外部中断通道PA0
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line=EXTI_Line13;外部中断通道PC13
EXTI_Init(&EXTI_InitStruct);
/* 第三步:配置NVIC */
ygcNVIC_Configuration();
/* 配置中断函数*/
} void EXTI0_IRQHandler(void)//PA0 中断函数 { //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) { // LED1 取反 LED1_TOGGLE; //清除中断标志位 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } }
void EXTI15_10_IRQHandler(void)//PC13 中断函数 { //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) { // LED2 取反 LED2_TOGGLE; //清除中断标志位 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); } }
|