博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32 C++编程 002 GPIO类
阅读量:4513 次
发布时间:2019-06-08

本文共 5459 字,大约阅读时间需要 18 分钟。

使用 C++ 语言给 STM32 编写一个 Gpio

我使用的STM32芯片:STM32F103ZET6

我们使用的STM32库版本:V3.5.0



注意:

  • 想学习本套 STM32 C++编程 的专栏是有点门槛的。你需要有一点点 STM32 基础 和 一点点 C++ 语言基础。

  • 完整的STM32 C++工程模板 的下载地址可以在本篇博客的最下面找到。


Gpio.h

//Gpio.h//#pragma once   //编译一次#ifndef __AOBO_stm3210x_Gpio_H_#define     __AOBO_stm3210x_Gpio_H_#include "stm32f10x.h"/*--------------------Gpio--------------------------------------*/// //eg://  Gpio  key1(RCC_APB2Periph_GPIOC,GPIOC,GPIO_Pin_1,GM_IN_FLOATING);//  Gpio  pins(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,GPIOC,GPIO_Pin_1|GPIO_Pin_10);//  Gpio  EnTk(PA,0);//   特别注意://   1.当你使用PB3,4 PA13,14,15 时一定要加上这2句://          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//      GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);  // 同时关闭 JLink 和 STlink//   2.PD0,1 是不能被用做I/O口使用的 . 他们是接外部进制的namespace stm32f10x{typedef struct   tagGPIO_PIN{    uint32_t            periph;//eg:RCC_APB2Periph_GPIOF    GPIO_TypeDef*           port;    //eg:GPIOF    uint16_t            pin;     //eg:GPIO_Pin_10    GPIOMode_TypeDef    mode;    //eg.GPIO_Mode_IN_FLOATING;    GPIOSpeed_TypeDef   speed;   //eg.GPIO_Speed_50MHz}GPIO_PIN;enum PORT_INDEX{    PA=0,PB,PC,PD,PE,PF,PG };typedef struct _periph_PORT{    uint32_t        p_periph;    GPIO_TypeDef*       p_port;}periph_PORT;#define GM_AIN            GPIO_Mode_AIN            #define GM_IN_FLOATING      GPIO_Mode_IN_FLOATING   #define GM_IPD          GPIO_Mode_IPD        #define GM_IPU          GPIO_Mode_IPU        #define GM_OUT_OD           GPIO_Mode_Out_OD       #define GM_OUT_PP           GPIO_Mode_Out_PP      #define GM_AFOD             GPIO_Mode_AF_OD            #define GM_AFPP             GPIO_Mode_AF_PP         class Gpio{private:    GPIO_PIN m_gpio;public:    ~Gpio()    {    }    Gpio()    {    }    Gpio(PORT_INDEX     indexPort,        uint16_t              indexPin, //???0~15??GPIO_Pin_0~GPIO_Pin_15        GPIOMode_TypeDef        p_mode=GM_OUT_PP,        GPIOSpeed_TypeDef       p_speed=GPIO_Speed_50MHz );       Gpio( uint32_t      p_periph,        GPIO_TypeDef*       p_port,        uint16_t            p_pins,    //???????        GPIOMode_TypeDef        p_mode=GPIO_Mode_Out_PP,        GPIOSpeed_TypeDef       p_speed=GPIO_Speed_50MHz );    void initialize( GPIOMode_TypeDef   p_mode=GPIO_Mode_Out_PP );    void initialize( uint32_t           p_periph,            GPIO_TypeDef*           p_port,            uint16_t            p_pins,    //???????,???RAM?????            GPIOMode_TypeDef    p_mode=GPIO_Mode_Out_PP,            GPIOSpeed_TypeDef   p_speed=GPIO_Speed_50MHz );    inline  bool get(void){        if( ishigh() ){            return true;        }        else{            return false;        }    }    inline void set(bool bs){        if(bs){            high();//GPIO_SetBits(m_gpio.port, m_gpio.pin);        }        else{            low();//GPIO_ResetBits(m_gpio.port, m_gpio.pin);        }    }    inline void invert(void){        if ( ishigh() ){            low();//GPIO_ResetBits(m_gpio.port, m_gpio.pin);        }        else{            high();//GPIO_SetBits(m_gpio.port, m_gpio.pin);        }    }    inline void high(void){             //GPIO_SetBits(m_gpio.port, m_gpio.pin);        m_gpio.port->BSRR = m_gpio.pin;    }    inline void low(void){          //GPIO_ResetBits(m_gpio.port, m_gpio.pin);    m_gpio.port->BRR = m_gpio.pin;    }    inline bool ishigh()    {           // if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)  GPIO_ReadInputDataBit(m_gpio.port, m_gpio.pin)==Bit_SET        if( m_gpio.port->IDR & m_gpio.pin){            return true;        }        else{           return false;        }    }    inline bool islow(){                  // if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)  GPIO_ReadInputDataBit(m_gpio.port, m_gpio.pin)==Bit_SET        if( m_gpio.port->IDR & m_gpio.pin){            return false;         }        else{            return true;        }    }    void toggle(uint32_t t=1000,bool bLoop=true) {        while(bLoop){            high();            for(int i=0;i

Gpio.cpp

#include "Gpio.h"using namespace stm32f10x;periph_PORT PERIPH_PORT[]={    RCC_APB2Periph_GPIOA,GPIOA,    RCC_APB2Periph_GPIOB,GPIOB,    RCC_APB2Periph_GPIOC,GPIOC,    RCC_APB2Periph_GPIOD,GPIOD,    RCC_APB2Periph_GPIOE,GPIOE,    RCC_APB2Periph_GPIOF,GPIOF,    RCC_APB2Periph_GPIOG,GPIOG,};Gpio::Gpio(PORT_INDEX   indexPort,        uint16_t              indexPin, //???0~15??GPIO_Pin_0~GPIO_Pin_15        GPIOMode_TypeDef        p_mode,        GPIOSpeed_TypeDef       p_speed){                initialize(PERIPH_PORT[indexPort].p_periph,            PERIPH_PORT[indexPort].p_port,            (uint16_t)1<

使用 Gpio 的例子程序:4个LED流水点亮。

main.cpp

/* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "Gpio.h"using namespace stm32f10x;/* Private functions ---------------------------------------------------------*//**  * @brief  Main program.  * @param  None  * @retval None  */int main(void){    Gpio DS1_N(PG,8);    Gpio DS2_N(PG,15);    Gpio DS3_N(PA,5);    Gpio DS4_N(PA,6);    uint8_t i=0;    while(true)    {         i++;         i & 0x01 ? DS1_N.low():DS1_N.high();         i & 0x02 ? DS2_N.low():DS2_N.high();         i & 0x04 ? DS3_N.low():DS3_N.high();         i & 0x08 ? DS4_N.low():DS4_N.high();         for(uint32_t i=0;i<3000000;i++);    }}

搞定


你可以到这里下载我已经做好的 STM32 C++工程模板

百度云 链接: 密码:esam
也可以在CSDN里面下载:



小结:

下一讲,我们来使用 C++ 语言,创建一个 STM32Usart 类。

转载于:https://www.cnblogs.com/aobosir/p/5928575.html

你可能感兴趣的文章
TCP协议的滑动窗口具体是怎样控制流量的
查看>>
VS插件
查看>>
Python之time模块
查看>>
Linux常用命令使用
查看>>
jmeter和postman小结
查看>>
JQuery 绑定事件时传递参数的实现方法
查看>>
nodejs直接调用grunt(非调用批处理)
查看>>
linux中vim常用的快捷键
查看>>
报表开发之批量导入导出excel
查看>>
HDOJ 2502月之数
查看>>
Mybatis基础-完整CRUD操作
查看>>
hadoop之 mapreduce example(2)
查看>>
3.2.2.频数分布
查看>>
Django图文混排
查看>>
No converter found for return value of type: class com.alibaba.fastjson.JSON解决办法
查看>>
苦酒入喉心作痛,红酒入鹅鹅想哭——震惊!勒索病毒想哭靠wine感染了Ubuntu16.04...
查看>>
VB内存操作类模块
查看>>
Python 2.7 与Python3的区别
查看>>
修复grub
查看>>
权值线段树
查看>>