实验3-5 EXTI_Config(标准库)
本实验将使用STM32的V3.5.0库函数完成对外部中断线EXTI_Line5和EXTI_Line6的设置,实验中按下并松开KEY1按键时,上升沿触发中断EXTI_Line5,并通过LED1指示中断发生;按下KEY2 按键时,下降沿触发中断EXTI_Line6,并通过LED2指示中断发生。
1.硬件设计
AS-07实验板的LED电路和按键电路的原理图如图3-39所示。完整的电路原理图见2.2.2小节的图2-23~图2-25。
2.软件设计(编程)
使用STM32的V3.5.0库函数进行编程的关键程序段如下。
① 主函数main在文件main.c中,源程序如下。
int main(void) //主函数。
{
STM_EVAL_LEDInit(LED1); //初始化LED1
STM_EVAL_LEDInit(LED2); //初始化LED2
EXTI9_5_Config(); //设置EXTI9_5中断
EXTI_GenerateSWInterrupt(EXTI_Line5);//产生一次EXTI_Line5软件中断
EXTI_GenerateSWInterrupt(EXTI_Line6); //产生一次EXTI_Line6软件中断
while (1) //等待中断发生
{}
}
③中断配置函数EXTI9_5_Config在文件main.c中,源程序如下。
void EXTI9_5_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能GPIOE的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置PE5和PE6为浮空输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO的时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5 ); //PE5配置为EXTI5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource6); //PE6配置为EXTI6
EXTI_InitStructure.EXTI_Line = EXTI_Line5; //设置中断线是EXTI_Line5
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置EXTI为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//设置上升沿触发中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI
EXTI_Init(&EXTI_InitStructure); //初始化EXTI
EXTI_InitStructure.EXTI_Line = EXTI_Line6; //设置中断线是EXTI_Line6
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置EXTI为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置下降沿触发中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI
EXTI_Init(&EXTI_InitStructure); //初始化EXTI
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //中断通道是EXTI9_5
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0x0;//设置占先式优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; //设置副优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC中断
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
④中断处理函数EXTI9_5_IRQHandler在文件stm32f10x_it.c中,源程序如下。
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)//判断是否是EXTI_Line5中断
{
STM_EVAL_LEDToggle(LED1); //PC6取反输出,LED1指示EXTI_Line5中断的发生
EXTI_ClearITPendingBit(EXTI_Line5); //清除中断挂起位,为下次判断中断做准备
}
if(EXTI_GetITStatus(EXTI_Line6) != RESET)//判断是否是EXTI_Line6中断
{
STM_EVAL_LEDToggle(LED2); //PC7取反输出,LED2指示EXTI_Line6中断的发生
EXTI_ClearITPendingBit(EXTI_Line6); //清除中断挂起位,为下次判断中断做准备
}
}