GPIO端口复用为外部中断信号输入端,控制PA1端口电平变化,使用MDK
E_inter.c 代码如下,其它使用keil自带的文件
#include "stm32f10x_lib.h"
void RCC_cfg() //时钟设置
{ //打开PA端口时钟,由于GPIO用作中断输入,属于端口复用,故也需要打开复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
}
void NVIC_cfg() //设置中断
{
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//选择中断分组2,3个中断源,需2bit进行优先级设置
//高两位用于设置抢占式 优先级;
//低两位用于设置响应式 优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel; //选择中断通道2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //选择中断通道3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //选择中断通道5
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}
void IO_cfg() //GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择使用的引脚 PA1做led指示
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置端口翻转速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置端口工作模式 推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA.1引脚
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //将PA.1引脚设置为低电平输出,LED灯灭
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; //选择引脚2 3 5 作为中断信号输入端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入模式为浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure); //设置PA.2 /PA.3 /PA.5
}
//由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来
void EXTI_cfg() //将相应的IO口与中断线路进行连接
{
EXTI_InitTypeDef EXTI_InitStructure; //定义结构体变量
EXTI_ClearITPendingBit(EXTI_Line2); //清空中断标志 PA.2 中断口
EXTI_ClearITPendingBit(EXTI_Line3); // PA.3 中断口
EXTI_ClearITPendingBit(EXTI_Line5); // PA.5 中断口
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2); //选择中断管脚PA.2 PA.3 PA.5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line5; //选择中断线路2 3 5
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //设置中断触发方式为上下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
int main()
{
RCC_cfg(); //设置时钟
IO_cfg(); //GPIO设置
NVIC_cfg(); //中断管理设置
EXTI_cfg(); //GPIO与中断线路的连接
while(1);
}
//文件说明:
////库函数的默认路径为: ...\keil\arm\rv31\lib\st\stm32f10x
//1:时钟设置,使用库文件stm32f10x_rcc.c
//2:中断管理,使用库文件stm32f10x_nvic.c ;
// 另cortexm3_macro.s 为中断管理库文件所需 ,为内核中特殊的指令操作
//3:GPIO设置,使用库文件stm32f10x_gpio.c
//4:GPIO与中断线路的连接,使用库文件stm32f10x_exti.c
//5:中断函数,位于 stm32f10x_it.c 中,具体的中断操作代码如下:(找到具体的函数位置,将如下函数体写入中断函数内)
/*
void EXTI2_IRQHandler(void) //PA.2中断信号的响应函数 抢占优先级:0/响应优先级:0
{
GPIO_SetBits(GPIOA,GPIO_Pin_1); //将PA.1端口置位,点亮LED
EXTI_ClearITPendingBit(EXTI_Line2); //清空中断标志位,防止持续进入中断
}
void EXTI3_IRQHandler(void) //PA.3中断信号的响应函数 抢占优先级:0/响应优先级:0
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //将PA.1端口清零,熄灭LED
EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI9_5_IRQHandler(void) //PA.5中断信号的响应函数 抢占优先级:0/响应优先级:0
{
u8 ReadValue; //定义 存储端口状态 的变量
ReadValue = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1); //读取PA1端口的当前状态
if(ReadValue == 0) //若该端口当前为低电平 ,
{
GPIO_SetBits(GPIOA,GPIO_Pin_1); //将其改为高电平输出 ;
}
else //若该端口当前为高电平,
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //将其改为低电平输出;
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
本文来源:https://www.2haoxitong.net/k/doc/a2924727453610661ed9f4bf.html
文档为doc格式