树莓派入坑笔记(1.下)
这个视频的处理方法就是树莓派入坑笔记(1.中)用的Python代码
把它播放出来就靠下面的C语言代码

因为我不太会剪辑 VS2019远程调试的同时电脑上播放原版视频
(等以后学了剪辑再整些别的活)

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

需要注意,在初学C语言的时候,总是嫖别人代码不是个好的习惯.有一些航C助教会搞代码查重,甚至出成了一个题目.在期末考试的时候一定有代码查重的,而且是老师做这个事情,各位一定好自为之.
1.创建项目
打开Visual Studio 2019 新建CMake项目.先修改配置,他默认是x64-Debug,因为我们是远程开发树莓派,需要删掉原来的配置(不然就变成Windows上的C程序了)

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

点加号 新建两组配置文件(不带优化的Debug模式,一般调试时用;带优化的Release模型,一般处理大规模问题时用),修改工具集为linux_arm.
然后新建两个文件夹,thirdparty(放别人写好的代码)和user(放我们的代码).在两个文件夹里面再分别新建两个文件夹inc和src用于区别存放头文件(C/C++Header .h)和源文件(C Source .c / C++ Source .cpp).

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


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)
项目结构如图

这里的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频率稍微降低即可

把spi分频数调小,设为8分频以下(但是不要太低了)
到此 树莓派4B的第一个坑基本上算踩完了 referenced内容在文中有标出