欢迎光临散文网 会员登陆 & 注册

树莓派入坑笔记(1.下)

2021-08-29 16:05 作者:会整活的剑人  | 我要投稿

这个视频的处理方法就是树莓派入坑笔记(1.中)用的Python代码

把它播放出来就靠下面的C语言代码



因为我不太会剪辑 VS2019远程调试的同时电脑上播放原版视频

(等以后学了剪辑再整些别的活)

(0到4放到前两个专栏里面了)

5:Linux Programming in C

驱动一个OLED屏其实没那么简单,无论是树莓派,STM32还是Arduino都需要几千行C语言代码.很幸运,有人之前写过树莓派的驱动,我必然没有必要再去手写.我们只需要把他的代码移植过来再加上自己的播放视频的逻辑(还有其他一些功能,比如说点亮个LED啥的)即可.

fig. 4 我们一会要做的事情

需要注意,在初学C语言的时候,总是嫖别人代码不是个好的习惯.有一些航C助教会搞代码查重,甚至出成了一个题目.在期末考试的时候一定有代码查重的,而且是老师做这个事情,各位一定好自为之.

1.创建项目

打开Visual Studio 2019 新建CMake项目.先修改配置,他默认是x64-Debug,因为我们是远程开发树莓派,需要删掉原来的配置(不然就变成Windows上的C程序了)

fig.5 修改配置

这个CMakeSettings.json是Visual Studio 生成的 不要弄丢了.

fig.6 修改配置文件CMakeSettings.json

点加号 新建两组配置文件(不带优化的Debug模式,一般调试时用;带优化的Release模型,一般处理大规模问题时用),修改工具集为linux_arm.

然后新建两个文件夹,thirdparty(放别人写好的代码)和user(放我们的代码).在两个文件夹里面再分别新建两个文件夹inc和src用于区别存放头文件(C/C++Header .h)和源文件(C Source .c / C++ Source .cpp).


fig.5 项目的结构

2.配置远程环境

树莓派上先打开SSH

Visual Studio里面 工具->选项->跨平台->连接管理器,如果没有SSH连接就创建一个,如果有了可以编辑或者设置默认值.主机名是树莓派的IP地址(用ifconfig查看),用户名root,密码是root创建时设的密码.点击验证.如果配置都对了应该出现fig.7的界面.

fig.6 连接管理器
fig7.配置好的远程环境

3.移植已知的驱动

有个显示器屏幕的手册网站

我们用的7针SPI OLED屏的一个资料库就在这里.第二个链接是资料压缩包下载链接

进入资料压缩包,选择第1个demo文件夹,选择demo_raspberrypi,选择bcm2835的4线spi,把里面的文件解压出来,

文件(.h)放到 项目目录/thirdparty/inc中

文件(.c)放到 项目目录/thirdparty/src中

但是注意,压缩包里面有一个测试用的main.c文件(含有main函数).一个程序只有一个main作为入口.我们把它扔了不用,自己写main函数.

在 项目目录/user/inc中新建文件,比如说cbj0.h

在 项目目录/user/src中新建文件,比如说cbj0.c(C语言的源文件扩展名一定是.c)

项目结构如图

fig.8目前的项目结构

这里的cbj0.h是公用头文件 放置标准库头文件和常用的宏函数 类型别名(typedef)等4

如果后面还有自己写硬件驱动的需要,

在 项目目录/user/inc添加头文件(.h) 放置函数的定义和相关的结构声明.

在 项目目录/user/src添加源文件(一般是C语言写的用.c 可能有C++写的,用.cpp)放置函数的实现(注意前面#include公用头文件)

文件名当然可以用cbj0这样的,但是为了好识别 建议用驱动的硬件名来命名

4.编辑CMakeLists.txt内容(划重点)

如果不知道CMakeLists.txt是啥,看下面专栏



这个CMakeList文件要实现管理和控制编译一整个目录的源文件

写法和扫盲那篇不太一样

cmake_minimum_required (VERSION 3.8)

project ("RPITestCMake")

set(CMAKE_C_COMPILER "/usr/bin/gcc")#设置C语言编译器

set(CMAKE_CXX_COMPILER "/usr/bin/g++")#设置C语言编译器

include_directories("user/inc" "thirdparty/inc")#设置头文件目录

aux_source_directory("user/src" USER_SRC)#设置用户源文件目录

aux_source_directory("thirdparty/src" OLED_SRC)#设置第三方源文件目录(OLED驱动)

add_executable (cbj0 ${USER_SRC} ${OLED_SRC})#编译所有的源文件

target_link_libraries(cbj0 "libbcm2835.a") #链接静态库 否则不过编译

target_link_libraries(cbj0 "libbcm2835.so")#链接动态库

5.写代码辣

编辑cbj0.h内容 

用条件编译语句#ifndef ... #define ...#endif 防止重复包含文件/宏定义 

编辑cbj0.c内容

init函数是全局的初始化,先初始化bcm2835库,然后初始化OLED

然后bcm2835_gpio_fsel函数用于初始化GPIO引脚(类似arduino的pinMode)为输出模式

main函数打开之前做好的二进制文件,每次读取一帧的图像数据(1KB)然后用他的在OLED显示屏上绘图的函数,过30ms(30000us)后画下一帧的图像,直到所有的图像都画完,然后三色LED闪一下,其中bcm2835_gpio_write函数用于设置引脚GPIO电平,1为高 0为低.return语句结束前关闭GPIO控制.

F5运行,Visual Studio把文件先copy到树莓派上然后编译运行,也可以像调试windows程序那样调试.

如果有花屏或显示不清楚,把spi频率稍微降低即可

fig.9 spi.c SPI初始化函数 分频数图中有标灰色

把spi分频数调小,设为8分频以下(但是不要太低了)

到此 树莓派4B的第一个坑基本上算踩完了 referenced内容在文中有标出

树莓派入坑笔记(1.下)的评论 (共 条)

分享到微博请遵守国家法律