找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2519|回复: 0
打印 上一主题 下一主题
收起左侧

STM32外部中断笔记

[复制链接]
跳转到指定楼层
楼主
ID:185378 发表于 2017-4-1 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
外部中断:
EXTI0-----EXTI15  (由于中断向量表有限,有几个中断公用一个中断向量)
中断向量表(内中断(灰色区域)和外中断)
其中
PA0--PG0对应的使EXTI0
PA1--PG1对应的是EXTI1
.......
PA15--PG15对应的是EXTI15
外部终端应用:

实例:
PA0引脚位外部终端输入引脚,实现以下功能:每产生一次外部终端,PA1所接入的LED等的状态取反。
程序编程步奏:
第一步:
首先配置引脚模式(PA0输入上拉50MHz,PA1推挽输出50MHz)
void FUN_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_Config;
//设置GPIOA模式
GPIO_Config.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Config.GPIO_Pin=GPIO_Pin_1;
GPIO_Config.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Config);
GPIO_InitTypeDef GPIO_Config2;
//设置GPIOA模式
GPIO_Config2.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_Config2.GPIO_Pin=GPIO_Pin_0;
GPIO_Config2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Config2);
}
第二步:配置外部中断初始化
void FUN_EXIT_Config(void)
{
                EXTI_InitTypeDef EXTI_InitStructure;

                EXTI_ClearFlag(EXTI_Line0);//清除 EXTI 线路挂起标志位,使中断响应及时
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//将PA0设置为中断引脚

                EXTI_InitStructure.EXTI_Line = EXTI_Line0;//PA0对应的
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);
}

第三步:时钟使能配置
void FUN_SystemClock_Config(void)
{
        SystemInit();//系统时钟初始化
        //初始化GPIOB的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开A管脚时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开GPIO的辅助功能时钟
}

第四步:中断优先级配置
/*
配置中断优先级NVIC
*/
void FUN_NVIC_Config(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;

                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
                NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
}

第五步:中断服务函数配置
void EXTI0_IRQHandler(void)
{
   if(EXTI_GetITStatus(EXTI_Line0)==1)
         {
                        EXTI_ClearFlag(EXTI_Line0);//清除 EXTI 线路挂起标志位,使中断响应及时
                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1))
                        GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                 else
                         GPIO_SetBits(GPIOA,GPIO_Pin_1);
         }
}
最后,编写主函数
int main(void)
{
//系统初始化部分
        FUN_SystemClock_Config();//时钟初始化
        FUN_GPIO_Config();//IO初始化
        FUN_EXIT_Config();//外部中断初始化        
        FUN_NVIC_Config();//中断优先级初始化

        while(1);
}

总结:
[size=10.5000pt]1.时钟:挂载引脚的复用功能时钟(RCC_APB2Periph_AFIO,挂载输出引脚的时钟(RCC_APBPeriph_GPIOA),以及首先初始化(System_Init())。
[size=10.5000pt]2.引脚模式:PA0,上拉输入(中断输入引脚);PA1,推挽输出。
[size=10.5000pt]3.中断配置:参数配置结构体
typedef struct
{
u32 EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTIrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
} EXTI_InitTypeDef;
除此之外,还需要指定中断引脚(GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0))。清除中断标志位(EXTI_ClearFlag(EXTI_Line0))。
[size=10.5000pt]4.中断优先级配置
NVIC_InitTypeDef NVIC_InitStructure这个结构体的参数
5.中断服务函数
void EXTI0_IRQHandler(void);

这些步奏缺一不可。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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