瑞士军刀扩展板的跑马灯实现(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 + 瑞士军刀扩展板,如图所示。
20161220201908269-0

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

运行实例:

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

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

程序介绍

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

1、main流程
main函数流程如图所示。

20161220202212320

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。
20161220202550899

本例程源码(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相关教程

这是一篇发布于 8年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


坐沙发

发表评论

你的邮件地址不会公开


*