瑞士军刀扩展板的跑马灯实现(C++版)

树莓派上通过C和Python来控制GPIO已经成为了很流行的方式,本文介绍如何使用C++/Boost/OOP和用户空间驱动树莓派瑞士军刀扩展板的LED,实现跑马灯效果。相关原理和方法通用,当然也可以用于瑞士军刀扩展板之外的情况。

1、运行环境

系统信息:Linux raspberrypi 4.4.21-v7 #1 SMP Sat Sep 24 20:40:17 CST 2016 armv7l GNU/Linux

硬件搭配:Raspberry Pi 3B + 瑞士军刀扩展板,如图所示。

2、运行指令

可执行文件为程序包目录下的ledRun,使用sudo ./ledRun –help查看帮助信息。必须以sudo运行,因为本设计中使用用户空间驱动控制LED,需要访问需要root权限的系统设备。

运行实例:

sudo ./ledRun -d l-r -s 50 -l 100

参数解释:-d l-r指示LED运行方向为从左到右,-s 50指示每50ms LED动一下,-l 100指示LED总共跑100步。其他参数值请参考help message。

程序介绍

本章简要介绍程序整体设计,详细设计请查阅源代码。

1、main流程

main函数流程如图所示。

2、C++类LedPort

将瑞士军刀扩展板上的8个LED看做一个整体,使用类LedPort来抽象这8个LED。该类主要接口介绍如下:

1) 构造:初始化用户空间IO驱动程序,根据参数初始化LED状态。

2) void setStatus(unsigned char status_):设置LED状态,参数取值范围为0x00~0xFF,8个数据位和8个LED相对应,0代表灭,1代表亮。

3) unsigned char getStatus():获取LED状态,返回值为类型unsigned char,8个数据位和8个LED的状态相对应。

该类的私有方法中实现了对逻辑驱动芯片hc595的控制和对用户空间IO驱动的调用,类的用户无需关心,如需进一步了解,请查阅源码。

3、用户空间驱动

使用系统设备/dev/mem和mmap函数来实现对GPIO寄存器的控制,主要驱动接口函数如下:

1) void map_io_addr() 将物理空间地址映射为用户空间地址。

2) void unmap_io_addr() 解除地址映射。

3) int bcm2835_gpio_fsel(uint8_t pin, uint8_t mode) 设置BCM编号为pin的gpio的功能模式为mode。

4) int bcm2835_gpio_set(uint8_t pin) 设置BCM编号为pin的gpio的值为1。

5) int bcm2835_gpio_clr(uint8_t pin) 设置BCM编号为pin的gpio的值为0。

源码及Make

1、源码目录

ROOT ├── LedPort.cc //类LedPort ├── LedPort.h //类LedPort头文件 ├── ledRun //生成的可执行文件 ├── LedRun.cc //主程序 ├── low_lib //用户空间驱动程序目录 │ ├── BCM2835.h //树莓派CPU头文件 │ ├── io_ctrl.c //用户空间GPIO驱动 │ ├── io_ctrl.h //驱动头文件 │ ├── low_lib.mk //子目录Make文件 │ └── types.h //底层类型定义 └── Makefile //根目录Makefile文件

2、Make

1) 先定义Makefile中的BOOST库相关路径:

BOOST_INCLUDE=BOOST库头文件目录

BOOST_LIB=BOOST库.a文件目录

BOOST_LIBNAME=库名

示例:

BOOST_INCLUDE=/home/username/libs/boost1620_arm/include/

BOOST_LIB=/home/ username/libs/boost1620_arm/lib/

BOOST_LIBNAME=boost_program_options-gcc48-1_62

注意:boost_program_options-gcc48-1_62对应的.a文件为

lib boost_program_options-gcc48-1_62.a

2) 定义Makefile中的编译器,将编译器路径添加到PATH,这里使用的交叉编译工具为gcc-linaro-arm-linux-gnueabihf-raspbian-x64。编译器定义如下:

CC=arm-linux-gnueabihf-gcc # set default c compiler

CXX=arm-linux-gnueabihf-g++ # set default c++ compiler

3) 在Makefile所在的目录输入make ,完成后将会生成.o文件和可执行文件ledRun。

本例程源码(saks_led_boost_src.zip)、编译好的用于树莓派的C++/boost库(boost1620_arm.tar.gz)、C++/boost库源码(boost_1_62_0.tar.gz)下载地址:

https://pan.baidu.com/s/1n8oFL#list/path=%2Fraspberrypi%2Fboost&parentPath=%2F

(本文原稿来自SAKS用户,更多SAKS相关教程)