野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18231|回复: 4

18节 EXTI 外部代码中断代码讲解 作业

[复制链接]
发表于 2018-7-20 10:05:39 | 显示全部楼层 |阅读模式
增加KEY2
bsp_exti.h

#ifndef _BSP_EXTI_H
#define _BSP_EXTI_H

#include "stm32f10x.h"

//KEY2宏定义
#define KEY1_INT_GPIO_PIN      GPIO_Pin_0  //将KEY1对应的PIN宏定义,提高可读性
#define KEY1_INT_GPIO_PORT     GPIOA
#define KEY1_INT_GPIO_CLK      RCC_APB2Periph_GPIOA  //将RCC.C文件中的APB2 CLK使能形参宏定义


//KEY2宏定义
#define KEY2_INT_GPIO_PIN      GPIO_Pin_13  //将KEY2对应的PIN宏定义,提高可读性
#define KEY2_INT_GPIO_PORT     GPIOC
#define KEY2_INT_GPIO_CLK      RCC_APB2Periph_GPIOA  //将RCC.C文件中的APB2 CLK使能形参宏定义



bsp_exti.c
void EXIT_Key_config(void);

void EXTI0_IRQHandler(void);

void EXTI15_10_IRQHandler(void);


#endif /*_BSP_EXTI_H*/


#include"bsp_exti.h"



static void EXTI_NVIC_Config(void) //初始化NVIC,类型为static,只能被EXIT_Key_config调用
{
   NVIC_InitTypeDef   NVIC_InitStruct;      

        //配置KEY1 NVIC
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置优先级分组
         NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;  //配置channel
         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  //打开中断总开关
         NVIC_Init(&NVIC_InitStruct);   //调用NVIC 初始化函数
       
        //配置KEY2 NVIC
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置优先级分组
         NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;  //配置channel
         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  //打开中断总开关
         NVIC_Init(&NVIC_InitStruct);   //调用NVIC 初始化函数

       
       
}




void EXIT_Key_config(void)  //首先初始化GPIO
{  
       
        GPIO_InitTypeDef   GPIO_InitStruct;  //定义初始化一个结构体,GPIO_InitStruct的名字可以任意,前面的GPIO_InitTypeDef对应头文件里面的结构体定义,所以格式命名不能随便修改
        EXTI_InitTypeDef   EXTI_InitStruct;  //定义初始化EXTI结构体
       
        //配置中断优先级
       
        EXTI_NVIC_Config();
       
        //初始化KEY1
        RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);//注意:时钟的初始化要放到GPIO函数初始化之前,否则初始化无效果,也就是说先打开时钟端口才可以初始化
  GPIO_InitStruct.GPIO_Pin    =  KEY1_INT_GPIO_PIN ;
  GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_IN_FLOATING;
  //GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz; //端口设置为输入时不需要设置速度
       
        GPIO_Init(KEY1_INT_GPIO_PORT , &GPIO_InitStruct);  //调用初始化函数
       
        //初始化KEY2
        RCC_APB2PeriphClockCmd(KEY2_INT_GPIO_CLK, ENABLE);//注意:时钟的初始化要放到GPIO函数初始化之前,否则初始化无效果,也就是说先打开时钟端口才可以初始化
  GPIO_InitStruct.GPIO_Pin    =  KEY2_INT_GPIO_PIN ;
  GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_IN_FLOATING;
  //GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz; //端口设置为输入时不需要设置速度
       
        GPIO_Init(KEY2_INT_GPIO_PORT , &GPIO_InitStruct);  //调用初始化函数
       
       
       
       
        //初始化EXTI--KEY1
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO pin作为EXTI线
       
        EXTI_InitStruct.EXTI_Line    = EXTI_Line0;
  EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);  //调用初始化函数初始化EXTI
       
                //初始化EXTI--KEY2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//选择GPIO pin作为EXTI线
       
        EXTI_InitStruct.EXTI_Line    = EXTI_Line13;
  EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);  //调用初始化函数初始化EXTI
       
       
}

// 1,初始化NVIC 2,初始化相关GPIO



it.c
void EXTI0_IRQHandler(void) //EXTI0中断函数
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
                LED_G_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line0); //中断函数执行结束后清除中断标志位,退出中断
       
       
}

void EXTI15_10_IRQHandler(void) //EXTI15_10中断函数
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
        {
                LED_G_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line13); //中断函数执行结束后清除中断标志位,退出中断
       

}





















回复

使用道具 举报

 楼主| 发表于 2018-7-20 10:08:56 | 显示全部楼层
EXTI_NVIC_Config(void) 这个函数是不是可以优化?两个按键一定需要初始化两次吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-20 10:12:39 | 显示全部楼层
还有一个问题就是 视频里面提过如果PA0,PB0都挂在line0上中断触发的时候如何分辨PA0,PB0,是不是触发中断后在中断函数里面读取PA0和PB0的IDR来判断然后再指向对应的执行内容?
回复 支持 反对

使用道具 举报

发表于 2019-4-28 12:38:29 | 显示全部楼层
问一下,bsp_exti.h里的#define KEY2_INT_GPIO_CLK      RCC_APB2Periph_GPIOA  。为什么不是 RCC_APB2Periph_GPIOC?
回复 支持 反对

使用道具 举报

发表于 2020-2-7 19:37:13 | 显示全部楼层
重复的部分不需要初始化两次   另外感谢楼主的点拨
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 20:04 , Processed in 0.028761 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表