Seeed STM32MP157C EVK開發(fā)板試用報(bào)告概述安裝系統(tǒng)和必要的系統(tǒng)工具包 通過SD卡燒寫系統(tǒng) 升級(jí)系統(tǒng) 常規(guī)軟件安裝 PC機(jī)工具軟件通過GPIO控制小燈閃爍通過I2C同PCA9685通信控制舵機(jī)心得體會(huì)
概述 在第一期FunPack活動(dòng)中,我使用Seeed STM32MP157C板子,實(shí)現(xiàn)了兩個(gè)小程序:
通過GPIO控制小燈閃爍
通過I2C同PCA9685舵機(jī)控制板通信, 從而控制SG90舵機(jī)
同以往開發(fā)MCU的思路不同,這次的開發(fā)平臺(tái)是運(yùn)行了Linux系統(tǒng)的MPU平臺(tái),因此不適合使用MCU開發(fā)中基于芯片手冊(cè)和讀寫寄存器的編程思路。既然使用了Linux系統(tǒng),,那么自然要利用Linux平臺(tái)下軟件豐 富,通用性強(qiáng)的便利。在這次學(xué)習(xí)過程中,我在Linux平臺(tái)上,分別使用了Seeed公司開發(fā)的grove.py代碼包和Adafruit公司開發(fā)的adafruit_python_pca9685工具包,訪問底層的GPIO和I2C外設(shè)模塊。這些代碼包已經(jīng)對(duì)底層的操作,包括Linux操作系統(tǒng)層面上和芯片硬件層面上,都已經(jīng)進(jìn)行了充分的封裝,我在自己 的程序文件中,只要根據(jù)文檔說明調(diào)用API即可,同時(shí),python語言的運(yùn)行環(huán)境相對(duì)于基于C的嵌入式系統(tǒng)開發(fā)環(huán)境十分友好,我沒有在搭建工程框架上(需要研究啟動(dòng)代碼,鏈接命令文件,查閱芯片手冊(cè)中的寄存器等等)花費(fèi)任何時(shí)間,短短幾行代碼就能實(shí)現(xiàn)我想要的功能。 下面具體說明我實(shí)現(xiàn)這兩個(gè)小程序的操作步驟:
安裝系統(tǒng)和必要的系統(tǒng)工具包
這部分內(nèi)容主要參考Seeed官方的wiki:https://wiki.seeedstudio.com/ODYSSEY-STM32MP157C/ 通過SD卡燒寫系統(tǒng)具體操作過程可參見wiki說明,這里簡述一下其中的思路:首先通過電腦上的一個(gè)燒寫工具軟件,將Linux系統(tǒng)的鏡像文件燒寫到SD卡上。將SD卡插入開發(fā)板,首次啟動(dòng)一定要從SD卡啟動(dòng),然后運(yùn)行SD卡系統(tǒng)中的腳本,將SD卡中的系統(tǒng)復(fù)制到板載的eMMC存儲(chǔ)芯片上,這相當(dāng)于是想eMMC存儲(chǔ)芯片安裝系統(tǒng)。然后通過板子的撥碼開關(guān)切換到從eMMC啟動(dòng),之后拔出SD卡重新啟動(dòng),系統(tǒng)就從eMMC中啟動(dòng)并運(yùn)行了。SD 卡在這個(gè)過程中相當(dāng)于是一個(gè)"安裝光盤",板載的eMMC存儲(chǔ)芯片就是系統(tǒng)里的硬盤。安裝系統(tǒng)之后就不 需要SD卡了。
sudo sh -c "echo cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3-stm32mp1.sh >> /boot/uEnv.txt"sudo reboot 升級(jí)系統(tǒng)燒寫系統(tǒng)后,必須先要升級(jí)系統(tǒng),否則很多更新過的軟件無法正常安裝。
sudo apt update 常規(guī)軟件安裝linux系統(tǒng)頭文件
sudo apt install linux-headers-$(uname -r) -y build管理: make
sudo apt install make device-tree-compiler gcc -y 遠(yuǎn)程登錄: ssh
sudo apt install ssh -y 代碼倉庫下載: git
sudo apt install git -y 常規(guī)下載工具: wget
sudo apt install wget -y 編程和腳本語言python
sudo apt updatesudo apt install python3 python3-distutils python3-pyqt5 python3-pip python3-numpy -ysudopip3installpython-canpyqtgraph 設(shè)備管理器driver overlay下載并編譯stm32mp1的設(shè)備管理器:
git clone https://github.com/Seeed-Studio/seeed-linux-dtverlayscd seeed-linux-dtverlaysmake all_stm32mp1 CUSTOM_MOD_FILTER_OUT="jtsn-wm8960" && sudo make install_stm32mp1 CUSTOM_MOD_FILTER_OUT="jtsn-wm8960" ? 設(shè)定啟動(dòng)后自動(dòng)加載設(shè)備:
sudo sh -c "echo uboot_overlay_addr0=/lib/firmware/stm32mp1-seeed-ap6236-overlay.dtbo >> /boot/uEnv.txt"sudo sh -c "echo uboot_overlay_addr1=/lib/firmware/stm32mp1-seeed-spi5-overlay.dtbo >> /boot/uEnv.txt"sudo sh -c "echo uboot_overlay_addr2=/lib/firmware/stm32mp1-seeed-usart2-overlay.dtbo >> /boot/uEnv.txt"sudo sh -c "echo uboot_overlay_addr3=/lib/firmware/stm32mp1-seeed-i2c4-overlay.dtbo >> /boot/uEnv.txt"sudo reboot ? driver overlay相當(dāng)于是一個(gè)系統(tǒng)中注冊(cè)過的設(shè)備管理器,主要是在樹莓派的linux系統(tǒng)中使用。一些專門 的可以操縱底層硬件的python軟件庫,會(huì)通過注冊(cè)到driver overlay中的設(shè)備操作硬件。 PC機(jī)工具軟件我使用Windows系統(tǒng)作為PC機(jī)的主系統(tǒng)。畢竟Windows的各種桌面工具十分完善,日常用起來十分方便。 Tera Team在Windows下運(yùn)行的終端工具,在本例中,可以連UART串口,也可以連ssh。
WinSCPWinSCP是通過ssh向linux目標(biāo)系統(tǒng)傳送文件的工具。在實(shí)際開發(fā)過程中,我都是預(yù)先在Windows上使用我熟悉的各種代碼編輯器寫好代碼文件,然后通過WinSCP上傳至linux目標(biāo)系統(tǒng)。雖然我也會(huì)在必要的情況下使用linux命令行窗口中的vim和nano,但總歸是用windows在圖形用戶界面中編輯代碼更加高效。 實(shí)際上,也可以再WinSCP的登錄窗口中直接打開linux目標(biāo)系統(tǒng)中的文件,編輯后保存,WinSCP會(huì)自動(dòng)將最后保存的文件同步到遠(yuǎn)程的linux目標(biāo)系統(tǒng)中。
通過GPIO控制小燈閃爍 不同于以往寫MCU程序時(shí),需要通過查閱硬件手冊(cè)查找合適的寄存器,進(jìn)而控制硬件。在本例中,我既然使 用了Linux平臺(tái),就要充分發(fā)揮Linux平臺(tái)上工具豐富的特點(diǎn)。為了控制GPIO引腳上的輸出輸出電平信號(hào),我使用了grove的工具包。 由于在準(zhǔn)備系統(tǒng)平臺(tái)過程中,已經(jīng)編譯和安裝了seeed-linux-dtverlays,接下來可以直接安裝grove.py軟件包:
sudo pip3 install Seeed-grove.py 如果熟悉grove.py的話,此時(shí)已經(jīng)可以開始開發(fā)了。我是第一次使用這個(gè)工具包,下載了grove.py的源碼倉庫,然后從中找到一些樣例代碼。 這里不得不吐槽一下,grove.py的wiki網(wǎng)站框架是很不錯(cuò)的,但是里面的內(nèi)容還亟待完善,目前還需要用戶通過閱讀源碼才能了解到少量API的用法,并且大部分樣例僅僅支持grove專用的硬件模塊,沒有提供說明如何使用用戶diy的電路模塊。 我最終是參考"~/grove.py/grove"目錄下的"grove_gpio.py"和"grove_led.py"兩個(gè)源碼文件,整理出一份 最簡單操作GPIO代碼。
import timefrom grove.gpio import GPIO led = GPIO(0, GPIO.OUT) while True: led.write(1) time.sleep(1) led.write(0) time.sleep(1) ? 至于GPIO引腳編號(hào),相關(guān)的文檔沒有說明,我也沒有在代碼中深究。但是,考慮到這塊板子在設(shè)計(jì)之初是要兼容樹莓派的軟件生態(tài),我抱著試一試的心態(tài),找了張樹莓派的引腳圖,對(duì)應(yīng)連上我之前做實(shí)驗(yàn)用的 LED燈小電路,竟然能夠工作了。
特別要注意,grove.gpio中對(duì)GPIO引腳的編號(hào)使用的是上表中的"BCM編碼"。
通過I2C同PCA9685通信控制舵機(jī) grove.py中也有支持i2c通信的模塊, 例如可以通過如下代碼引入"Bus"類
from grove.i2c import Bus grove.py中也提供了大量的i2c設(shè)備的樣例代碼,但沒有支持PCA9685芯片的。我本意是打算參考樣例代碼寫一個(gè)PCA9685芯片的類。grove.py中i2c設(shè)備類實(shí)現(xiàn)的套路是:先使用變量的方式定義I2C設(shè)計(jì)的寄存 器,然后實(shí)現(xiàn)類內(nèi)的初始化,讀取,寫入等基本API,然后進(jìn)一步封裝功能。 首先用杜邦線將連線將Seeed STM32MP157C板子同PCA9685電路板連起來,并且將一個(gè)SG90舵機(jī)連到 PCA9685電路板上。
寫代碼之前,我還使用了i2cdetect工具掃描了一下i2c總線上的設(shè)備地址。 安裝i2cdetect工具:
sudo apt-get install i2c-tools 執(zhí)行掃描:
i2cdetect -y 1
i2c0總線上沒掃到設(shè)備,就在i2c1上試試,果然識(shí)別到了PCA9685芯片,其中"0x40"是芯片的讀寫訪問地 址,"0x70"是一個(gè)廣播地址,暫時(shí)不用管它。 我甚至已經(jīng)編寫好測試通信的代碼:
import timefrom grove.i2c import Bus class GroveI2cPca9685: def __init__(self, bus=None, address=0x40): self.address = address self.bus = Bus(bus) def read_mode1(self): return self._read_byte(0x00) def read_mode2(self): return self._read_byte(0x01) # i2c bus. def _read_byte(self, reg): return self.bus.read_byte_data(self.address, reg) def main(): pca9685 = GroveI2cPca9685() print(pca9685.read_mode1()) print(pca9685.read_mode2()) if __name__ == '__main__':main() 用邏輯分析儀抓了i2c通信總線上的波形,看起來一切工作正常。
但我無意中在github上找到一個(gè)專門在Linux上驅(qū)動(dòng)PCA9685芯片的項(xiàng)目"Adafruit_Python_PCA9685"。這是一個(gè)基于樹莓派Linux的項(xiàng)目,不過,這塊板子不就是兼容樹莓派的軟件么? 哈哈,省了我不少事情,直 接安裝并使用。 可以通過pip安裝"adafruit-pca9685"軟件包:
sudo pip install adafruit-pca9685 當(dāng)然, 也可以通過下載源碼安裝的方式安裝:
sudo apt-get install git build-essential python-devcd ~ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.gitcd Adafruit_Python_PCA9685sudo python setup.py install 然后基于 "Adafruit_Python_PCA9685/examples/simpletest.py"文件中的源碼編寫代碼控制我自己的舵機(jī):
from __future__ import divisionimport time # Import the PCA9685 module.import Adafruit_PCA9685 # Uncomment to enable debug output.#import logging#logging.basicConfig(level=logging.DEBUG) # Initialise the PCA9685 using the default address (0x40).pwm = Adafruit_PCA9685.PCA9685() # Alternatively specify a different address and/or bus:#pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2) # Configure min and max servo pulse lengthsservo_min = 150 # Min pulse length out of 4096servo_max = 620 # Max pulse length out of 4096 # Set frequency to 60hz, good for servos.pwm.set_pwm_freq(60) print('Moving servo on channel 15, press Ctrl-C to quit...')while True: # Move servo on channel 15 between extremes. pwm.set_pwm(15, 0, servo_min) time.sleep(1) pwm.set_pwm(15, 0, servo_max) time.sleep(1) 其中:
set_pwm_freq(60)函數(shù)設(shè)定了控制舵機(jī)的PWM方波信號(hào)頻率為60Hz;
set_pwm()函數(shù)的第一個(gè)參數(shù)是通道號(hào),我特別連了15號(hào)通道而不是0通道,就是擔(dān)心此處的"0"同眾 多的"0"混在一起。后面的兩個(gè)參數(shù)分別是設(shè)置在一個(gè)周期中拉高電平和拉低電平的時(shí)間點(diǎn),固定拉高電平的時(shí)間點(diǎn)為0,改變拉低電平的時(shí)間點(diǎn)就能控制舵機(jī)中電機(jī)的通電時(shí)間,從而控制舵機(jī)轉(zhuǎn)動(dòng)的角度。
運(yùn)行程序后, 確實(shí)可以看到我的小舵機(jī)在左右搖頭。Bingo! PS:我后來又看了一些使用PCA9685模塊配合多個(gè)舵機(jī)和一些3D打印的機(jī)械結(jié)構(gòu)設(shè)計(jì)制作的多足機(jī)器人的,我猜想控制算法多半已經(jīng)有開源的方案,尤其在Linux平臺(tái)上(樹莓派)移植這么方便,我果斷又下單買 了10個(gè)SG90舵機(jī),又找了找開源的4足機(jī)器人機(jī)械結(jié)構(gòu)的3D打印圖紙,打算也搞一個(gè)小機(jī)器人玩玩。欲知 后事如何,那應(yīng)該是另一篇文章里要介紹的內(nèi)容了。
心得體會(huì) Seeed STM32MP157C EVK板的軟件開發(fā)者致力于兼容已經(jīng)非常成熟的"樹莓派"生態(tài)環(huán)境,通過Linux系 統(tǒng)對(duì)底層的電路系統(tǒng)進(jìn)行了封裝,因此有很多為"樹莓派"開發(fā)的軟件包可以直接運(yùn)行在Seeed STM32MP157C EVK開發(fā)板上,這就為玩家提供了非常大的便利。 作為長期從事MCU開發(fā)的嵌入式系統(tǒng)工程師,這次"跨界"使用MPU,我從一個(gè)新的思路考慮開發(fā)手段。MCU開發(fā)的特點(diǎn)在于靈活性,可以為具體應(yīng)用專門量身設(shè)計(jì)軟硬件系統(tǒng)。而MPU開發(fā)過程對(duì)各個(gè)環(huán)節(jié)就 區(qū)分得更精細(xì):底層軟件開發(fā)者對(duì)底層電路系統(tǒng)和軟件系統(tǒng)進(jìn)行封裝,向應(yīng)用層開發(fā)者提供一個(gè)通用的開 發(fā)平臺(tái);應(yīng)用層開發(fā)者不需要考慮底層的實(shí)現(xiàn),基于跨平臺(tái)的通用API編寫應(yīng)用程序。在通用平臺(tái)(Linux)上 開發(fā)的軟件可以在不同電路板上無縫復(fù)用。 新的開發(fā)體驗(yàn)讓我驚喜不少,擺脫了對(duì)著寄存器手冊(cè)和原理圖的調(diào)試過程,直接專注于應(yīng)用業(yè)務(wù)邏輯的開發(fā),大幅縮短開發(fā)周期。python語言和有大量可用的工具軟件包也讓我可以不用每次實(shí)現(xiàn)功能組件時(shí)都 要重復(fù)"造輪子",或者小心地處理在別的芯片上移植過來的軟件中存在的各種不兼容的問題。總之就是一個(gè)字,"爽" ! END
更多精彩視頻分享請(qǐng)移步至硬禾學(xué)堂BBS論壇(也歡迎大家在本論壇里展開交流):https://bbs.eetree.cn/forum.php?mod=forumdisplay&fid=53
往期精彩
1. Funpack第一期開始Fund Back了,成功的同學(xué)都奔走相告,分享喜悅吧!
2. Funpack第一期精彩之二:Argon帶你用mqtt連OneNET,漂移菌帶你跑Linux和驅(qū)屏幕
責(zé)任編輯:xj
原文標(biāo)題:看頂尖芯片公司工程師寫總結(jié)報(bào)告(Funpack第一期精彩之三)
文章出處:【微信公眾號(hào):FPGA入門到精通】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
芯片
+關(guān)注
關(guān)注
459文章
52185瀏覽量
436217 -
工程師
+關(guān)注
關(guān)注
59文章
1589瀏覽量
69222 -
STM32
+關(guān)注
關(guān)注
2289文章
11014瀏覽量
362392
原文標(biāo)題:看頂尖芯片公司工程師寫總結(jié)報(bào)告(Funpack第一期精彩之三)
文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
老工程師分享的模電設(shè)計(jì)經(jīng)驗(yàn)

(仰天長嘯)為什么受傷的總是硬件工程師...#MDD#MDD辰達(dá)半導(dǎo)體 #電子工程師

硬件工程師手冊(cè)(全套)


推薦資料!硬件系統(tǒng)工程師寶典,工程師必備寶典

硬件工程師的終極幻想:焊板子焊上人生巔峰!#半導(dǎo)體器件 #硬件工程師 #MDD辰達(dá)半導(dǎo)體
CES2025趨勢動(dòng)向總結(jié)報(bào)告:二十八項(xiàng)主要趨勢特點(diǎn)


不同時(shí)期的硬件工程師,最怕發(fā)生的事 #電子工程師 #硬件工程師 #內(nèi)容過于真實(shí) #YXC晶振 #揚(yáng)興科技

當(dāng)硬件工程師穿越到霸總劇: 以他性格肯定忍不到第二集? #硬件工程師 #電路設(shè)計(jì) #晶振 #揚(yáng)興科技

當(dāng)你的工程師朋友失聯(lián)時(shí),別氣,ta真的是在忙工作 #搞笑 #電子愛好者 #硬件工程師 #晶振 #揚(yáng)興科技

硬件工程師VS軟件工程師|硬件工程師看到這都淚目了!#硬件設(shè)計(jì) #硬件工程師 #電子工程師 #軟件工程師


評(píng)論