树莓派上通过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相关教程)
发表评论