历史上的今天
返回首页

历史上的今天

今天是:2025年08月01日(星期五)

正在发生

2019年08月01日 | STM32实战三 C++ IO.cpp

2019-08-01 来源:eefocus

这一章开始编写代码,主要是两个方面,一是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

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


推荐阅读

史海拾趣

AIRPAX公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

Cal-Chip Electronics公司的发展小趣事

在快速发展的过程中,Cal-Chip Electronics公司始终关注社会责任和可持续发展。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保生产,通过引进先进的环保技术和设备,减少生产过程中的污染排放。此外,公司还建立了完善的员工培训体系,为员工提供广阔的职业发展空间。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上是关于Cal-Chip Electronics公司在电子行业发展的5个相关故事,这些故事展示了公司在不同历史阶段所取得的成就和面临的挑战。通过不断努力和创新,Cal-Chip Electronics公司已经成为了电子行业的一颗璀璨明星。

BVLED公司的发展小趣事

随着市场的不断变化和竞争的加剧,BVLED公司意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并与多家高校和研究机构建立了合作关系。通过不断的实验和改进,公司成功推出了一系列具有创新性的LED产品,如智能调光LED灯、高显色指数LED灯等,这些产品在市场上获得了广泛的认可。

ECLIPSE公司的发展小趣事

随着云计算、大数据和人工智能等技术的不断发展,Eclipse也面临着新的挑战和机遇。Eclipse团队正在积极研究新技术,探索新的应用场景。未来,Eclipse将继续保持开放和创新的精神,为开发者们提供更加优秀、高效的开发工具和服务。同时,Eclipse也将继续加强与其他开源项目和公司的合作,共同推动开源生态的发展。

Catalyst / ON Semiconductor公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Catalyst / ON Semiconductor公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构和研发中心,以便更好地服务当地客户并吸引优秀人才。同时,公司还积极与其他知名企业进行战略合作,共同推动半导体技术的创新和应用。

Anaren Ceramics公司的发展小趣事

Anaren Ceramics公司深知技术创新是企业发展的核心动力,因此一直致力于打造一支强大的研发团队。公司投入大量资金用于研发人才的引进和培养,同时积极与高校和科研机构建立合作关系,共同开展技术研发项目。这些举措使得公司的研发团队不断壮大,为公司的发展提供了源源不断的创新动力。

问答坊 | AI 解惑

模电应知应会20问

1、半导体材料制作电子器件与传统的真空电子器件相比有什么特点?答:频率特性好、体积小、功耗小,便于电路的集成化产品的袖珍化,此外在坚固抗震可靠等方面也特别突出;但是在失真度和稳定性等方面不及真空器件。 2、什么是本征半导体和杂质半导 ...…

查看全部问答>

红外半球摄像机让人欢喜让人忧

现在大陆市场中,由于监控发展较晚!红外半球摄像机红外灯被大陆的经销商和工程商吵的是如何如何的好,像什么白天一样!晚上没有任何光源,都能很清晰的分晰这个人是谁,这些话虽然让产品卖出去了,可是搞伤了我们技术人员和工程人员,验收那个难啊 ...…

查看全部问答>

基于AD9854的信号发生器的设计

基于AD9854的信号发生器的设计…

查看全部问答>

友善之臂X86-QTOPIA编译问题

编译源码时出现了附件中的错误,由以上可知,是缺少luuid,经查找是缺少e2fsprogs-1.39.tar.gz这个包,已经下载了这个文件,接下来该怎么做??? [ 本帖最后由 jxb01033016 于 2009-9-4 11:47 编辑 ]…

查看全部问答>

求梅兰日兰UPS中文使用说明书操作手册

求梅兰日兰UPS中文使用说明书 请问哪位师傅手里有梅兰日兰UPS中文使用说明书啊,帮忙给传一下,或者给个网址也行啊,UPS是4.2KW、6KVA,我先谢谢啦!…

查看全部问答>

有人改写过nboot吗?

nand flash里bootloader的结构如下: 0:nboot 1:tocblock1 file 2:eboot 有人这样安装吗? 有人改写过nboot吗? 我的板子是2410的,我从网上找到了2410 BSP里面关于nboot的代码 读了下nboot里面的代码,硬件主要是初始化串口,感觉这些是通用的, ...…

查看全部问答>

2440开发版不支持大容量SD卡 请教怎么修改

看了GOOOGLEMAN的文章 http://www.cnblogs.com/wogoyixikexie/archive/2009/05/06/1450503.html 在platform->setting->environment 中设置IMGSDBUS2 = 1 在common.bib中也修改过 根本内容我也修改了BSP.C:\\WINCE500\\PLATFORM\\smdk2440\\DRIV ...…

查看全部问答>

谁能救命--关于Mplayer中Demuxer处理流程

哪为江湖大虾有研究过播放器Mplayer的原代码啊,特别是它Demux是如何处理的,最好能讲讲Mplayer的主处理函数,和详细的Demux过程?小弟不胜感激!…

查看全部问答>

请教关于伺服电机精度的问题

小弟请问大家有关于伺服电机的问题.有一位做真空镀膜的客户问到我伺服电机的转矩精度和线性度的参数.请问各位高手转矩精度和线性度是什么意义?…

查看全部问答>

各种存储器的说明

看的电路越多就发现各种样的存储器,哪位说不同存储器类型的说明,像什么SRAM,闪存,ROM等等的学习资料 我邮箱ZJJONE1023@163.COM 在此谢谢过…

查看全部问答>