STM32学习(1) 将外设封装成Arduino风格的类库

最近突然想研究研究STM32,看到几乎所有的教程上都是用C编单片机程序的,让一直研究C艹的我编写起来很不适应,今天研究了一中午,成功地将一个 单个LED的驱动封装成了一个Arduino风格的类库,使用起来非常方便,方法如下。

在开始之前,建议按照STM32模板建立方法此文中描述的方法将工程需要的基本库放到一个文件夹中,这样在添加.c和.h文件的时候会更加容易。

1. 为了将驱动封装到一个类中,首先定义驱动代码的头文件 led.h。

#ifndef LED_H
#define LED_H

#include "stm32f10x_gpio.h"

class Led
{
    enum State{HIGH, LOW};
public:
    Led(GPIO_TypeDef* GPIOX, uint16_t GPIO_Pin_x, State s = HIGH);
    virtual ~Led();

    void Open();
    void Close();

    inline bool IsOpen() const {return isOpen;}

private:
    GPIO_TypeDef* GPIOX;
    uint16_t GPIO_Pin_x;

    bool isOpen;
};

#endif

类名起做Led,构造函数的三个参数依次是该小灯泡所在的IO口线,小灯泡的IO口号和IO口的初始状态(小灯泡一端已经接高电平,IO口默认为高)。添加公有的点亮LED和关闭LED的方法声明,以及一个内联函数返回当前小灯泡的状态。

2. 接下来定义这个类的实现,新建一个.cpp文件,注意不能是.c否则无法通过编译。

#include "led.h"

Led::Led(GPIO_TypeDef* GPIOX, uint16_t GPIO_Pin_x, State s)
{
    isOpen =false;
    this->GPIOX = GPIOX;
    this->GPIO_Pin_x = GPIO_Pin_x;

    // 设置端口时钟
    if (GPIOX == GPIOA)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    }
    else if (GPIOX == GPIOB)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    }
    else if (GPIOX == GPIOC)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }
    else if (GPIOX == GPIOD)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    }
    else if (GPIOX == GPIOE)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    }
    else if (GPIOX == GPIOF)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
    }
    else if (GPIOX == GPIOG)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
    }

    GPIO_InitTypeDef init;

    // 配置IO口
    init.GPIO_Pin = GPIO_Pin_x;
    init.GPIO_Mode = GPIO_Mode_Out_PP;
    init.GPIO_Speed = GPIO_Speed_50MHz;
    // 初始化IO口
    GPIO_Init(GPIOX, &init);

    if (s == HIGH)
    {
        GPIO_SetBits(GPIOX, GPIO_Pin_x);
    }
    else
    {
        GPIO_ResetBits(GPIOX, GPIO_Pin_x);
    }
}

Led::~Led()
{

}

void Led::Open()
{
    GPIO_ResetBits(GPIOX, GPIO_Pin_x);
    isOpen = true;
}

void Led::Close()
{
    GPIO_SetBits(GPIOX, GPIO_Pin_x);
    isOpen = false;
}

首先根据函数参数设定对应的端口时钟,然后常规地配置IO口即可。最后将ResetBits()和SetBits()函数分别写在打开和关闭函数中。这样就实现了驱动的简单封装。

#include "stm32f10x.h"

#include "led.h"
#include "delay.h"

int main()
{
    Delayer mydelay;

    Led myLed(GPIOA, GPIO_Pin_2);

    while (1)
    {
        myLed.Open();
        myDelay.Delay(500);
        myLed.Close();
        myDelay.Delay(500);
    }

    return 0;
}

使用时,直接把类实例化,调用合适的公共方法即可。

如果想实现控制多个GPIO口,可以实例化多个对象,或者重载类的构造函数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 00:24:02

STM32学习(1) 将外设封装成Arduino风格的类库的相关文章

Directx11学习笔记【二】 将HelloWin封装成类

我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 MyWindow.h文件 1 /************************************************************************ 2 Directx11学习笔记[2] 将HelloWin封装成类 3 2016.01 by zhangbaochong 4 /

STM32学习笔记(一)——点亮一个LED

引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到时候肯定不够用了,正好前几天买了一块STM32F103ZET6的最小系统,那就赶紧学习吧!从哪里学习呢?同样是从点亮一个小灯开始,就建个工程模板就让我没有耐心了,折腾了一上午终于把工程建立好了, 关于STM32 简介 STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Co

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

STM32学习笔记3(TIM输入捕获)

PWM 输入捕获模式< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 一.概念理解 PWM输入捕获模式时输入捕获模式的特例 1.每个定时器有四个输入通道IC1.IC2.IC3.IC4,且IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系 2.两个TI输出映射了两个ICx信号 3.这两个ICx信号分别在相反的极性边沿有效 4.两个边沿

如何将路由器封装成帧中继

在学习OSPF的时候会使用到帧中继,那如何将路由器当帧中继网络来使用呢?下面帖上一篇配置和介绍给大家看看.模拟环境拓扑如下图: FR: Building configuration... Current configuration : 1632 bytes ! version 12.4 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

STM32学习笔记之一(初窥STM32)

怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个什么东西(如:寄存器---寄存东西(数据)的地方嘛) 学习知识--有了自我感知后,就需要验证自己的感知是否正确,请记住,带着自己思想的学习是最高效的学习(如:寄存器---存什么东西呢?) 归纳总结--学习了大量知识后,就该汇总汇总了(如:寄存器---存数据(通用寄存器),存命令(PC),存地址(LR)) 自我

js封装成插件

由于项目原因,工作一年多还没用js写过插件,项目太成熟,平时基本都是在使用已经封装好的功能插件.感觉自己好low......这两天想自己抽空写一个canvas画统计图与折现图的插件,所以就去网上学习了下如何封装.....虽然之前看了很多源码,但是感觉就算了解也是野路子..... 什么是封装呢? 我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己包饺子是一样的,但是

将h.264视频流封装成flv格式文件

一.flv 格式 本文转自:http://blog.csdn.net/yeyumin89/article/details/7932368 对其文章的格式稍做调整,并修改了部分 type error. flv 文件的格式其实网上资料还是不少,但是怎么封装成 flv 却不多.看了不少资料,找到了一个觉得还比较靠谱的: http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html 其实 flv 还是挺简单的一个视频格式,下面就来先谈一谈 FLV