void EXTI_Configuration(void)

本文详细介绍了如何在微控制器中配置GPIO(通用输入输出)和中断初始化,包括GPIO的配置、中断触发模式设置、中断线选择及中断初始化函数的实现。

void EXTI_Configuration(void); //定义IO中断初始化函数

EXTI_Configuration();//IO中断初始化函数调用简单应用:

void EXTI_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;        //EXTI初始化结构定义

EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚选择
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式
  EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断
  EXTI_Init(&EXTI_InitStructure);//初始化
}

//        RCC初始化函数中开启I/O时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

//GPIO初始化函数中定义输入I/O管脚。
//IO输入,GPIOA的4脚输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化
//        在NVIC的初始化函数里面增加以下代码打开相关中断:
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;        //通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //响应级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //启动
  NVIC_Init(&NVIC_InitStructure);                                                                //初始化

 

 

 

/*******************************************************************************
设置GPIO基本参数
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  //根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5 ;
  //设置的IO为pin4与pin5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  /*  GPIO_Speed                  描述 
  GPIO_Speed_10MHz      最高输出速率10MHz 
  GPIO_Speed_2MHz        最高输出速率2MHz 
  GPIO_Speed_50MHz      最高输出速率50MHz
  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
/*
GPIO_Speed                    描述 
GPIO_Mode_AIN              模拟输入 
GPIO_Mode_IN_FLOATING 浮空输入 
GPIO_Mode_IPD              下拉输入 
GPIO_Mode_IPU              上拉输入 
GPIO_Mode_Out_OD       开漏输出 
GPIO_Mode_Out_PP        推挽输出 
GPIO_Mode_AF_OD        复用开漏输出 
GPIO_Mode_AF_PP         复用推挽输出通常有5种方式使用某个引脚功能,
它们的配置方式如下:
1)作为普通GPIO输入:
根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,
同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:
根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引
脚对应的所有复用功能模块。
3)作为普通模拟输入:
配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有
复用功能模块。
4)作为内置外设的输入:
根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,
同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:
根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能
该引脚对应的所有复用功能模块。1、模拟输入模式下,是用于AD输入时输入模拟量,此时施密特触
发器输入关闭,施密特触发器输出为0.
2、下拉输入:打开内部下拉电阻
3、上拉输入:打开内部上拉电阻
4、浮空输入 :这个输入模式,输入电平必须由外部电路确定,
要根据具体电路,加外部上拉电阻或下拉电阻。
5、推挽输出:可以输出高,低电平,连接数字器件。推挽式输出输出电阻
小,带负载能力强。
6、开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要
上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强
(一般20ma以内).能驱动大电流和大电压。LED就使用这种模式
7、复用是指该引脚打开remap功能。*/
  
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);
}
/*GPIO常使用的几条函数
GPIO_ReadInputDataBit   读取指定端口管脚的输入
u8 ReadValue; 
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
  使用setbits 与resetbits 是比较简单,其实还是可以使用
  其它函数。例如可以使用GPIO_WriteBit
   GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
  GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用
GPIO_Write(GPIOA, 0x1101);GPIO_EXTILineConfig  选择GPIO管脚用作外部中断线路
GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8);*/

 

 

为下面每一行代码添加注释:#include "stm32f10x.h" void RCC_Configuration(void) { /* Enable GPIOA, GPIOC and AFIO clocks / RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); / Enable SYSCFG clock / RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; / Configure PA0 pin as input floating / GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); / Configure PC13 pin as output push-pull / GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure / Configure the NVIC Preemption Priority Bits / NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); / Enable the EXTI0 Interrupt / NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; / Configure EXTI Line0 to generate an interrupt on falling edge / EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); / Connect EXTI Line0 to PA0 pin / GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); } void SysTick_Configuration(void) { / Configure SysTick to generate an interrupt every 1ms / if (SysTick_Config(SystemCoreClock / 1000)) { / Capture error / while (1); } } void Delay(__IO uint32_t nTime) { / Wait for nTime millisecond / TimingDelay = nTime; while (TimingDelay != 0); } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); EXTI_Configuration(); SysTick_Configuration(); / Infinite loop / while (1) { / Toggle PC13 LED every 500ms / GPIOC->ODR ^= GPIO_Pin_13; Delay(500); } } void EXTI0_IRQHandler(void) { / Check if PA0 button is pressed / if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) { / Reset MCU / NVIC_SystemReset(); } / Clear EXTI Line0 pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); }
06-03
#include "stm32f10x.h" #include "oled.h" // OLED驱动库 // 定义硬件连接 #define BEEP_PIN GPIO_Pin_13 #define BEEP_PORT GPIOC #define KEY_PIN GPIO_Pin_0 #define KEY_PORT GPIOA // 全局变量 volatile uint8_t hours = 0, minutes = 0, seconds = 0; volatile uint8_t alarm_h = 0, alarm_m = 0, alarm_s = 10; // 默认闹钟时间 08:00:00 volatile uint8_t alarm_triggered = 0; char time_str[9] = "00:00:00"; // 用于存储时间字符串 // 函数声明 void GPIO_Configuration(void); void TIM2_Configuration(void); void EXTI_Configuration(void); void NVIC_Configuration(void); void Update_Time_Display(void); void Beep_Control(uint8_t state); int main(void) { // 初始化系统时钟 SystemInit(); // 初始化外设 GPIO_Configuration(); TIM2_Configuration(); EXTI_Configuration(); NVIC_Configuration(); OLED_Init(); // 初始化OLED OLED_Clear(); // 清屏 // 显示初始时间 OLED_ShowString(1, 1, "Time: 00:00:00"); OLED_ShowString(2, 1, "Alarm: 00:00:10"); // 启动定时器 TIM_Cmd(TIM2, ENABLE); while (1) { // 检查闹钟触发 if (alarm_triggered) { Beep_Control(1); // 开启蜂鸣器 } // 更新显示 Update_Time_Display(); } } // GPIO配置 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); // 配置蜂鸣器引脚(PC13) GPIO_InitStructure.GPIO_Pin = BEEP_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BEEP_PORT, &GPIO_InitStructure); GPIO_SetBits(BEEP_PORT, BEEP_PIN); // 初始关闭蜂鸣器 // 配置按键引脚(PA0) GPIO_InitStructure.GPIO_Pin = KEY_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(KEY_PORT, &GPIO_InitStructure); } // TIM2配置(1秒定时) void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置TIM2 TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频值 (72MHz/7200 = 10kHz) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 允许更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); } // EXTI配置 void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; // 配置PA0EXTI线0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } // NVIC配置 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 配置TIM2中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置EXTI0中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 更新OLED时间显示 void Update_Time_Display(void) { // 格式化时间字符串 time_str[0] = hours / 10 + '0'; time_str[1] = hours % 10 + '0'; time_str[3] = minutes / 10 + '0'; time_str[4] = minutes % 10 + '0'; time_str[6] = seconds / 10 + '0'; time_str[7] = seconds % 10 + '0'; // 更新OLED显示 OLED_ShowString(1, 7, time_str); // 在第1行第7列显示时间 } // 蜂鸣器控制 void Beep_Control(uint8_t state) { if (state) { GPIO_ResetBits(BEEP_PORT, BEEP_PIN); // 开启蜂鸣器(低电平触发) } else { GPIO_SetBits(BEEP_PORT, BEEP_PIN); // 关闭蜂鸣器 } } // TIM2中断服务函数(1秒触发) void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 更新时间 seconds++; if (seconds >= 60) { seconds = 0; minutes++; if (minutes >= 60) { minutes = 0; hours++; if (hours >= 24) { hours = 0; } } } // 检查闹钟 if (hours == alarm_h && minutes == alarm_m && seconds == alarm_s) { alarm_triggered = 1; // 触发闹钟 } } } // EXTI0中断服务函数(按键) void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); // 消除抖动 for (volatile int i = 0; i < 0x4FFF; i++); // 如果蜂鸣器正在响 if (alarm_triggered) { alarm_triggered = 0; Beep_Control(0); // 关闭蜂鸣器 } } }这是基础版的代码,请在不改变它的功能的条件下添加一个功能,按下按键后五分钟后再次响的贪睡模式
最新发布
08-20
#include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ void GPIO_Configuration(void); void NVIC_Configuration(void); void EXTI_Configuration(void); int main(void) { GPIO_Configuration(); NVIC_Configuration(); EXTI_Configuration(); GPIO_SetBits(GPIOC,GPIO_Pin_0);//GPIOC Pin0输出高电平即熄灭LED while(1) { } } void GPIO_Configuration() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//配置为输入模式时,可不配置速度 GPIO_Init(GPIOA, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//配置为输入模式时,可不配置速度 GPIO_Init(GPIOE, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOE RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//可以以或方式添加多个引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;//引脚的输出速度为2MHz GPIO_Init(GPIOC, &GPIO_InitStructure);//以GPIO_InitStructure变量的值作为配置信息,初始化GPIOC } void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI_Configuration() { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line3; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling ; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);// }根据程序画一个流程图
06-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值