GPIO HAL库+CubeMX

news/2024/7/23 10:30:31 标签: 单片机, 嵌入式硬件

以正点原子精英版为例:

     

一.创建HAL库模块 

 二.GPIO输出

1.自己编写

void led_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    gpio_init_struct.Pin = GPIO_PIN_5;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &gpio_init_struct);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}

2.cubeMX生成

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);

  /*Configure GPIO pins : PEPin PEPin */
  GPIO_InitStruct.Pin = KEY0_Pin|KEY1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY_UP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);

}

3.编写自己的需要的LED驱动文件(BSP)

/*.h文件中*/
#ifndef __DRIVER_LED_H__
#define __DRIVER_LED_H__


#define LED0_ON() do{HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);}while(0)
#define LED1_ON() do{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);}while(0)
#define LED0_TogglePin() do{HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);}while(0);
#define LED1_TogglePin() do{HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);}while(0);

void LED0_Twinkling();
void LED1_Twinkling();
#endif
/*.c文件中*/
#include "driver_led.h"
#include "main.h"

void LED0_Twinkling()
{
    LED0_TogglePin();
    HAL_Delay(500);
}
void LED1_Twinkling()
{
    LED1_TogglePin();
    HAL_Delay(500);
}

三.GPIO输入

/*.h文件中*/
#include "main.h"
#ifndef __DRIVER_KEY_H__
#define __DRIVER_KEY_H__

#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) /* 读取 KEY0 引脚 */
#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) /* 读取 KEY1 引脚 */
#define WK_UP HAL_GPIO_ReadPin(KEY_UP_GPIO_Port, KEY_UP_Pin) /* 读取 WKUP 引脚 */
#define KEY0_PRES 1 /* KEY0 按下 */
#define KEY1_PRES 2 /* KEY1 按下 */
#define WKUP_PRES 3 /* KEY_UP 按下(即 WK_UP) */


uint8_t key_scan(uint8_t mode);
#endif
/*.c文件中*/
uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1; /* 按键按松开标志 */
    uint8_t keyval = 0;
    if (mode) key_up = 1; /* 支持连按 */
    if (key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1))
    { /* 按键松开标志为 1, 且有任意一个按键按下了 */
        HAL_Delay(10);
        key_up = 0;
        if (KEY0 == 0) keyval = KEY0_PRES;
        if (KEY1 == 0) keyval = KEY1_PRES;
        if (WK_UP == 1) keyval = WKUP_PRES;
    }
        else if (KEY0 == 1 && KEY1 == 1 && WK_UP == 0)
        { /* 没有任何按键按下, 标记按键松开 */
        key_up = 1;
    }
    return keyval; /* 返回键值 */
}

四.GPIO相关函数

__HAL_RCC_GPIOx_CLK_ENABLE() //开启GPIO时钟
HAL_GPIO_Init()              //初始化GPIO
HAL_GPIO_WritePin()          //控制IO输出高/低电平
HAL_GPIO_TogglePin()         //每次调用IO输出电平翻转一次
HAL_GPIO_ReadPin()           //读取IO电平


http://www.niftyadmin.cn/n/5208615.html

相关文章

Qt实现自定义IP地址输入控件(百分百还原Windows 10网络地址输入框)

在开发网络相关的程序时,我们经常需要输入IP地址,例如源地址和目标地址。Qt提供了一些基础的控件,如QLineEdit,但是它们并不能满足我们对IP地址输入的要求,例如限制输入的格式、自动跳转到下一个输入框、处理回车和退格键等。因此,我们需要自己编写一个自定义的IP地址输入…

基于JavaWeb+SSM+Vue微信阅读小程序的设计和实现

基于JavaWebSSMVue微信阅读小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 1 第2章 开发环境与技术 3 2.1 MYSQL数据库 3 2.2 JSP技…

力扣283:移动零(JAVA)

题目描述: 意思是将所有0移到最后的同时其余非0元素位置仍然不变 如 1 2 0 5 2 0 经过移动零后变为 1 2 5 2 0 0 思路:使用双指针的思路来写 fast:从左往右遍历数组 slow:非零元素最后的一个位置 将数组分为3个区间 [0,slow]为处理好的非0数据,slow永远指向最后一个非0数据 [s…

【Python 千题 —— 基础篇】删除列表值

题目描述 题目描述 删除列表的指定值。有一个列表 [1, 3, 5, 2, 44, 1, 9, 10, 32] ,请使用 for 循环删除该列表中与 [44, 1, 9] 列表相同的值,并输出该列表。 输入描述 无输入。 输出描述 输出操作后的列表。 示例 示例 ① 输出: …

13年测试老鸟,APP性能测试-响应时间与指标总结整理...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、性能指标在性能…

golang学习笔记——创建项目

创建项目 从Go 1.8开始,将GOPATH设置为环境变量不是必需的。如果我们没有设置一个,Go使用默认的GOPATH为$HOME/go。可以使用go env查看环境变量信息。 创建项目 # 创建项目目录 mkdir helloLog cd helloLog # 使用go mod初始化项目,生成go.mod文件 go…

KT404A远程更换语音芯片方案支持OTA 4G 蓝牙 wifi 物联网

目录 一、简介 2.1 芯片的硬件 2.2 测试的方法 一、简介 KT404A远程更换语音芯片方案支持OTA 4G 蓝牙 wifi 物联网 在线下载的mp3语音芯片ic,通过KT404A的uart直接更换内部的语音文件,从而实现动态的更新语音内容 物联网大潮的来袭。随着智能家居、…

【开源】基于Vue.js的民宿预定管理系统

项目编号: S 058 ,文末获取源码。 \color{red}{项目编号:S058,文末获取源码。} 项目编号:S058,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色…