樹莓派入坑筆記(1.下)
這個(gè)視頻的處理方法就是樹莓派入坑筆記(1.中)用的Python代碼
把它播放出來就靠下面的C語言代碼

因?yàn)槲也惶珪?huì)剪輯 VS2019遠(yuǎn)程調(diào)試的同時(shí)電腦上播放原版視頻
(等以后學(xué)了剪輯再整些別的活)

(0到4放到前兩個(gè)專欄里面了)
5:Linux Programming in C
驅(qū)動(dòng)一個(gè)OLED屏其實(shí)沒那么簡(jiǎn)單,無論是樹莓派,STM32還是Arduino都需要幾千行C語言代碼.很幸運(yùn),有人之前寫過樹莓派的驅(qū)動(dòng),我必然沒有必要再去手寫.我們只需要把他的代碼移植過來再加上自己的播放視頻的邏輯(還有其他一些功能,比如說點(diǎn)亮個(gè)LED啥的)即可.

需要注意,在初學(xué)C語言的時(shí)候,總是嫖別人代碼不是個(gè)好的習(xí)慣.有一些航C助教會(huì)搞代碼查重,甚至出成了一個(gè)題目.在期末考試的時(shí)候一定有代碼查重的,而且是老師做這個(gè)事情,各位一定好自為之.
1.創(chuàng)建項(xiàng)目
打開Visual Studio 2019 新建CMake項(xiàng)目.先修改配置,他默認(rèn)是x64-Debug,因?yàn)槲覀兪沁h(yuǎn)程開發(fā)樹莓派,需要刪掉原來的配置(不然就變成Windows上的C程序了)

這個(gè)CMakeSettings.json是Visual Studio 生成的 不要弄丟了.

點(diǎn)加號(hào) 新建兩組配置文件(不帶優(yōu)化的Debug模式,一般調(diào)試時(shí)用;帶優(yōu)化的Release模型,一般處理大規(guī)模問題時(shí)用),修改工具集為linux_arm.
然后新建兩個(gè)文件夾,thirdparty(放別人寫好的代碼)和user(放我們的代碼).在兩個(gè)文件夾里面再分別新建兩個(gè)文件夾inc和src用于區(qū)別存放頭文件(C/C++Header .h)和源文件(C Source .c / C++ Source .cpp).

2.配置遠(yuǎn)程環(huán)境
樹莓派上先打開SSH
Visual Studio里面 工具->選項(xiàng)->跨平臺(tái)->連接管理器,如果沒有SSH連接就創(chuàng)建一個(gè),如果有了可以編輯或者設(shè)置默認(rèn)值.主機(jī)名是樹莓派的IP地址(用ifconfig查看),用戶名root,密碼是root創(chuàng)建時(shí)設(shè)的密碼.點(diǎn)擊驗(yàn)證.如果配置都對(duì)了應(yīng)該出現(xiàn)fig.7的界面.


3.移植已知的驅(qū)動(dòng)
有個(gè)顯示器屏幕的手冊(cè)網(wǎng)站
我們用的7針SPI OLED屏的一個(gè)資料庫就在這里.第二個(gè)鏈接是資料壓縮包下載鏈接
進(jìn)入資料壓縮包,選擇第1個(gè)demo文件夾,選擇demo_raspberrypi,選擇bcm2835的4線spi,把里面的文件解壓出來,
頭文件(.h)放到 項(xiàng)目目錄/thirdparty/inc中
源文件(.c)放到 項(xiàng)目目錄/thirdparty/src中
但是注意,壓縮包里面有一個(gè)測(cè)試用的main.c文件(含有main函數(shù)).一個(gè)程序只有一個(gè)main作為入口.我們把它扔了不用,自己寫main函數(shù).
在 項(xiàng)目目錄/user/inc中新建頭文件,比如說cbj0.h
在?項(xiàng)目目錄/user/src中新建源文件,比如說cbj0.c(C語言的源文件擴(kuò)展名一定是.c)
項(xiàng)目結(jié)構(gòu)如圖

這里的cbj0.h是公用頭文件?放置標(biāo)準(zhǔn)庫頭文件和常用的宏函數(shù) 類型別名(typedef)等4
如果后面還有自己寫硬件驅(qū)動(dòng)的需要,
在?項(xiàng)目目錄/user/inc添加頭文件(.h) 放置函數(shù)的定義和相關(guān)的結(jié)構(gòu)聲明.
在?項(xiàng)目目錄/user/src添加源文件(一般是C語言寫的用.c 可能有C++寫的,用.cpp)放置函數(shù)的實(shí)現(xiàn)(注意前面#include好公用頭文件)
文件名當(dāng)然可以用cbj0這樣的,但是為了好識(shí)別 建議用驅(qū)動(dòng)的硬件名來命名
4.編輯CMakeLists.txt內(nèi)容(劃重點(diǎn))
如果不知道CMakeLists.txt是啥,看下面專欄

這個(gè)CMakeList文件要實(shí)現(xiàn)管理和控制編譯一整個(gè)目錄的源文件
寫法和掃盲那篇不太一樣
cmake_minimum_required (VERSION 3.8)
project ("RPITestCMake")
set(CMAKE_C_COMPILER "/usr/bin/gcc")#設(shè)置C語言編譯器
set(CMAKE_CXX_COMPILER "/usr/bin/g++")#設(shè)置C語言編譯器
include_directories("user/inc" "thirdparty/inc")#設(shè)置頭文件目錄
aux_source_directory("user/src" USER_SRC)#設(shè)置用戶源文件目錄
aux_source_directory("thirdparty/src" OLED_SRC)#設(shè)置第三方源文件目錄(OLED驅(qū)動(dòng))
add_executable (cbj0 ${USER_SRC} ${OLED_SRC})#編譯所有的源文件
target_link_libraries(cbj0 "libbcm2835.a") #鏈接靜態(tài)庫 否則不過編譯
target_link_libraries(cbj0 "libbcm2835.so")#鏈接動(dòng)態(tài)庫
5.寫代碼辣
編輯cbj0.h內(nèi)容?
用條件編譯語句#ifndef ... #define ...#endif?防止重復(fù)包含文件/宏定義?
編輯cbj0.c內(nèi)容
init函數(shù)是全局的初始化,先初始化bcm2835庫,然后初始化OLED
然后bcm2835_gpio_fsel函數(shù)用于初始化GPIO引腳(類似arduino的pinMode)為輸出模式
main函數(shù)打開之前做好的二進(jìn)制文件,每次讀取一幀的圖像數(shù)據(jù)(1KB)然后用他的在OLED顯示屏上繪圖的函數(shù),過30ms(30000us)后畫下一幀的圖像,直到所有的圖像都畫完,然后三色LED閃一下,其中bcm2835_gpio_write函數(shù)用于設(shè)置引腳GPIO電平,1為高 0為低.return語句結(jié)束前關(guān)閉GPIO控制.
F5運(yùn)行,Visual Studio把文件先copy到樹莓派上然后編譯運(yùn)行,也可以像調(diào)試windows程序那樣調(diào)試.
如果有花屏或顯示不清楚,把spi頻率稍微降低即可

把spi分頻數(shù)調(diào)小,設(shè)為8分頻以下(但是不要太低了)
到此 樹莓派4B的第一個(gè)坑基本上算踩完了?referenced內(nèi)容在文中有標(biāo)出