标题: STM32外部中断笔记 [打印本页]
作者: dyingstraw 时间: 2017-4-1 15:13
标题: STM32外部中断笔记
外部中断:
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);
这些步奏缺一不可。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |