STM32实战三 C++ IO.cpp

发布者:和谐的24号最新更新时间:2019-08-01 来源: eefocus关键字:STM32  C++  cpp 手机看文章 扫描二维码
随时随地手机看文章

这一章开始编写代码,主要是两个方面,一是C++,二是进行简单的IO封装。其它教程一般是用C语言,从按键或LED灯开始,比较直观,容易上手,但与实际应用有一定的区别,这里要做的是实用控制程序,开始就比较正规,C++是发展趋势,所以就从这里开始。


说是C++,实际是C和C++的混合程序,系统提供的都是C,新写的代码是C++,先从简单的IO开始,添加两个文件IO.cpp和IO.h代码如下:


IO.h


#ifndef __IO__

#define __IO__

 

extern "C" { // 按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段

#pragma diag_remark 368 //消除 warning: #368-D: class "" defines no constructor to initialize the following:

 

#include "stm32f10x.h"

 

#pragma diag_default 368 // 恢复368号警告

}

 

// 通用IO

class IO

{

// Construction

public:

IO(GPIO_TypeDef* GPIOx, u16 nPin, GPIOMode_TypeDef GPIO_Mode, u16 nLevel); // 输出时设置初始电平,0低,1高,其它不设置

// Properties

public:

  GPIO_InitTypeDef GPIO_InitStructure;

GPIO_TypeDef* m_GPIOx;

u16 m_nPin;

 

private:

 

// Methods

public:

// Overwrite

public:

};

 

#endif

IO.cpp


/**

  ******************************************************************************

  * @file IO.cpp

  * @author Mr. Hu

  * @version V1.0.0 STM32F103VET6

  * @date 05/19/2019

  * @brief 通用端口初始化

*

  ******************************************************************************

  * @remarks

  *

  */ 

extern "C" { // 兼容C,按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段

#pragma diag_remark 368 //消除 warning:  #368-D: class "" defines no constructor to initialize the following:

 

#include "stm32f10x_tim.h"

 

#pragma diag_default 368 // 恢复368号警告

}

 

#include "IO.h"

 

/**

  * @date 05/19/2019

  * @brief  初始化端口.

  * @param GPIOx: where x can be (A..G) to select the GPIO peripheral.

  * @param nPin_x: specifies the port bits to be written.

  *   This parameter can be any combination of nPin_x where 

  *   x can be (0..15).

  * @param GPIO_Mode: 输入输出模式.

  * @param nLevel: 输出时初始电平0低,1高,其它无效,初始化端口之前设置,避免开机跳动.

  * @retval None

  */

IO::IO(GPIO_TypeDef* GPIOx, u16 nPin_x, GPIOMode_TypeDef GPIO_Mode, u16 nLevel)

: m_GPIOx( GPIOx )

, m_nPin( nPin_x )

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(nPin_x));

 

u32 RCC_APB2Periph_GPIOx = // 获取对应的RCC参数

GPIOx != GPIOA ? GPIOx != GPIOB ? GPIOx != GPIOC ? GPIOx != GPIOD ? GPIOx != GPIOE

? 0 : RCC_APB2Periph_GPIOE : RCC_APB2Periph_GPIOD : RCC_APB2Periph_GPIOC : RCC_APB2Periph_GPIOB : RCC_APB2Periph_GPIOA;

 

// 使能端口, 开启按键端口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);

// 先设置输出状态,避免开机时跳动。

if(nLevel == 0)

GPIO_ResetBits(GPIOx, nPin_x); // 设置低电平

else if(nLevel == 1)

GPIO_SetBits(GPIOx, nPin_x); // 设置高电平

// 输入状态不设置

// 配置端口,用最低的采样频率,过滤高频干扰,延长寿命,需要高频时在外部重设

  GPIO_InitStructure.GPIO_Pin = nPin_x;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode;       

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 用最低的采样频率

  GPIO_Init(GPIOx, &GPIO_InitStructure);  // 初始化端口

}

所有与C语言有关的代码用extern "C" { ... ... } 包括起来,告诉编译器是C语言,只能从C++中调用C语言,不能从C中调用C++。 


还有一个要改动的地方,stm32f10x.h 中240行,原语句是 typedef enum {FALSE = 0, TRUE = !FALSE} bool; 修改成:


// C++ 编译时出现错误:..CMSISstm32f10x.h(240): error:  #65: expected a ";"

// 增加C++兼容代码,如果是C++用BOOL,否则用原来的bool

#ifdef __cplusplus

typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;

#else

typedef enum {FALSE = 0, TRUE = !FALSE} bool;

#endif

需要说明的是,上面的封装不太完善,勉强能用,以后再修改。


关键字:STM32  C++  cpp 引用地址:STM32实战三 C++ IO.cpp

上一篇:STM32在C文件中使用C++文件时,编译错误Error
下一篇:STM32实战一 初识单片机

推荐阅读最新更新时间:2024-11-12 13:48

STM32 KEIL里的MAP文件分析
一、文件分析流程 1、第一部分:Section Cross References 主要是各个源文件生成的模块之间相互引用的关系。 stm32f10x.o(STACK) refers (Special) to stkheap2.o(.text) for __use_two_region_memory 比如上面这句话,stm32f10x.o是stm32f10x.s生成的目标文件模块,(STACK)是文件内定义的一个段,链接器把它视为一个Section,输入节。它引用了模块stkheap2.o输入节(.text)里面的一个全局符号__use_two_region_memory(可能是一个函数或变量)。这个(Special)不知道是什
[单片机]
<font color='red'>STM32</font> KEIL里的MAP文件分析
高通推动C-V2X发展,助力汽车行业驶入智能网联新时代
5G进入规模化扩展之年。5G领衔的“新基建”将驱动包括汽车产业在内的广泛行业的数字化转型升级,智慧交通项目也正在成为“新基建”主力军。5G、AI、云计算、物联网等新技术的交织演进将进一步推动汽车行业向电气化、智能化、网联化和共享化发展,加速迈向智慧交通新时代。 C-V2X持续演进,加速网联汽车发展 根据Strategy Analytics预测,到2024年,近75%的新车将嵌入蜂窝技术——汽车行业将成为最先被蜂窝技术变革的主要行业之一。C-V2X(蜂窝车联网)能够实现汽车与周围环境及云端智能的连接,助力提升交通效率,减少事故,提升出行体验,而5G技术以前所未有的可靠性、极低时延和高速率,有力支持C-V2X的持续演进和广泛用
[汽车电子]
高通推动<font color='red'>C</font>-V2X发展,助力汽车行业驶入智能网联新时代
通过STM32实现PWM呼吸灯的教程
一,知识理论基础 什么是呼吸灯: 顾名思义,就是一个灯。灯的亮度的变化,由亮变暗,从暗变亮,有一个渐变,规律的变化,像是人的呼吸,是灯的呼吸,所以叫呼吸灯。而要让灯可以达到这样的变化,我们要让stm32的IO口上输出一个可调的电平,这时我们就要用到PWM,那什么是PWM呢,我们继续往下看。 什么是定时器: 讲PWM我们要先认识stm32的定时器,PWM是定时器的功能之一。STM32F103有TIME1和TIME8高级定时器,TIME2TIME5通用定时器,还有TIME6和TIME7基本定时器。我们要使用的STM32F103C8T6只具有4个定时器,TIME1TIME4. 那么定时器有什么功能呢?定时、输出比较
[单片机]
通过<font color='red'>STM32</font>实现PWM呼吸灯的教程
s3c2440裸机-内存控制器(五、SDRAM编程实现)
配置内存控制器-SDRAM编程配置 2440内存控制器共有13个寄存器。 BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0~5)两个寄存器; BANK6、BANK7外接SDRAM时,除BWSCON和BANKCONx(x为6、7)外,还要设置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4个寄存器。 下面分别说明各个寄存起的设置: 1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER) 我们SDRAM的位宽为32,DW6 设置成10, 没有使用等待信号,所以WS6 =0。 bank7跟随bank6的配置, 因此BWSCON寄存器的值为:
[单片机]
s3<font color='red'>c</font>2440裸机-内存控制器(五、SDRAM编程实现)
意法半导体推出全球首款内置多I2C地址的4焊球WLCSP封装 EEPROM
中国,2016年1月22日 横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)的M24系列EEPROM存储器新增四款完全兼容工业标准4焊球WLCSP封装(Wafer Level Chip Scale Package,晶圆级芯片封装) 的产品,同时也是首个准许在同一条I2C总线上连接两颗以上4针EEPROM芯片,这是因为每款产品都有一个独立、内部固化连接的I2C地址。因此设计人员可以在同一条总线上连接多个专用设备,例如前后摄像头模块。 新产品可满足设备厂商客户多方采购的需求,提供与同类竞争产品相同的引脚间距、裸片方向、引脚布局,同时
[单片机]
4×4键盘C51单片机程序源码分享
/*MCU:AT89S52*/ #include #include #define uchar unsigned char int key; int del; void Key_Scan(void); /************主程序*************/ void main(void) { void Key_Scan(void); void delay(int); while(1) { Key_Scan(); delay(2000); } } /********矩键查寻键值4*4程序******/ void Key_Scan(void) { uchar readkey; uchar x_temp,y_temp; P
[单片机]
4×4键盘<font color='red'>C</font>51单片机程序源码分享
基于单片机的GPIB-RS232C接口转换设计及应用
1 引言   在电子测量与仪器领域内,GPIB和RS232C属于应用较广泛的标准接口总线。GPIB适于建立自动测试系统(ATS),RS232C常用于数据终端设备(DTE)和数据通信设备(DCE)之间的联接。目前,已研制了许多专用大规模集成电路芯片来帮助设计者实现GPIB和RS232C接口,且这些芯片都与微处理器的内部总线相容。标准接口总线解决了设备与设备之间,或者功能组件与功能组件之间的接口问题。借助适当的接口总线把若干设备或功能组件联接起来就可构成一个ATS。如果把基于一种标准接口系统的测试装置作为子系统,再把若干子系统联接起来构成大系统或测试和控制网络,则实际需解决的就是不同标准接口总线之间的转换问题。   2 接口转
[单片机]
基于单片机的GPIB-RS232<font color='red'>C</font>接口转换设计及应用
stm32GPIO的复用
STM32基本上每个引脚都有8种配置模式: 1)浮空输入 2)带弱上拉输入 3)带弱下拉输入 4)模拟输入 5)推挽输出 6)开漏输出 7)复用推挽输出 8)复用开漏输出 通常有5种方式使用某个引脚功能,它们的配置方式如下: 1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。 2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。 3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。 4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved