Clion开发STM32之HAL库GPIO宏定义封装(最新版)

这篇具有很好参考价值的文章主要介绍了Clion开发STM32之HAL库GPIO宏定义封装(最新版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

头文件

/*******************************************************************************
 *  Copyright (c) [scl]。保留所有权利。
 *     本文仅供个人学习和研究使用,禁止用于商业用途。
 ******************************************************************************/
#ifndef STM32_F1XX_TEMPLATE_BSP_GPIO_H
#define STM32_F1XX_TEMPLATE_BSP_GPIO_H

#include "sys_core.h"

#ifndef  sys_force_static_inline
#define sys_force_static_inline __attribute__((always_inline)) static inline
#endif
enum pin_enum {
    PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13, PA14, PA15,
    PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13, PB14, PB15,
    PC0, PC1, PC2, PC3, PC4, PC5, PC6, PC7, PC8, PC9, PC10, PC11, PC12, PC13, PC14, PC15,
    PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9, PD10, PD11, PD12, PD13, PD14, PD15,
    PE0, PE1, PE2, PE3, PE4, PE5, PE6, PE7, PE8, PE9, PE10, PE11, PE12, PE13, PE14, PE15,
    PF0, PF1, PF2, PF3, PF4, PF5, PF6, PF7, PF8, PF9, PF10, PF11, PF12, PF13, PF14, PF15,
};
typedef struct stm_pin_define {
    GPIO_TypeDef *port;
    uint32_t pin;
} stm_pin_define_t;
#define GPIO_A_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define GPIO_B_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define GPIO_C_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define GPIO_D_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
#define GPIO_E_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define GPIO_F_CLK_ENABLE() __HAL_RCC_GPIOF_CLK_ENABLE()
#define GPIO_G_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE()
/*端口定义: stm_port_define(A,12)->PA12 */
#define stm_port_define(__PORT__, PIN) GPIO##__PORT__,GPIO_PIN_##PIN

#define gpio_init(port, pin, mode, pull, speed)\
            do{\
                __HAL_RCC_##port##_CLK_ENABLE();\
                GPIO_InitTypeDef cnf ={pin,mode,pull,speed};\
                HAL_GPIO_Init(port, &cnf);\
            }while(0)
typedef enum {
    pin_mode_output,
    pin_mode_output_pull_up,
    pin_mode_output_pull_down,
    pin_mode_input,
    pin_mode_input_pull_up,
    pin_mode_input_analog,
    pin_mode_input_pull_down,
    pin_mode_output_od,
    pin_mode_output_af_pp,
} pin_mode_type;

sys_force_static_inline void stm_pin_set(GPIO_TypeDef *port, uint32_t pin, GPIO_PinState state) {
    HAL_GPIO_WritePin(port, pin, state);
}

sys_force_static_inline void stm_pin_high(GPIO_TypeDef *port, uint32_t pin) {
    HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET);
}

sys_force_static_inline GPIO_PinState stm_pin_read(GPIO_TypeDef *port, uint32_t pin) {
    return HAL_GPIO_ReadPin(port, pin);
}

sys_force_static_inline void stm_pin_low(GPIO_TypeDef *port, uint32_t pin) {
    HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET);
}

sys_force_static_inline void stm_pin_toggle(GPIO_TypeDef *port, uint32_t pin) {
    HAL_GPIO_TogglePin(port, pin);
}

sys_force_static_inline void gpio_clk_enable(GPIO_TypeDef *port) {
    if (port == GPIOA)GPIO_A_CLK_ENABLE();
    else if (port == GPIOB)GPIO_B_CLK_ENABLE();
    else if (port == GPIOC)GPIO_C_CLK_ENABLE();
    else if (port == GPIOD)GPIO_D_CLK_ENABLE();
    else if (port == GPIOE)GPIO_E_CLK_ENABLE();
    else if (port == GPIOF)GPIO_F_CLK_ENABLE();
    else if (port == GPIOG)GPIO_G_CLK_ENABLE();
}

sys_force_static_inline void stm32_pin_mode(GPIO_TypeDef *port, uint32_t pin, pin_mode_type mode) {
    GPIO_InitTypeDef GPIO_InitStruct = {
            .Pin = pin, .Mode = GPIO_MODE_OUTPUT_PP, .Speed = GPIO_SPEED_FREQ_HIGH, .Pull = GPIO_NOPULL};
    gpio_clk_enable(port);
    switch (mode) {

        case pin_mode_output: {
            /* output setting */
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            break;
        }
        case pin_mode_output_pull_up: {
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            break;
        }
        case pin_mode_output_pull_down: {
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_PULLDOWN;
            break;
        }
        case pin_mode_input: {
            /* input setting: not pull. */
            GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            break;
        }
        case pin_mode_input_pull_up: {
            /* input setting: pull up. */
            GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            break;
        }
        case pin_mode_input_pull_down: {
            /* input setting: pull down. */
            GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
            GPIO_InitStruct.Pull = GPIO_PULLDOWN;
            break;
        }
        case pin_mode_output_od: {
            /* output setting: od. */
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            break;
        }
        case pin_mode_output_af_pp: {
            /* output setting: od. */
            GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            break;
        }
        case pin_mode_input_analog: {
            GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
            break;
        }
    }
    HAL_GPIO_Init(port, &GPIO_InitStruct);
}

sys_force_static_inline void stm32_pin_define_mode_set(stm_pin_define_t *pin_define, pin_mode_type mode) {
    stm32_pin_mode(pin_define->port, pin_define->pin, mode);
}

sys_force_static_inline void stm32_pin_define_high(stm_pin_define_t *pin_define) {
    HAL_GPIO_WritePin(pin_define->port, pin_define->pin, GPIO_PIN_SET);
}

sys_force_static_inline void stm32_pin_define_low(stm_pin_define_t *pin_define) {
    HAL_GPIO_WritePin(pin_define->port, pin_define->pin, GPIO_PIN_RESET);
}

sys_force_static_inline void stm32_pin_define_set(stm_pin_define_t *pin_define, GPIO_PinState state) {
    HAL_GPIO_WritePin(pin_define->port, pin_define->pin, state);
}

sys_force_static_inline void stm32_pin_define_toggle(stm_pin_define_t *pin_define) {
    HAL_GPIO_TogglePin(pin_define->port, pin_define->pin);
}

sys_force_static_inline GPIO_PinState stm32_pin_define_read(stm_pin_define_t *pin_define) {
    return HAL_GPIO_ReadPin(pin_define->port, pin_define->pin);
}

struct stm_pin_define *stm_get_pin(enum pin_enum pin);


#endif //STM32_F1XX_TEMPLATE_BSP_GPIO_H

源文件

/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#include "stm32f1xx_hal.h"
#include "bsp_gpio.h"

struct stm_pin_map {
    enum pin_enum pin;
    struct stm_pin_define define;
};
static struct stm_pin_map pin_map[] = {
        {PA0,  {stm_port_define(A, 0)}},
        {PA1,  {stm_port_define(A, 1)}},
        {PA2,  {stm_port_define(A, 2)}},
        {PA3,  {stm_port_define(A, 3)}},
        {PA4,  {stm_port_define(A, 4)}},
        {PA5,  {stm_port_define(A, 5)}},
        {PA6,  {stm_port_define(A, 6)}},
        {PA7,  {stm_port_define(A, 7)}},
        {PA8,  {stm_port_define(A, 8)}},
        {PA9,  {stm_port_define(A, 9)}},
        {PA10, {stm_port_define(A, 10)}},
        {PA11, {stm_port_define(A, 11)}},
        {PA12, {stm_port_define(A, 12)}},
        {PA13, {stm_port_define(A, 13)}},
        {PA14, {stm_port_define(A, 14)}},
        {PA15, {stm_port_define(A, 15)}},
        {PB0,  {stm_port_define(B, 0)}},
        {PB1,  {stm_port_define(B, 1)}},
        {PB2,  {stm_port_define(B, 2)}},
        {PB3,  {stm_port_define(B, 3)}},
        {PB4,  {stm_port_define(B, 4)}},
        {PB5,  {stm_port_define(B, 5)}},
        {PB6,  {stm_port_define(B, 6)}},
        {PB7,  {stm_port_define(B, 7)}},
        {PB8,  {stm_port_define(B, 8)}},
        {PB9,  {stm_port_define(B, 9)}},
        {PB10, {stm_port_define(B, 10)}},
        {PB11, {stm_port_define(B, 11)}},
        {PB12, {stm_port_define(B, 12)}},
        {PB13, {stm_port_define(B, 13)}},
        {PB14, {stm_port_define(B, 14)}},
        {PB15, {stm_port_define(B, 15)}},
        {PC0,  {stm_port_define(C, 0)}},
        {PC1,  {stm_port_define(C, 1)}},
        {PC2,  {stm_port_define(C, 2)}},
        {PC3,  {stm_port_define(C, 3)}},
        {PC4,  {stm_port_define(C, 4)}},
        {PC5,  {stm_port_define(C, 5)}},
        {PC6,  {stm_port_define(C, 6)}},
        {PC7,  {stm_port_define(C, 7)}},
        {PC8,  {stm_port_define(C, 8)}},
        {PC9,  {stm_port_define(C, 9)}},
        {PC10, {stm_port_define(C, 10)}},
        {PC11, {stm_port_define(C, 11)}},
        {PC12, {stm_port_define(C, 12)}},
        {PC13, {stm_port_define(C, 13)}},
        {PC14, {stm_port_define(C, 14)}},
        {PC15, {stm_port_define(C, 15)}},
        {PD0,  {stm_port_define(D, 0)}},
        {PD1,  {stm_port_define(D, 1)}},
        {PD2,  {stm_port_define(D, 2)}},
        {PD3,  {stm_port_define(D, 3)}},
        {PD4,  {stm_port_define(D, 4)}},
        {PD5,  {stm_port_define(D, 5)}},
        {PD6,  {stm_port_define(D, 6)}},
        {PD7,  {stm_port_define(D, 7)}},
        {PD8,  {stm_port_define(D, 8)}},
        {PD9,  {stm_port_define(D, 9)}},
        {PD10, {stm_port_define(D, 10)}},
        {PD11, {stm_port_define(D, 11)}},
        {PD12, {stm_port_define(D, 12)}},
        {PD13, {stm_port_define(D, 13)}},
        {PD14, {stm_port_define(D, 14)}},
        {PD15, {stm_port_define(D, 15)}},
        {PE0,  {stm_port_define(E, 0)}},
        {PE1,  {stm_port_define(E, 1)}},
        {PE2,  {stm_port_define(E, 2)}},
        {PE3,  {stm_port_define(E, 3)}},
        {PE4,  {stm_port_define(E, 4)}},
        {PE5,  {stm_port_define(E, 5)}},
        {PE6,  {stm_port_define(E, 6)}},
        {PE7,  {stm_port_define(E, 7)}},
        {PE8,  {stm_port_define(E, 8)}},
        {PE9,  {stm_port_define(E, 9)}},
        {PE10, {stm_port_define(E, 10)}},
        {PE11, {stm_port_define(E, 11)}},
        {PE12, {stm_port_define(E, 12)}},
        {PE13, {stm_port_define(E, 13)}},
        {PE14, {stm_port_define(E, 14)}},
        {PE15, {stm_port_define(E, 15)}},
        {PF0,  {stm_port_define(F, 0)}},
        {PF1,  {stm_port_define(F, 1)}},
        {PF2,  {stm_port_define(F, 2)}},
        {PF3,  {stm_port_define(F, 3)}},
        {PF4,  {stm_port_define(F, 4)}},
        {PF5,  {stm_port_define(F, 5)}},
        {PF6,  {stm_port_define(F, 6)}},
        {PF7,  {stm_port_define(F, 7)}},
        {PF8,  {stm_port_define(F, 8)}},
        {PF9,  {stm_port_define(F, 9)}},
        {PF10, {stm_port_define(F, 10)}},
        {PF11, {stm_port_define(F, 11)}},
        {PF12, {stm_port_define(F, 12)}},
        {PF13, {stm_port_define(F, 13)}},
        {PF14, {stm_port_define(F, 14)}},
        {PF15, {stm_port_define(F, 15)}}
};

struct stm_pin_define *stm_get_pin(enum pin_enum pin) {
    return &pin_map[pin].define;
}

文章来源地址https://www.toymoban.com/news/detail-617429.html

到了这里,关于Clion开发STM32之HAL库GPIO宏定义封装(最新版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 - GPIO中断/外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断,从而使得STM32微控制器能够及时响应外部设备的变化。 STM32的GPIO中断/外部中断EXTI可以配置为上升沿中断、下降沿中断和双边沿中断三种类型,分别在GPIO口电平从低电平变为高电平、从

    2024年02月12日
    浏览(28)
  • STM32基于HAL库的开发与应用(2)GPIO口控制

    一、GPIO口是在单片机开发应用中使用最频繁的一个控制。GPIO口可作为输出高低电平也可以作为输入检测输入电平的高低。 (1)通常GPIO口输出控制LED灯、有源蜂鸣器等一些只需要高低电平就可以触发的模块。 (2)通常GPIO口作为输入,用来检测输入电平的高低状态,常用于

    2024年02月11日
    浏览(28)
  • stm32——hal库学习笔记(GPIO)

    一、GPIO的八种模式分析(熟悉) GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_AIN 模拟输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽输出 应用总结 1、上拉输入、下拉输入可以用来检测外部信号

    2024年02月21日
    浏览(28)
  • STM32的GPIO操作(寄存器&HAL)

    (注:此为乐某学习记录,若有出错的地方欢迎各位指出!) 本人使用的开发板的芯片是STM32H743XIH6,所以外设也是根据此芯片来介绍。 在使用HAL库配置的时候,需要安装STM32CubeMX。此软件可在ST官网下载,剩下的安装步骤比较简单,不会单独出篇进行讲解。 STM32CubeMX下载网址

    2024年02月04日
    浏览(39)
  • (一)gpio-逐飞TC264库学习(对比STM32 HAL库)

    void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinmode) //------------------------------------------------------------------------------------------------------------------- // 函数简介     gpio 初始化 // 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值

    2024年02月02日
    浏览(25)
  • STM32 HAL库常用GPIO函数以及外部中断配置与响应流程

    Hello,大家好,这是我第一篇博客,写的不好请大家包涵指教,话不多说直接看内容: HAL库常用GPIO函数: void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init) 这个函数主要用来初始化我们需要用到的引脚,设置其工作频率、工作模式、上下拉等参数。如果使用CubeMX配置工程

    2024年02月03日
    浏览(37)
  • STM32开发 | Clion搭建STM32开发环境

    做嵌入式开发的人对STM32这个平台应该都是非常熟悉的,在国内尤其流行,很多产品里面都是基于这个平台做的方案。多数人在开发STM32的时候用的都是 Keil 这个老牌IDE,很大一部分原因是因为大多数人最初是从51单片机学习过来的,51就是基于Keil去开发的,然后迁移到STM32的

    2023年04月12日
    浏览(43)
  • stm32 hal库 GPIO初始化函数MX_GPIO_Init()梳理分析、初步细致学习(二)

    目录 一、GPIO外设时钟初始化 二、配置GPIO 2.1 配置 GPIO_InitTypeDef结构体成员变量  2.2 把参数写到对应寄存器 2.2.1 io口的配置 2.2.2 外部中断的配置 三、相关知识分析 3.1 hal_gpio其他函数简单分析 3.1.1 HAL_GPIO_DeInit(); 3.1.2  HAL_GPIO_ReadPin(); 3.1.3  HAL_GPIO_WritePin(); 3.1.4  HAL_GPIO_Togg

    2024年02月04日
    浏览(42)
  • 【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(Write_Pin) 输出信号点亮或熄灭LED GPIO引脚内部结构图 GPIO状态 输入浮空状态 :上拉下拉电阻均不使用(复位时

    2024年01月20日
    浏览(37)
  • cubmx基础操作,hal库基本配置流程之使用 stm32cubmx生成HAL库进行gpio点亮led(stm32h7xx)(超详细,小白教程)

    HAL库(硬件抽象层库)是一个提供对底层硬件操作的抽象的库,它使得开发者可以使用统一的接口进行硬件操作,而不必关心底层硬件的具体实现细节。HAL库通常由硬件厂商提供,用于支持其硬件设备,并为其提供标准化的接口。 HAL库的主要目的是简化底层硬件的操作,使得

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包