STM32-GPIO及EXTI初始化详解

更新时间:2024-06-14 17:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

STM32-GPIO及EXTI初始化详解

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);*/

电压驱动的如:场效应管,因为它的内阻很大,加电压控制时电流很小,近似为零,所以可以理解成:电压驱动;??电流驱动的如:普通的NPN、PNP型三极管,因为它的内阻较小,加电压控制时电流相对较大(一般小功率的都有100uA以上,大功率的可达20mA以上),所以可以理解成:电压驱动;????从控制原理来说:电压驱动的如:场效应管,它是通过加到G、S端的电压(微观的就是电场)来控制D、S内部通道的宽窄(即通道可变)来控制D、S两端电流;??电流驱动的如:普通的NPN、PNP型三极管,是通过加到B、E端的电流(微观的就是电子的流动)来控制C、E内部的电流流动(即通道不变)。

数字器件,输入输出为高、低电平的两种状态。

模拟器件的信号是连续的,不是只有高、低电平两种状态。

本文来源:https://www.bwwdw.com/article/hny3.html

Top