STM32 GPIO的输入输出-HAL库

发布者:SereneSunset最新更新时间:2021-12-24 来源: eefocus关键字:STM32  GPIO  输入输出  HAL库 手机看文章 扫描二维码
随时随地手机看文章

本文将介绍STM32基于HAL库的GPIO使用,利用上文创建好的HAL库工程模板,可以方便的编写应用程序。


我们目标是编写一个LED灯和按键的使用例子,每按下一次按键,LED的亮灭状态将进行一次反转。


1. LED软件设计

我们创建"led.h"和"led.c"在工程模板的inc和src文件夹中。


1.1 头文件定义

该模块代码作用是防止在某一个代码文件中引入多个.h文件时,防止重复引入同一个.h文件,如果重复引入的话,在编译时候汇报“redefine”错误。


"ifndef"全称是"if not define",当在一个代码中第一次引入led.h文件时__LED_H未定义,则代码会继续往下执行,同时定义了__LED_H,如果存在第二次引入led.h文件时,由于在第一次引入时已经定义了__LED_H宏,所以“ifndef”判断为假,则往下代码不会被重复执行。


#ifndef __LED_H

#define __LED_H

.

.

.

#endif


1.2 LED引脚的宏定义

在led.h文件中对led的引脚进行宏定义。


#define LED_PIN GPIO_PIN_5

#define LED_GPIO_PORT GPIOB

#define LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()


1.3 LED引脚控制宏定义

在led.h文件中对led引脚控制进行宏定义。


/* HAL库函数控制IO */

#define ON  GPIO_PIN_RESET

#define OFF GPIO_PIN_SET

 

#define LED(a) HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, a)

 

/* 操作寄存器控制IO */

#define digitalHi(p,i) {p->BSRR=i;} //设置为高电平

#define digitalLo(p,i) {p->BSRR=(uint32_t)i << 16;} //输出低电平

#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态

 

/* 控制LED的IO */

#define LED_TOGGLE digitalToggle(LED_GPIO_PORT, LED_PIN)

#define LED_OFF digitalHi(LED_GPIO_PORT, LED_PIN)

#define LED_ON digitalLo(LED_GPIO_PORT, LED_PIN)


1.4 LED IO口初始化函数

在led.c文件中编写led管脚初始化函数


void LED_GPIO_Config(void)

{

LED_GPIO_CLK_ENABLE(); // 开启GPIO外设时钟

GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO_InitTypeDef结构体

GPIO_InitStruct.Pin = LED_PIN; // 管脚

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出

GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉模式

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 管脚速率为高速

HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

LED_OFF

}


2.按键软件设计

我们创建"key.h"和"key.c"在工程模板的inc和src文件夹中。


2.1按键宏定义

在"key.h"文件中定义引脚。


/* 按键引脚宏定义 */

#define KEY_PIN GPIO_PIN_0

#define KEY_GPIO_PORT GPIOA

#define KEY_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()

 

#define KEY_ON 1

#define KEY_OFF 0


2.2按键初始化函数

在"key.c"定义引脚配置。


void Key_GPIO_Config(void)

{

KEY_GPIO_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.Pin = KEY_PIN;

GPIO_InitStructure.Mode = GPIO_MODE_INPUT; // 输入模式

GPIO_InitStructure.Pull = GPIO_NOPULL; // 不上拉也不下拉

HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);

}


2.3按键扫描

在"key.c"中定义按键扫描函数。


uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

{

if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == KEY_ON){ // 按键是否按下

HAL_Delay(50); // 软件销抖

while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == KEY_ON);     // 按键是否松开

return KEY_ON;

} else{

return KEY_OFF;

}

}


3.主函数

在main.c“”中整合逻辑,在按键被按下后,led的亮灭状态翻转一次。


int main(void)

{

  HAL_Init();

 

  /* Configure the system clock to 64 MHz */

  SystemClock_Config();

 

  LED_GPIO_Config();

  Key_GPIO_Config();

  while (1)

  {

if(Key_Scan(KEY_GPIO_PORT, KEY_PIN) == KEY_ON){

LED_TOGGLE

}

  }

}

关键字:STM32  GPIO  输入输出  HAL库 引用地址:STM32 GPIO的输入输出-HAL库

上一篇:STM32F10X-时钟树详细介绍
下一篇:STM32手动创建工程-HAL库,超详细

推荐阅读最新更新时间:2024-11-17 10:22

基于STM32实现简单呼吸灯
01第一步; 打开STM32cubeMX软件(我使用的版本是4.18),新建项目,选择STM32F103R6Tx; 02第二步:然后对TIM1或者TIM2进行设置,本次我们使用TIM1做PWM实验,选择内部时钟作为定时器时钟; TIM2定时器的内部时钟 03第三步、STM32时钟配置保持默认不变,因为我们用proteus仿真来验证本次实验; 04第四步、然后对TIM1进行定时中断时间的设置 ,如下图所示: 05第五步:生成代码 06第六步:在keil中,修改代码。 添加两个变量 主函数中的代码 07第七步:在虚拟仿真软件proteus 8.8 版本,绘制出stm32f103的图纸,然后添加刚刚产生的hex文件
[单片机]
基于<font color='red'>STM32</font>实现简单呼吸灯
基于STM32的传感器接口模块的设计
0 引言 物联网将会是未来很长一段时间内IT产业的发展趋势,一个完整的物联网系统的构成或产业链的划分,目前业界比较统一的观点基本都认为应该包括三个层面:末端设备或子系统、通信连接系统、以及管理和应用系统。即Device-设备、Connect-连接和Manage-管理。由于数字整合的需求日益增长,对作为感知层核心组成元素的传感器数据融合提出了更高要求。如何将传感器连入网络成为一个尤其重要的问题。 传感器通过接口模块接入到相应网络。传感器通过信号接口连接到接口模块,节点以相应的适配模块接收和处理传感器输出信号,并将传感器原始数据转换为网络用户可以识别的信息,最后通过网络通信接口连接到上位机或者任何网络。 传感器感知外部
[单片机]
基于<font color='red'>STM32</font>的传感器接口模块的设计
STM32 DMA学习
一个简单的例子 transfer a word data buffer from FLASH memory to embedded SRAM memory. 在V3.1.2库的位置 STM32F10x_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples\DMA\FLASH_RAM /* DMA1 channel6 configuration */ DMA_DeInit(DMA1_Channel6); //peripheral base address DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_
[单片机]
<font color='red'>STM32</font> DMA学习
STM32时钟树分析
1 STM32总线 首先,说点不靠谱的,APB和AHB总线,我个人感觉这个类似于个人PC系统里的北桥和南桥总线。 南桥总线上挂接的都是鼠标、键盘这些慢速的设备,北桥上挂接显卡等高速设备。南桥频率低,北桥频率高。另外,南桥最后也要接到北桥上。 这些感觉都类似于APB和AHB。 AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”。 AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。 APB,是Advance
[单片机]
<font color='red'>STM32</font>时钟树分析
什么是中断 stm32中断服务函数
中断概念: 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。 中断作用: 计算机与外设之间的联系一般通过两种方法:一是通过CPU控制来进行数据的传送;二是在专门的芯片控制下进行数据的传送。我们所说的DMA,就是不用CPU控制,外设同内存之间相互传送数据的通道,在这种方式下,外设利用DMA通道直接将数据写入存储器或将数据从存储器中读出,而不用CPU参与,系统的速度会大大增加。 你打开stm32的启动文件,例如startup_stm32f10x_hd.s 里面有很多中断跳转的
[单片机]
STM32 Bootloader 跳转
1. Bootload #define ApplicationAddress 0x08003000 2. App 修改
[单片机]
<font color='red'>STM32</font> Bootloader 跳转
51单片机基础之GPIO输入
代码: #include reg52.h //引入头文件 sbit KEY=P3^1; //定义一个按键 sbit LED=P2^0; //定义一个LED灯 void delay(unsigned int u16) //延时函数,0.6秒以内的延时 { while(u16--); } void main(void) //主函数,程序从这里执行 { while(1) //代码循环执行 { if(KEY==0) //检车按键是否按下,之所以检测是否等于
[单片机]
51单片机基础之<font color='red'>GPIO</font>输入
智能手机键盘控制器的实现方法介绍与比较
简介 智能手机的大脑是基带处理器(Baseband),内置微型处理器和专用信号处理电路。依靠基带控制器的先进设计,通用输入/输出口(GPIO)可用来实现按键开关功能。 目前,专用键盘控制器IC已广泛用于智能手机。这些专用键盘控制器之所以排上用场,原因在于基带芯片的GPIO资源非常有限。比如,有时为了节约成本,用户将本来用于功能电话的基带芯片应用到了智能手机的设计;有时则是为了减少基带控制器与键盘之间的连接线数量,特别是对于滑盖手机,基带处理器和键盘分布在不同的PCB上。键盘控制器通常由I2C总线或SPI总线连接到基带处理器。 键盘控制器的功能可用现有的GPIO芯片或使用传统的按键扫描微型单片机实现。一些专有的键盘控制器也采用传统的
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved