基于STM32F10X的GPIO驱动

2023-05-16

  1. 完善我的文章《MCU BSP Driver分层设计》,本次提供GPIO控制驱动。

  1. 本片完成了GPIO控制驱动操作。

  1. 本人是基于野火指南者STM32开发板。

  1. 本驱动基于STM32F10X官方固件库。

  1. 主程序

int main(void)
{
    WHT_LED_Init_Config();
    for(;;)
    {
        WHT_LED_Color_Set(LED_RED);
        Delay(500);
        WHT_LED_Color_Set(LED_GREEN);
        Delay(500);
        WHT_LED_Color_Set(LED_BLUE);
        Delay(500);
        WHT_LED_Color_Set(LED_RGBOFF);
        Delay(100);
    }
}
  1. LED灯驱动程序

led头文件如下:

#ifndef __LED_DRIVER_H__
#define    __LED_DRIVER_H__

#include "../../BSP/GPIO_BSP/gpio_bsp.h"


//Red
#define LED0_GPIO_Port   PortB
#define LED0_GPIO_Pin    Pin5
//Green
#define LED1_GPIO_Port   PortB
#define LED1_GPIO_Pin    Pin0
//Blue
#define LED2_GPIO_Port   PortB
#define LED2_GPIO_Pin    Pin1

typedef enum
{
    LED_RED    = 0,//红色
    LED_GREEN  = 1,//绿色
    LED_BLUE   = 2,//蓝色
    LED_YELLOW = 3,//黄色(红+绿)
    LED_PURPLE = 4,//紫色(红+蓝)
    LED_CYAN   = 5,//青色(绿+蓝)
    LED_WHITE  = 6,//白色(红+绿+蓝)
    LED_RGBOFF = 7,//黑色(全部关闭)
}WHT_LED_Color_enum;

extern void WHT_LED_Init_Config(void);
extern void WHT_LED_Color_Set(WHT_LED_Color_enum LED_Color);

#endif /* __LED_DRIVER_H__ */

led源文件如下:

#include "led_driver.h"

static WHT_GPIO_Device_t led_device = { 0 };

static void wht_gpio_init_config(void)
{
    WHT_LED_Color_Set(LED_WHITE);
    led_device.WHT_Set_GPIO_Mode(LED0_GPIO_Port, LED0_GPIO_Pin, Mode_Out_PP);
    led_device.WHT_Set_GPIO_Mode(LED1_GPIO_Port, LED1_GPIO_Pin, Mode_Out_PP);
    led_device.WHT_Set_GPIO_Mode(LED2_GPIO_Port, LED2_GPIO_Pin, Mode_Out_PP);
}

void WHT_LED_Color_Set(WHT_LED_Color_enum LED_Color)
{
    WHT_GPIO_State_enum LED_Red_State;
    WHT_GPIO_State_enum LED_Green_State;
    WHT_GPIO_State_enum LED_Blue_State;

    switch (LED_Color)
    {
    case LED_RED:
        LED_Red_State = Low;
        LED_Green_State = Hig;
        LED_Blue_State = Hig;
        break;
    case LED_GREEN:
        LED_Red_State = Hig;
        LED_Green_State = Low;
        LED_Blue_State = Hig;
        break;
    case LED_BLUE:
        LED_Red_State = Hig;
        LED_Green_State = Hig;
        LED_Blue_State = Low;
        break;
    case LED_YELLOW:
        LED_Red_State = Low;
        LED_Green_State = Low;
        LED_Blue_State = Hig;
        break;
    case LED_PURPLE:
        LED_Red_State = Low;
        LED_Green_State = Hig;
        LED_Blue_State = Low;
        break;
    case LED_CYAN:
        LED_Red_State = Hig;
        LED_Green_State = Low;
        LED_Blue_State = Low;
        break;
    case LED_WHITE:
        LED_Red_State = Low;
        LED_Green_State = Low;
        LED_Blue_State = Low;
        break;
    case LED_RGBOFF:
        LED_Red_State = Hig;
        LED_Green_State = Hig;
        LED_Blue_State = Hig;
        break;
    default:
        return;
    }
    led_device.WHT_Set_GPIO_State(LED0_GPIO_Port, LED0_GPIO_Pin, LED_Red_State);
    led_device.WHT_Set_GPIO_State(LED1_GPIO_Port, LED1_GPIO_Pin, LED_Green_State);
    led_device.WHT_Set_GPIO_State(LED2_GPIO_Port, LED2_GPIO_Pin, LED_Blue_State);
}

void WHT_LED_Init_Config(void)
{
    WHT_GPIO_Init_Config(&led_device);
    wht_gpio_init_config();
}
  1. GPIO驱动如下

GPIO头文件:

#ifndef __GPIO_BSP_H__
#define __GPIO_BSP_H__

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

typedef enum
{
    PortA = (uint32_t)GPIOA,
    PortB = (uint32_t)GPIOB,
    PortC = (uint32_t)GPIOC,
    PortD = (uint32_t)GPIOD,
    PortE = (uint32_t)GPIOE,
    PortF = (uint32_t)GPIOF,
    PortG = (uint32_t)GPIOG,
}WHT_GPIO_Port_enum;

typedef enum
{
    Pin0  = GPIO_Pin_0,
    Pin1  = GPIO_Pin_1,
    Pin2  = GPIO_Pin_2,
    Pin3  = GPIO_Pin_3,
    Pin4  = GPIO_Pin_4,
    Pin5  = GPIO_Pin_5,
    Pin6  = GPIO_Pin_6,
    Pin7  = GPIO_Pin_7,
    Pin8  = GPIO_Pin_8,
    Pin9  = GPIO_Pin_9,
    Pin10 = GPIO_Pin_10,
    Pin11 = GPIO_Pin_11,
    Pin12 = GPIO_Pin_12,
    Pin13 = GPIO_Pin_13,
    Pin14 = GPIO_Pin_14,
    Pin15 = GPIO_Pin_15,
    PinAll =GPIO_Pin_All,
}WHT_GPIO_Pin_enum;

typedef enum
{
    Low = 0,
    Hig = !Low,
}WHT_GPIO_State_enum;

typedef enum
{
    Mode_Ain         = (uint8_t)GPIO_Mode_AIN,        //模拟输入
    Mode_IN_FLOATING = (uint8_t)GPIO_Mode_IN_FLOATING,//浮空输入
    Mode_IPD         = (uint8_t)GPIO_Mode_IPD,        //下拉输入
    Mode_IPU         = (uint8_t)GPIO_Mode_IPU,        //上拉输入
    Mode_Out_OD      = (uint8_t)GPIO_Mode_Out_OD,     //开漏输出
    Mode_Out_PP      = (uint8_t)GPIO_Mode_Out_PP,     //推挽输出
    Mode_AF_OD       = (uint8_t)GPIO_Mode_AF_OD,      //开漏复用输出
    Mode_AF_PP       = (uint8_t)GPIO_Mode_AF_PP,      //推挽复用输出
}WHT_GPIO_Mode_enum;

typedef struct
{
    void (*WHT_Set_GPIO_Mode)(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx, WHT_GPIO_Mode_enum mode);
    void (*WHT_Set_GPIO_State)(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx, WHT_GPIO_State_enum state);
    WHT_GPIO_State_enum(*WHT_Get_GPIO_State)(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx);
}WHT_GPIO_Device_t;

extern void WHT_GPIO_Init_Config(WHT_GPIO_Device_t* wht_gpio_device);

#endif /*__GPIO_BSP_H__*/

GPIO源文件:

#include "gpio_bsp.h"

static void wht_set_gpio_mode(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx, WHT_GPIO_Mode_enum mode)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    uint32_t RCC_APB2Periph;

    switch (portx)
    {
    case PortA:RCC_APB2Periph = RCC_APB2Periph_GPIOA; break;
    case PortB:RCC_APB2Periph = RCC_APB2Periph_GPIOB; break;
    case PortC:RCC_APB2Periph = RCC_APB2Periph_GPIOC; break;
    case PortD:RCC_APB2Periph = RCC_APB2Periph_GPIOD; break;
    case PortE:RCC_APB2Periph = RCC_APB2Periph_GPIOE; break;
    case PortF:RCC_APB2Periph = RCC_APB2Periph_GPIOF; break;
    case PortG:RCC_APB2Periph = RCC_APB2Periph_GPIOG; break;
    default:
        return;
    }
    RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = (GPIOMode_TypeDef)mode;
    GPIO_InitStruct.GPIO_Pin = pinx;
    GPIO_Init((GPIO_TypeDef*)portx, &GPIO_InitStruct);
}
static void wht_set_gpio_state(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx, WHT_GPIO_State_enum state)
{
    if (state == Hig)
        GPIO_SetBits((GPIO_TypeDef*)portx, pinx);
    else
        GPIO_ResetBits((GPIO_TypeDef*)portx, pinx);
}
static WHT_GPIO_State_enum wht_get_gpio_state(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx)
{
    if (GPIO_ReadInputDataBit((GPIO_TypeDef*)portx, pinx) == Bit_SET)
        return Hig;
    else
        return Low;
}

void WHT_GPIO_Init_Config(WHT_GPIO_Device_t* wht_gpio_device)
{
    wht_gpio_device->WHT_Set_GPIO_Mode = wht_set_gpio_mode;
    wht_gpio_device->WHT_Get_GPIO_State = wht_get_gpio_state;
    wht_gpio_device->WHT_Set_GPIO_State = wht_set_gpio_state;
}
  1. 最终的固件库就不贴了,基于官方固件库的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F10X的GPIO驱动 的相关文章

  • NVIDIA Jetson NX 控制GPIO

    目录 前言运行引脚图片 前言 看到一些博客说需要pip安装Jetson GPIO 以及通过下面命令设置用户权限 sudo groupadd span class token operator span f span class token
  • NVIDIA Jetson Xavier NX 控制GPIO

    NVIDIA Jetson Xavier NX 控制GPIO 文章目录 NVIDIA Jetson Xavier NX 控制GPIO前言一 简介二 代码实例1 gpio h2 gpio cpp 三 拓展 前言 在linux系统中以文件io的
  • 【STM32】GPIO_InitTypeDef GPIO_InitStructure;语句的理解

    这句话声明一个结构体 xff0c 名字是GPIO InitStructure xff0c 结构体原型由GPIO InitTypeDef 确定 xff0c 在stm32中用来初始化GPIO 设置完GPIO InitStructure里面的内容
  • Jetson Xavier gpio编程 (8)

    GPIO lines are attached to gpiochips Look in sys class gpio and you should see gpiochip240 248 and 288 I haven t yet det
  • GD32VF103之GPIO最小配置

    longan nano是Sipeed xff08 矽速科技 xff09 推出的开发板 xff0c 使用兆易创新的gd32vf103cbt6芯片 xff0c 该芯片是基于芯来科技的Nuclei Bumblebee处理器的32位通用微控制器 x
  • 28335之GPIO输入

    include 34 DSP2833x Device h 34 include 34 DSP2833x Examples h 34 define LED GpioDataRegs GPADAT bit GPIO0 GPIO配置函数 void
  • stm32简介+gpio的C语言封装

  • 【跟着江科大学Stm32】GPIO_LED_流水灯_蜂鸣器

    只要坚持下来了 xff0c 一定会有收获 xff01 一 LED闪烁 span class token macro property span class token directive hash span span class token
  • GPIO模式

    开漏输出 只能输出低电平 xff0c 不能输出高电
  • 树莓派GPIO

    命令行执行下行 xff0c 即可得树莓派管脚编码表 gpio readall 也可看下图 xff1a BOARD 编号参考 Raspberry Pi 主板上 P1 接线柱的针脚编号 使用该方式的优点是无需考虑主板的修订版本 xff0c 无需
  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解

    GPIO TypeDef GPIOA BASE 表示将GPIOA BASE强制转换为指针类型的结构体 xff0c define GPIOA GPIO TypeDef GPIOA BASE 表示用 GPIO TypeDef GPIOA BAS
  • 0.8 - GPIO的输入输出模式

    GPIO xff1a General purpose input output 从参考手册可知 xff0c GPIO可以配置成上图中的多种模式 xff0c 但是要理解这些名字的含义还是要具体分析GPIO功能框图 xff1a 结合GPIO的输
  • linux用户态使用gpio中断方法

    一 用户空间gpio的调用文件 用户空间访问gpio 即通过sysfs接口访问gpio 下面是 sys class gpio目录下的三种文件 export unexport文件 gpioN指代具体的gpio引脚 gpio chipN指代gp
  • Linux的GPIO子系统解析 ( 一 ) 之 gpiolib.c

    文章目录 Linux的GPIO子系统解析 一 之 gpiolib c 绪论 关于GPIO子系统库文件的gpiolib c解析 drivers gpio gpiolib c gpio desc结构体 gpio chip结构体 gpio ens
  • 使用HAL库开发STM32:GPIO口基础使用与外部中断

    文章目录 目的 GPIO口基础使用 基础说明 初始化设置 输出与控制 读取端口值 GPIO口与外部中断 总结 目的 对于MCU来说GPIO口的使用是最基础的内容 仅使用GPIO口和延时等 就可以完成很多功能了 GPIO口基础使用 基础说明
  • stm32F1的JTAG、SWJ作为普通引脚使用。禁用JTAG、SWJ。

    stm32F1的JTAG SWJ引脚 为 PA13 PA14 PA15 PB3 PB4 单片机复位后 默认功能为 JTAG SWJ 而实际使用中 一般只使用 SWCLK SWDIO这两个引脚做 Debug 其余的引脚可以空出来 重新定义为普
  • 如何在Python中运行后一段时间内禁用Raspberry Pi GPIO事件?

    每当我的 Raspberry Pi 的 GPIO 引脚出现下降沿时 我就会创建一个事件 但是 我想在每次运行后禁用此事件一段时间 例如 5 秒 我希望在该时间段之后再次启用该事件 我的第一个想法就是使用sleep 5 在实际的事件函数中 但
  • Raspberry pi 4 用 java 控制 GPIO

    我想用java控制我的树莓派4上的16 2液晶显示屏 问题是Pi4J 用java修改gpios的解决方案没有更新到pi4 还有其他解决方案吗 当我启动程序时出现此错误 pi raspberrypi desktop gpio sudo sta
  • 如何为连接到 I2C gpio 扩展器的虚拟 mdio-gpio 设备配置 ACPI *.asl

    我正在使用 Q7 模块 x86 并尝试在 Linux 上使用 ACPI SSDT Overlay 配置我们的外设 但我对此很挣扎 我想我误解了ACPI的一些核心概念 Problem CPU gt I2C gt PCA9575 GPIO Ex
  • linux GPIO C API

    我有一个 powerpc 板 上面运行着 3 2 内核 使用 sysfs 访问 GPIO 按预期工作 例如 gt echo 242 gt sys class gpio export gt cat sys class gpio gpio242

随机推荐

  • 【MemoryCompression内存占用过高】

    MemoryCompression内存占用过高 最近笔记本内存 xff08 16G运存 xff09 占用一直在95 43 xff0c cpu占用也在90 43 xff0c 电脑一度无法使用 96 步骤1 96 96 步骤2 96 步骤 96
  • 洛谷 P3366 【模板】最小生成树 (题解+代码)

    题目传送门 xff1a https www luogu com cn problem P3366 题解 xff1a 利用Kruskal算法求解 xff0c 这里大致说下Kruskal算法 对于一个点数为n的生成树而言 很显然 xff0c 想
  • WSL_03 WSL2 从C盘迁移到D盘

    文章目录 1 动机1 查看虚拟机状态 xff0c 并关闭要迁移的虚拟机2 迁移WSL22 1 出现的问题 xff1a 已存在具有提供的名称的分发 已解决 3 设置启动时的默认用户 xff0c 没有设置默认为root参考 1 动机 WSL2默
  • iOS开发:Block传值的运用

    在iOS开发中传值是一个非常经典的方法 有六种传值方式 属性传值 代理传值 Block传值 方法传值 单例传值 通知传值 本章就来分享一下通过Block完成两个不同界面间的传值操作 首先再来了解一下Block 简单一点说 Block就是一段
  • Ubuntu 安装 CUDA and Cudnn

    文章目录 0 查看 nvidia驱动版本1 下载Cuda2 下载cudnn参考 xff1a 0 查看 nvidia驱动版本 nvidia smi 1 下载Cuda 安装之前先安装 gcc g 43 43 gdb 官方 xff1a https
  • 傻傻分不清楚:裸纤、专线、SDH、MSTP、MSTP+、OTN、PTN、IP-RAN

    著作权归作者所有 xff1a 来自51CTO博客作者51CTOsummer的原创作品 xff0c 如需转载 xff0c 请注明出处 xff0c 否则将追究法律责任 xff08 一 xff09 裸纤 裸纤也叫裸光纤 xff0c 运营商提供一条
  • github下载慢的两种解决方式

    1 修改配置文件 cmd ping github com会显示超时 我们只需要绕过dns域名解析就行 打开DNS查询网站http tool chinaz com dns xff0c 搜索github com的域名解析服务 xff0c 选择一
  • ModuleNotFoundError: No module named ‘cv2‘解决办法

    xff08 linux系统 xff09 这里记录一个实验过程中碰到的bug xff1a 我是在linux系统上面使用conda环境 xff0c 且已经下载了opencv python xff0c 但在python文件中import cv2仍
  • mybatis-plus + PageHelper

    一 导入相关依赖 span class token operator lt span span class token operator span span class token operator span mysql 驱动包 span
  • 阿里云端口问题-配置完安全组无效

    Centos7 X安全组配置完成后仍不能访问 xff0c 此时要配置防火墙放行端口才行 使用以下命令打开端口 tcp udp 两种传输层模式 add port 61 端口号 firewall cmd zone 61 public add p
  • Anaconda教程——Ubuntu 平台

    Anaconda 使用教程 Ubuntu 平台 说明 xff1a 对应着 Python 有 2 x 版本和 3 x 版本 xff0c Anaconda 也有 Anaconda2 以及 Anaconda 3 两个版本 xff0c 考虑其流行度
  • ubuntu突然上不去网

    今天ubuntu突然上不去网了 xff08 昨天还行 xff0c 就很神奇 xff09 在一篇博客中找到了解决办法 xff0c 里面给出了三种解决办法 xff0c 详见原文连接 我用的第二种 xff0c 很简单 xff0c 亲测有效 记录下
  • 原理篇1、锂电池充/供电与电量检测

    目录 1 充电 供电电路2 电量检测电路3 电量计算4 关于IIR滤波器设计参考资料资料获取 1 充电 供电电路 键盘上的充电电路原理图 数据手册中的原理图 其中与TP5400 3脚 PROG 连接的电阻用来设置充电电流大小 电阻大小与充电
  • git 配置用户名与邮箱(git篇)

    配置使用 Git 仓库的人员姓名 span class token function git span config span class token parameter variable global span user name spa
  • 华为2288H V5服务器iBMC 安装windows server服务器

    公司有一台2288H V5服务器 xff0c 需要重装 xff0c IT的人走了 xff0c 只能自己去安装了 xff0c 去机房 xff0c 发现已经设置好了iBMC xff0c IP已经和公司网络连在一起 xff0c 可以直接在自己办公
  • 木棒加工问题(贪心+动态规划)

    问题描述 现有n根木棒 xff0c 已知它们的长度和重量 xff0c 要用一部木工机一根一根地加工这些木棒 该机器在加工过程中需要一定的准备时间 xff0c 是用于清洗机器 xff0c 调整工具和模板的 木工机需要的准备时间如下 xff1a
  • 清翔51单片机开发板及原理图-去年购买的

    2019年购买了清翔的51单片机开发板 xff0c 然后开始学习单片机编程及开发 xff0c 学习到2020年7月份 xff0c 基本上学习的差不多了 xff0c 现在开始我要开始写博客了 之前的维修博客暂停
  • 51单片机——蜂鸣器按照次数响起1.0

    写的不知道好不好 xff0c 有什么不对的地方还请指出 xff0c 谢了 本次使用了do while xff0c 听说比单独的while循环速度快 xff0c 具体也不太清楚 xff0c 就按照别人说的了 且蜂鸣器每次响1秒 xff0c 响
  • MCU BSP Driver分层设计

    最近在摸索和学习中发现 xff0c 可以对于MCU驱动使用分层设计思想 这样的设计避免应用层 用户层和功能层直接去操作寄存器了 所有寄存器的操作均在 通用设备驱动层 xff0c 这个层是直接控制MCU的寄存器 哦 xff0c 驱动层里面忘记
  • 基于STM32F10X的GPIO驱动

    完善我的文章 MCU BSP Driver分层设计 xff0c 本次提供GPIO控制驱动 本片完成了GPIO控制驱动操作 本人是基于野火指南者STM32开发板 本驱动基于STM32F10X官方固件库 主程序 int main void WH