STM32单片机外部中断,不会写

STM32单片机外部中断,不会写

问题描述:

img

          1:47 口251%0
人 外部中断
1.简答题
             KI
                                                   PB1
 DGND
                                    LED1 PA1
               IK
                                    LED2 PA2
 DC3.3V-
              IK
                                    LED3 PA3
              IK
 通过键盘产生外部中断,控制LED,当K1按
 下时,3个LED依次点亮构成流水灯
 所写代码及编译结果截图提交
 输入答案

int flag = 0;
int main()
{
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    LED_Init();
    KEY_Init();
    My_EXTI_Init();  //外部中断初始化
    while(1)
    {
        if(flag==1)
        {
            GPIO_ResetBits(GBIOA,GPIO_Pin_1);
            delay_ms(1000);    
           GPIO_SetBits(GBIOA,GPIO_Pin_1); 
            delay_ms(1000);    
          GPIO_ResetBits(GBIOA,GPIO_Pin_2);
            delay_ms(1000);    
           GPIO_SetBits(GBIOA,GPIO_Pin_2); 
            delay_ms(1000);    
          GPIO_ResetBits(GBIOA,GPIO_Pin_3);
            delay_ms(1000);    
           GPIO_SetBits(GBIOA,GPIO_Pin_3); 
         
        }
    
    }
}


void LED_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //选择你要设置的IO口
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     //设置推挽输出模式
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      //设置传输速率
    GPIO_Init(GPIOA,&GPIO_InitStructure);        /* 初始化GPIO */
    
    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);   //将LED端口拉高,熄灭所有LED
}
void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;    //上拉输入
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GBIOB,&GPIO_InitStructure);
}

void My_EXTI_Init(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef  EXTI_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//选择GPIO管脚用作外部中断线路
    
    
    //EXTI1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//EXTI1中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

    EXTI_InitStructure.EXTI_Line=EXTI_Line1; 
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_Init(&EXTI_InitStructure);
extern int flag;
void EXTI1_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1)==1)
    {
            flag = 1;
    }
    EXTI_ClearITPendingBit(EXTI_Line1);
}