历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2021年12月24日 | STM32 GPIO的输入输出-HAL库

2021-12-24 来源:eefocus

本文将介绍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

}

  }

}

推荐阅读

史海拾趣

芯邦(Chipsbank)公司的发展小趣事

近年来,芯邦科技的营收规模逐渐增大,从2020年到2022年,公司的营业收入分别达到了0.99亿元、1.75亿元和1.92亿元。尽管增速呈现下降趋势,但芯邦科技在电子行业中依然保持着稳健的市场表现。同时,公司也注重研发投入,不断提升产品的技术水平和市场适应性。

Autotrol公司的发展小趣事

Autotrol公司成立于1964年,最初是一家领先的可定制小功率齿轮马达生产商。在初创时期,公司面临着激烈的市场竞争和技术挑战。然而,Autotrol凭借其卓越的技术实力和创新能力,成功开发出一系列具有竞争力的齿轮马达产品,逐渐在市场中脱颖而出。公司不断完善产品线,推出了永久磁铁同步电动机、滞后电动机和直流齿轮马达等,这些产品以其高效、稳定的性能赢得了客户的信赖。

Global Power Technology Co., Ltd公司的发展小趣事
冰箱噪音大可能是由于压缩机运转声音、风扇转动声音或冰箱摆放不平稳等原因造成的。首先检查冰箱是否摆放平稳,如不平稳需调整冰箱底部螺丝使其平稳;若冰箱摆放平稳但噪音仍大,可能是压缩机或风扇故障,需联系专业维修人员检查并维修。
华润华晶公司的发展小趣事
通常容声BCD-190型电冰箱的温度调节旋钮位于冷藏室内部或冰箱侧面。根据实际需要,通过旋转温度调节旋钮来设置冷藏室和冷冻室的温度。
Flexxon Pte Ltd公司的发展小趣事

Flextronics(虚构为Flexxon Pte Ltd)自上世纪90年代末成立以来,便致力于成为全球供应链整合的领军者。公司最初从新加坡起步,迅速在全球范围内建立了多个生产基地和研发中心,以满足客户对电子产品快速响应和高质量生产的需求。通过高效的供应链管理,Flextronics不仅缩短了产品上市时间,还大幅降低了生产成本,赢得了包括惠普、戴尔、诺基亚等国际巨头的信任与合作。

南京绿芯(Grenergy)公司的发展小趣事

在电子行业日新月异的背景下,Flextronics(Flexxon Pte Ltd)始终将技术创新视为企业发展的核心动力。公司投入巨资于自动化生产线、智能制造系统和物联网技术的研发,实现了生产过程的智能化和数字化。这一举措不仅提升了生产效率,还使得Flextronics在定制化生产、快速响应市场变化方面具备了显著优势。随着5G、物联网等新兴技术的兴起,Flextronics更是积极拥抱变革,与多家科技公司合作,共同推动电子产品的创新与发展。

问答坊 | AI 解惑

2808usb

2808protel 原理图…

查看全部问答>

74HC595驱动两位数码管74HC595驱动两位数码管

本帖最后由 paulhyde 于 2014-9-15 03:05 编辑 74HC595驱动两位数码管74HC595驱动两位数码管    …

查看全部问答>

有没有人2440/ce5用的128M ram 的?

bank6和bank7各挂64M(共4片32M的),近期想这么用,有用过的提供点经验。…

查看全部问答>

请教如何#improt 一个ActiveX控件

菜鸟一名, 请教各位高手如何#improt一个ActiveX控件, 主要是不知道#improt之后,如何在代码中使用自己的控件, 谢谢各位高手指教,比较急,还望能详细指教。…

查看全部问答>

wince 6.0 RIL层驱动开发

各位好.我是CE6.0 RIL层开发的新手。请教几个问题: 1、TCP/IP数据的封装是否工作在RIL层的上层。也就是说是当我用Socket将一个数据send(str);的时候。系统是通过一个怎样的过程将数据按TCP协议封装好,然后是否调用了一些RIL的接口。并通过RIL 驱 ...…

查看全部问答>

会汇编的请指点

我看书上的例子,不知为什么运行没有反应(没有出现对话框)这是一个对话框的例子 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Sample code for < Win32ASM Programming > ; by 罗云彬, http://asm.yeah.net ;>> ...…

查看全部问答>

马上换工作了寻求建议

马上换工作了,目前有两家公司供选择,一个做WINCE驱动,一个做LINUX驱动的 我两个系统都做过,对LINUX更熟悉,不知道究竟选哪个好,有没有大侠帮我分析下啊,谢谢先…

查看全部问答>

【应用笔记】与STM32有关的应用笔记汇总和简介

中文参考译文。 相关链接:https://bbs.eeworld.com.cn/upfiles/img/20093/2009318231910906.pdf…

查看全部问答>