日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO

發布時間:2024/7/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:爪爪熊
鏈接:https://www.jianshu.com/p/0495c0554a63
來源:簡書

之前將go語言的運行環境給搭建起來了,但是沒有開始真正的試試Go 語言操作樹莓派硬件的效果。

一、樹莓派3B硬件介紹

樹莓派3B采用了博通的BCM2837方案,而樹莓派2采用的是博通的BCM2836方案,這兩個方案 樹莓派2采用32bit的 ARMv7指令集的 ARM Cortex-A7 內核,樹莓派3B采用了 64bit的 ARMV8指令集的 AR Cortex-A53內核,看起來BCM2837似乎略勝一籌,畢竟升級到了64位處理器。一下是樹莓派3B的樣圖:

樹莓派3B.png

網上查閱了一圈資料,發現BCM2837的資料都沒放出來,在官網上找到了一則說明:

This is the Broadcom chip used in the Raspberry Pi 3, and in later models of the Raspberry Pi 2. The underlying architecture of the BCM2837 is identical to the BCM2836. The only significant difference is the replacement of the ARMv7 quad core cluster with a quad-core ARM Cortex A53 (ARMv8) cluster.

The ARM cores run at 1.2GHz, making the device about 50% faster than the Raspberry Pi 2. The VideocoreIV runs at 400Mhz.

Also see the Raspberry Pi 2's chip BCM2836 and the Raspberry Pi 1's chip BCM2835

看樣子官網說外設沒差別,就核心換了一下,那大致可以認為外設包括I2C、GPIO、SPI、timer這些基本的東西都沒有怎么變化才對。不過為了保險起見,還是查閱了相關文檔。以下是樹莓派3B GPIO引腳圖。

樹莓派3B 接口.png

對比一下樹莓派2的相關引腳圖:

樹莓派2 接口.png

仔細查閱了下,這上面常用的GPIO,SPI,I2C,UART都提供了。這還算好,發現常用的PWM不見了,這可有點麻煩了,后面再繼續研究PWM。

二、點亮LED燈

我們嘗試下所有開發板的第一個例程,點亮LED燈。這里找尋了一會暫時覺得可以使用下 nathan-osman 大神的 go-rpigpio 庫。

1

安裝好了敲入以下代碼:

1

保存并編譯:

1

這時候我們在 GPIO2 和 GND 之間串上一個 LED 燈 和一個 1K的電阻,發現 LED燈已經開始以飛快的頻率閃爍了。

前一小節通過了調用github上某位同道中人寫好的庫,實現了對GPIO的操作,這里從原理上分析如何操作 樹莓派3B 的寄存器,也是從最簡單的例子開始,點亮第二個LED燈。

所以我們現在的任務:通過操作寄存器的方式點亮第二個LED燈(板子上的第10腳,對應BCM.GPIO15,也是之前圖中的RXD)

BCM.GPIO15.png

三、分析下樹莓派硬件寄存器

BCM2835數據手冊

這里因為之前查閱了官網的說明,BCM2837 和 BCM2835 在外設這一塊是沒有變化的,所以我們可以直接參考 BCM2835 的數據手冊。我們直接翻閱到 89 頁左右,這里就是我們的目標了,GPIO 主要在第六章,這里找到下面這個表格:(圖片部分截取)

寄存器地址.png

可以看到在芯片地址中 GPIO 主要分布在 0x7E200000 這個地址往后走的一部分,最大的地址是 0x7E200B0。我們接著查閱芯片手冊中關于每個寄存器作用。最后確認下來,如果我們要點亮那個LED燈,需要將 BCM.GPIO15設置為輸出,且輸出一個高電平就可以了。通過找尋寄存器對應的區域,判斷到需要將下面圖2中15位設置為1(BCM.GPIO15設置為輸出模式)。

GPIOAFSR1.png

進一步設置中需要對輸出寄存器相關位進行賦值,可以將 BCM.GPIO15 設置為高,也就是下圖3中寄存器相關位。

GPSET0.png

當時設置了輸出位為高電平可以點亮LED燈,同時也需要輸出位為低電平以關閉LED燈,也就是下面圖4這個寄存器。

GPCLR0.png

了解清楚我們要操作的寄存器后,我們需要進一步確定這個地址到底是多少,通過手冊第5頁 圖5 我們可以看出實際上ARM的MMU把上面的 0x7E200000 這種實際地址映射到了0x200000000x40000000 這個地址上去,但是具體地址是多少也不是很清楚,這里就去找到了文檔 bcm2835 的c語言程序找尋蛛絲馬跡。后來發現了可以通過讀取 /proc/device-tree/soc/ranges 找到具體的外設地址和范圍,按照實際的偏移進行映射就可以使用了。

地址映射圖.png

四、實戰

經過了上面一圈的查資料、分析,發現思路越來越明朗了,這里就開始這幾實戰了。Go 語言對于指針操作會比C語言要求更為嚴格一點,也沒有宏定義可以使用,這里就直接定義到const中。

1

本文源碼地址參見?github


版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除并表示歉意。謝謝。

Golang語言社區

ID:Golangweb

www.bytedancing.com

游戲服務器架構丨分布式技術丨大數據丨游戲算法學習

總結

以上是生活随笔為你收集整理的arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。