当前位置:首页 > 单片机 > 单片机
[导读]简介不同的开发板的原理图结构也不尽相同,笔者在这里使用野火的MINI-V3(F103VET6)简易开发板对GPIO口的设置做一个简单的介绍,并实现按键控制LED灯的亮灭。方便读者可以快速熟悉并灵活应用。原理图分析首先我们来

简介

不同的开发板的原理图结构也不尽相同,笔者在这里使用野火的MINI-V3(F103VET6)简易开发板对GPIO口的设置做一个简单的介绍,并实现按键控制LED灯的亮灭。方便读者可以快速熟悉并灵活应用。

原理图分析

首先我们来看一下发光二极管部分和按键部分的原理图。

下面是按键的原理图部分:

在这里,我们将使用KEY1(PA0)来控制红灯PB5的亮灭。由原理图可知,其控制LED灯的PB5引脚为低电平时,灯亮。当KEY1按下时,PA0引脚由之前的低电平转为高电平(3V3)。明确了目的之后我们就可以分析GPIO口并进行设置了。

GPIO设置

经过上述的功能明确之后,我们将其分为两大类,分别是输入类(如按键)和输出类(LED灯)。
STM32系列单片机的引脚有着丰富的功能,在这里将其芯片的GPIO口部分的结构图放出,有兴趣的朋友可自行研究或在评论区留言讨论。在这里笔者将不再讲解时钟树的相关内容,以免对初学者造成较大压力,有兴趣的朋友可自行参考官方文档。

输入输出模式

GPIO的输入、输出种类详见下表。

功能名称简述输入上拉输入(GPIO_Mode_IPU)默认状态下(引脚无输入),读得的数据为1,高电平输入下拉输入(GPIO_Mode_IPD)与上拉输入相反,默认为0,低电平输入浮空输入(GPIO_Mode_IN_FLOATING)输入不确定,无上拉和下拉。输入阻抗较大,一般用于标准通信协议如I2C、USART的接收端输入模拟输入模式(GPIO_Mode_AIN)一般由ADC采集电压信号时将其设置为模拟输入。输出普通推挽输出(GPIO_Mode_Out_PP)输出电平为3.3V输出普通开漏输出(GPIO_Mode_Out_OD)若要输出5V,则需外加上拉电阻,电源为5V。输出为高阻态时,由上拉电阻和电源向外输出5V的高电平输出复用推挽输出(GPIO_Mode_AF_PP)引脚复用功能采用复用模式输出复用开漏输出(GPIO_Mode_AF_OD)复用模式,且加入上拉电阻

由上表可知,我们需要将LED灯的引脚设置为推挽输出。按键部分的输入可以是上拉输入也可以是下拉输入。在这里,因为我们的电路原理图设置的是按键按下为高,释放为低。所以我们使用下拉输入的模式 。

结构体设置

STM32以高效的库函数开发而著称。由于其寄存器过多,不适合类似51系列单片机的寄存器操作,所以我们将直接采用库函数开发的方法(CMSIS 3.5.0版本)。

STM32的库函数将结构体的功效发挥到了极致,我们首先来看一下GPIO口的结构体定义:

typedefstruct{uint16_tGPIO_Pin;/*!

在这个结构体之中,主要包括三个成员:引脚设置(GPIO_Pin)、引脚最大输出速度(GPIO_Speed)和引脚模式(GPIO_Mode)。在这之中,GPIO还有一个重要的定义,即确定组别:GPIOA~GPIOG.
他们的种类又可以分别划分为:

GPIO_Speed:

GPIO_Speed_10MHz

GPIO_Speed_2MHz

GPIO_Speed_50MHz

GPIO_Mode:

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

GPIO_Pin:

GPIO_Pin_0

GPIO_Pin_1

GPIO_Pin_2

GPIO_Pin_3

GPIO_Pin_4

GPIO_Pin_5

GPIO_Pin_6

GPIO_Pin_7

GPIO_Pin_8

GPIO_Pin_9

GPIO_Pin_10

GPIO_Pin_11

GPIO_Pin_12

GPIO_Pin_13

GPIO_Pin_14

GPIO_Pin_15

熟悉结构体类别以后我们可以进行结构体的定义以及GPIO口的初始化。由于GPIO处于APB2时钟线下,所以我们必须要开启相应的时钟。代码如下:

voidkey_gpio_config(void){GPIO_InitTypeDefkey_struct;//定义结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟key_struct.GPIO_Pin=GPIO_Pin_0;//结构体成员设置;对于按键初始化而言,由于GPIO是输入模式,故不必设置最大输出速度key_struct.GPIO_Mode=GPIO_Mode_IPD;GPIO_Init(GPIOA,&key_struct);//初始化引脚}voidled_gpio_config(void){//同上GPIO_InitTypeDefled_struct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);led_struct.GPIO_Pin=GPIO_Pin_5;led_struct.GPIO_Speed=GPIO_Speed_50MHz;led_struct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&led_struct);}12345678910111213141516

自此,结构体设置结束。下面进行GPIO口的操作。

GPIO操作

对于库函数开发来说,一切硬件操作都可以使用函数来解决。如:

uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx)//ReadsthespecifiedGPIOinputdataport.uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)//Readsthespecifiedinputportpin.uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx)//ReadsthespecifiedGPIOoutputdataport.uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)//Readsthespecifiedoutputdataportbit.voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)//Clearstheselecteddataportbits.voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)//Setstheselecteddataportbits.voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct)//FillseachGPIO_InitStructmemberwithitsdefaultvalue.voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal)//WritesdatatothespecifiedGPIOdataport.voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal)//Setsorclearstheselecteddataportbit.12345678910111213141516171819202122232425262728

对于本题目而言,使用简单的写入操作即可。

intmain(){led_gpio_config();GPIO_WriteBit(GPIOB,GPIO_Pin_5,1);//初始化,使灯为熄灭状态key_gpio_config();while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1){GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);}else{GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);}}}123456789101112131415

至此,GPIO的操作完成,功能也成功实现。但是按键部分未加消抖处理,所以可能出现不稳定的状态。不过对于本示例来说,这一现象并不明显。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制

无线充电技术加速渗透消费电子与汽车电子领域,基于Qi协议的无线充电发射端开发成为智能设备能量补给的核心课题。传统模拟控制方案存在响应滞后、参数调整困难等问题,而基于STM32的数字PID控制结合FOD(Foreign O...

关键字: STM32 无线充电
关闭