基于STM32F10X的GPIO驱动V0.1

2023-05-16

  1. 基于上篇《基于STM32F10X的GPIO驱动》增加GPIO的操作功能,并且优化提高部分函数效率。

  1. 最重要的添加了未带操作,这样就可以高效的控制GPIO了。

3、未解决的问题:

当前我无法将WHT_GPIO_Pin_enum和WHT_GPIO_Pin_Number_enum通过某种算法关联上,log2(data)不行,无法在编译的时候计算值。导致我需要重新添加枚举。有方法的麻烦分享下。

gpio_bsp.h

//作者:王海涛
#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
{
    Pin_Number0  = 0,
    Pin_Number1  = 1,
    Pin_Number2  = 2,
    Pin_Number3  = 3,
    Pin_Number4  = 4,
    Pin_Number5  = 5,
    Pin_Number6  = 6,
    Pin_Number7  = 7,
    Pin_Number8  = 8,
    Pin_Number9  = 9,
    Pin_Number10 = 10,
    Pin_Number11 = 11,
    Pin_Number12 = 12,
    Pin_Number13 = 13,
    Pin_Number14 = 14,
    Pin_Number15 = 15,
}WHT_GPIO_Pin_Number_enum;

typedef enum
{
    Low = 0,
    Hig = 1,
    Bit_Reset = 0,
    Bit_Set   = 1,
}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, uint16_t pinx, WHT_GPIO_Mode_enum mode);   //pinx for WHT_GPIO_Pin_enum
    void (*WHT_Set_GPIO_State)(WHT_GPIO_Port_enum portx, uint16_t pinx, WHT_GPIO_State_enum state);//pinx for WHT_GPIO_Pin_enum
    WHT_GPIO_State_enum(*WHT_Get_GPIO_State)(WHT_GPIO_Port_enum portx, WHT_GPIO_Pin_enum pinx);
    uint16_t (*WHT_Get_GPIO_Prot_Value)(WHT_GPIO_Port_enum portx);
    void (*WHT_Set_GPIO_Prot_Value)(WHT_GPIO_Port_enum portx,uint16_t port_value);
}WHT_GPIO_Device_t;

extern void WHT_GPIO_Init_Config(WHT_GPIO_Device_t* wht_gpio_device);
//备注:当前我无法将WHT_GPIO_Pin_enum和WHT_GPIO_Pin_Number_enum通过某种算法关联上,log2(data)不行,无法在编译的时候计算值
#define WHT_Set_GPIO_Pin_State(WHT_GPIO_Port_enum,WHT_GPIO_Pin_Number_enum)    (*((volatile uint32_t*)(((WHT_GPIO_Port_enum+0x0c)&0xf0000000)+0x02000000+(((WHT_GPIO_Port_enum+0x0c)&0x00ffffff)<<5)+(WHT_GPIO_Pin_Number_enum<<2))))
#define WHT_Get_GPIO_Pin_State(WHT_GPIO_Port_enum,WHT_GPIO_Pin_Number_enum)    (*((volatile uint32_t*)(((WHT_GPIO_Port_enum+0x08)&0xf0000000)+0x02000000+(((WHT_GPIO_Port_enum+0x08)&0x00ffffff)<<5)+(WHT_GPIO_Pin_Number_enum<<2))))

#endif /*__GPIO_BSP_H__*/

gpio_bsp.c

//作者:王海涛
#include "gpio_bsp.h"

static void wht_set_gpio_mode(WHT_GPIO_Port_enum portx, uint16_t 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, uint16_t pinx, WHT_GPIO_State_enum state)
{
    GPIO_WriteBit((GPIO_TypeDef*)portx, pinx, (BitAction)state);
}
static WHT_GPIO_State_enum wht_get_gpio_state(WHT_GPIO_Port_enum portx, uint16_t pinx)
{
    return (WHT_GPIO_State_enum)GPIO_ReadInputDataBit((GPIO_TypeDef*)portx, pinx);
}
static uint16_t wht_get_gpio_prot_value(WHT_GPIO_Port_enum portx)
{
    return GPIO_ReadInputData((GPIO_TypeDef*)portx);
}
static void wht_set_gpio_prot_value(WHT_GPIO_Port_enum portx,uint16_t port_value)
{
    GPIO_Write((GPIO_TypeDef*)portx, port_value);
}

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;
    wht_gpio_device->WHT_Get_GPIO_Prot_Value = wht_get_gpio_prot_value;
    wht_gpio_device->WHT_Set_GPIO_Prot_Value = wht_set_gpio_prot_value;
}
  1. LED驱动为了适配新的GPIO驱动,故做了优化调整。

led_driver.h

//作者:王海涛
#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
#define LED0_State       WHT_Set_GPIO_Pin_State(LED0_GPIO_Port,Pin_Number5)
//Green
#define LED1_GPIO_Port   PortB
#define LED1_GPIO_Pin    Pin0
#define LED1_State       WHT_Set_GPIO_Pin_State(LED1_GPIO_Port,Pin_Number0)
//Blue
#define LED2_GPIO_Port   PortB
#define LED2_GPIO_Pin    Pin1
#define LED2_State       WHT_Set_GPIO_Pin_State(LED2_GPIO_Port,Pin_Number1)

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_driver.c

//作者:王海涛
#include "led_driver.h"

static void gpio_init_config(void)
{
    WHT_GPIO_Device_t wht_device;

    WHT_GPIO_Init_Config(&wht_device);
    WHT_LED_Color_Set(LED_WHITE);
    wht_device.WHT_Set_GPIO_Mode(LED0_GPIO_Port, LED0_GPIO_Pin, Mode_Out_PP);
    wht_device.WHT_Set_GPIO_Mode(LED1_GPIO_Port, LED1_GPIO_Pin, Mode_Out_PP);
    wht_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)
{
    switch (LED_Color)
    {
    case LED_RED:
        LED0_State = Low;
        LED1_State = Hig;
        LED2_State = Hig;
        break;
    case LED_GREEN:
        LED0_State = Hig;
        LED1_State = Low;
        LED2_State = Hig;
        break;
    case LED_BLUE:
        LED0_State = Hig;
        LED1_State = Hig;
        LED2_State = Low;
        break;
    case LED_YELLOW:
        LED0_State = Low;
        LED1_State = Low;
        LED2_State = Hig;
        break;
    case LED_PURPLE:
        LED0_State = Low;
        LED1_State = Hig;
        LED2_State = Low;
        break;
    case LED_CYAN:
        LED0_State = Hig;
        LED1_State = Low;
        LED2_State = Low;
        break;
    case LED_WHITE:
        LED0_State = Low;
        LED1_State = Low;
        LED2_State = Low;
        break;
    case LED_RGBOFF:
        LED0_State = Hig;
        LED1_State = Hig;
        LED2_State = Hig;
        break;
    default:
        return;
    }
}

void WHT_LED_Init_Config(void)
{
    gpio_init_config();
}

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

基于STM32F10X的GPIO驱动V0.1 的相关文章

随机推荐

  • 洛谷 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
  • 基于STM32F10X的GPIO驱动V0.1

    基于上篇 基于STM32F10X的GPIO驱动 增加GPIO的操作功能 xff0c 并且优化提高部分函数效率 最重要的添加了未带操作 xff0c 这样就可以高效的控制GPIO了 3 未解决的问题 xff1a 当前我无法将WHT GPIO P