STM32 C++编程 002 GPIO类
使用 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<t;i++);
low();
for(int i=0;i<t;i++);
}
}
};
}
#endif
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<<indexPin,//??GPIO_Pin_x????
p_mode,
p_speed
);
}
Gpio::Gpio( uint32_t p_periph,
GPIO_TypeDef* p_port,
uint16_t p_pins, //???????
GPIOMode_TypeDef p_mode,
GPIOSpeed_TypeDef p_speed){
initialize(p_periph,
p_port,
p_pins, //???????
p_mode,
p_speed
);
}
void Gpio::initialize( GPIOMode_TypeDef p_mode){
if(m_gpio.mode==p_mode)return;
initialize(m_gpio.periph,
m_gpio.port,
m_gpio.pin, //???????
p_mode,
m_gpio.speed
);
m_gpio.mode=p_mode;
}
void Gpio::initialize( uint32_t p_periph,
GPIO_TypeDef* p_port,
uint16_t p_pins, //???????,???RAM?????
GPIOMode_TypeDef p_mode,
GPIOSpeed_TypeDef p_speed){
m_gpio.periph = p_periph;
m_gpio.port = p_port;
m_gpio.pin = p_pins;
m_gpio.mode=p_mode;
m_gpio.speed=p_speed;
GPIO_InitTypeDef tmp_InitType;//????
tmp_InitType.GPIO_Pin= m_gpio.pin ;
tmp_InitType.GPIO_Mode=m_gpio.mode;
tmp_InitType.GPIO_Speed=m_gpio.speed;
RCC_APB2PeriphClockCmd( m_gpio.periph, ENABLE );
GPIO_Init( m_gpio.port ,&tmp_InitType);
}
使用 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++工程模板:
百度云 链接:http://pan.baidu.com/s/1bpbZ2MV 密码:esam
也可以在CSDN里面下载:http://download.csdn.net/detail/github_35160620/9621141
小结:
下一讲,我们来使用 C++ 语言,创建一个 STM32 的 Usart 类。
STM32 C++编程 002 GPIO类的更多相关文章
- STM32 C++编程 005 I2c(Soft)类
使用 C++ 语言给 STM32 编写一个 I2c(Soft)类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编 ...
- STM32 C++编程 004 Adc (数模转换)类
使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...
- STM32 C++编程 003 USART(串口)类
使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...
- STM32库函数编程、Keli/MDK、stm32f103zet6
catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...
- STM32 C++编程 001 工程模板
将 STM32的官方工程模板 修改为我们这套教材的:STM32 C++工程模板 我使用的 STM32 库的版本 : V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏是有点门槛的.你需要 ...
- stm32学习笔记之GPIO功能框图分析
GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
- [.net 面向对象编程基础] (9) 类和类的实例
[.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
[.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...
随机推荐
- L122
These plants have much of the same nutritional value that a real plant has. Search giant Google says ...
- HihoCoder1182 欧拉路(Fleury算法)
描述 小Hi和小Ho破解了一道又一道难题,终于来到了最后一关.只要打开眼前的宝箱就可以通关这个游戏了. 宝箱被一种奇怪的机关锁住: 这个机关是一个圆环,一共有2^N个区域,每个区域都可以改变颜色,在黑 ...
- Effective Python之编写高质量Python代码的59个有效方法
这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...
- 每天一个linux命令(14):less命令
版权声明更新:2017-05-18博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...
- 学习动态性能表(20)--v$waitstat
学习动态性能表 第20篇--V$WAITSTAT 2007.6.15 本视图保持自实例启动所有的等待事件统计信息.常用于当你发现系统存在大量的"buffer busy waits" ...
- HDU1387:Team Queue
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1 ...
- loj 2542 随机游走 —— 最值反演+树上期望DP+fmt
题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...
- VMware tools的使用
现在的开发环境基本上都是lnmp,所以我们需要在windows下使用虚拟机来搭建开发环境, 但是 在本地写好代码以后,需要上传到虚拟机的运行目录,每次修改都需要上传??? 不存在的!!! 使用Vmwa ...
- Nginx解决错误413 Request Entity Too Large
最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...