使用 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++ 语言,创建一个 STM32Usart 类。

最新文章

  1. jQuery插件开发精品教程,让你的jQuery提升一个台阶
  2. django(一)
  3. 2015ACM/ICPC亚洲区沈阳站
  4. C语言中定义全局变量
  5. mysql的事务处理
  6. Redis 哈希(Hash)
  7. OSGI在Eclipse中执行-console出错的问题
  8. SolrCloud 5.2.1 installation and configuration
  9. bash color
  10. 负载均衡软件LVS分析二(安装)
  11. node入门笔记
  12. .NET跨平台开发之Xamarin.Android介绍与生命周期【2】
  13. java实现控件的移动及使用鼠标改变控件大小
  14. net core中动态给log4net添加日志类型
  15. swoole Tcp服务器
  16. test-ipv6
  17. (转)CloudStack 安装及使用过程中常见问题汇总
  18. [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
  19. java 多线程之:synchronized
  20. java并发:Semaphore

热门文章

  1. Project://STARK
  2. SQL Server数据文件迁移
  3. vue-router导航守卫
  4. 伪元素after,before,css/js控制样式
  5. laravel vendor目录的安装
  6. Activiti:MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
  7. 详解NXP Cortex-M3加密设置
  8. Redis事务和watch
  9. 构建工具:webpack与grunt/gulp
  10. [JAVA反序列化DEMO]利用RMI进行反序列化一键启动工具