测试方式:
主芯片:STM32F103CBT6
PA1/PB2接键盘按键
PA6/PA4接LCD
PA1—PA4
PB2---PA6
按键被按下后LCD灯亮
实现步骤:
- 设置相应时钟
- 设置相应中断
- IO口初始化
- 把相应的IO口设置成中断线并初始化
- 在选择的中断通道的响应函数中中断函数
设置相应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE);
设置相应中断
NVIC_InitTypeDef exti_nvic;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
exti_nvic.NVIC_IRQChannel=EXTI1_IRQn; //选择中断线,中断线必须与中断IO脚对应,
//如果P1作为中断脚就必须使用EXTI1_IRQn,如果P2作为中断脚就必须使用EXTI2_IRQn
exti_nvic.NVIC_IRQChannelPreemptionPriority=1;
exti_nvic.NVIC_IRQChannelSubPriority =1;
exti_nvic.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&exti_nvic);////
exti_nvic.NVIC_IRQChannel=EXTI2_IRQn;
exti_nvic.NVIC_IRQChannelPreemptionPriority=2;
exti_nvic.NVIC_IRQChannelSubPriority =2;
exti_nvic.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&exti_nvic);////
初始化IO
GPIO_InitTypeDef int_gpio;
int_gpio.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_4;
int_gpio.GPIO_Speed=GPIO_Speed_50MHz;
int_gpio.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOA,&int_gpio);
GPIO_WriteBit(GPIOA, GPIO_Pin_6 | GPIO_Pin_4, Bit_SET);
int_gpio.GPIO_Pin=GPIO_Pin_2;
int_gpio.GPIO_Speed=GPIO_Speed_50MHz;
int_gpio.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB,&int_gpio);
int_gpio.GPIO_Pin=GPIO_Pin_1;
int_gpio.GPIO_Speed=GPIO_Speed_50MHz;
int_gpio.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA,&int_gpio);
把相应IO设置成中断线并初始化
EXTI_InitTypeDef EXTI_InitStructure;
//清中断标记
EXTI_ClearITPendingBit(EXTI_Line1);
EXTI_ClearITPendingBit(EXTI_Line2);
//选择中断管脚
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line1 | EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
中断服务程序
void EXTI1_IRQHandler(void)
void EXTI2_IRQHandler(void)
主函数
Main()
{
//设置相应时钟
EXTI_SetTime();
//IO口初始化
EXTI_InitIO(); //先初始化IO
//设置好相应中断
EXTI_SetNVIC();
//设置IO为中断线路
EXTI_SetIO();
while();
}