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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Raspberry PI 系列 —— 裸机点亮LED灯

發(fā)布時間:2024/4/14 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Raspberry PI 系列 —— 裸机点亮LED灯 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Raspberry PI 系列 —— 裸機點亮LED燈

?

背景

近期剛買了Raspberry PI B+,配置執(zhí)行了官方提供的Raspbian系統(tǒng),折騰了一周Linux系統(tǒng),感覺沒啥意思,于是就試著想了解底層的啟動流程。通過幾天的研究,發(fā)現(xiàn)最底層部分的啟動是由官方提供的bootcore.bin和start.elf文件來執(zhí)行(應(yīng)該是對硬件設(shè)備的初始化。如MMU等),之后由下一部分kernel.img的_start接管。

為了真正驗證此流程,于是想利用GPIO控制LED燈,幾經(jīng)折騰最終成功點亮LED,現(xiàn)記錄于此。

?

外設(shè)地址編碼

要想控制GPIO管腳就必須知道GPIO管腳的地址,在ARM架構(gòu)中外設(shè)IO一般採用統(tǒng)一編碼。BCM2835將外設(shè)地址0x7E00000映射到RAM的0x20000000。如0x7E200000則為0x20200000。以下是總線地址、物理地址、虛擬地址關(guān)系圖:

?

GPIO擴展口

本次我們要通過板子上預(yù)留的GPIO管腳來控制LED燈,這里必須了解這些管腳的含義,B+版本號的GPIO口擴展到了40腳,下圖是B與B+的GPIO管腳差別:

?

GPIO寄存器

在BCM2835中,共同擁有54個GPIO管腳。當中GPIO寄存器有GPFSELn、GPSETn、GPCLRn等,以下詳細描寫敘述這些寄存器的作用:

?

·????????寄存器 GPFSEL0 ~ GPFSEL5 ---- 功能寄存器,指定管腳為輸入、輸出等, ?3位決定一個管腳:

o???000 = GPIO Pin 9 is aninput

o???001 = GPIO Pin 9 is anoutput

o???100 = GPIO Pin 9 takesalternate function 0

o???101 = GPIO Pin 9 takesalternate function 1

o???110 = GPIO Pin 9 takesalternate function 2

o???111 = GPIO Pin 9 takesalternate function 3

o???011 = GPIO Pin 9 takesalternate function 4

o???010 = GPIO Pin 9 takesalternate function 5

當中:(寄存器---地址---描寫敘述)

* GPFSEL0 --- 0x7E200000 --- 決定GPIO0-GPIO9管腳的功能

* GPFSEL1 --- 0x7E200004 --- 決定GPIO10-GPIO19管腳的功能

* GPFSEL2 --- 0x7E200008 --- 決定GPIO20-GPIO29管腳的功能

* GPFSEL3 --- 0x7E20000c --- 決定GPIO30-GPIO39管腳的功能

* GPFSEL4 --- 0x7E200010 --- 決定GPIO40-GPIO49管腳的功能

* GPFSEL5 --- 0x7E200014 --- 決定GPIO50-GPIO53管腳的功能

·????????寄存器 GPSET0 - CPSET1 ---- 設(shè)為1, 每一位決定一個管腳

o???0 = No effect

o???1 = Set GPIO pin n

當中:(寄存器---地址---描寫敘述)

* GPSET0 --- 0x7E20001C --- 決定GPIO0-GPIO31管腳

* GPSET1 --- 0x7E200020 --- 決定GPIO32-GPIO53管腳

·????????寄存器 GPCLR0 - GPCLR1 ---- 設(shè)為0, 每一位決定一個管腳

o???0 = No effect

o???1 = Clear GPIO pin n

當中:(寄存器---地址---描寫敘述)

* GPSET0 --- 0x7E200028 --- 決定GPIO0-GPIO31管腳

* GPSET1 --- 0x7E20002C --- 決定GPIO32-GPIO53管腳

樣例 --- 設(shè)置GPIO16為低電平

不多說了。該介紹的,前面已經(jīng)介紹過了。直接上代碼:

?

.section .init

.globl _start

_start:

?

ldr r0,=0x20200000

?

/* Set GPIO16 to output mode(001) */

mov r1,#1

lsl r1,#18

str r1,[r0,#4] /* GPFSEL1(決定GPOI10 - GPIO19) */

?

/* Clear GPIO16 */

mov r1,#1

lsl r1,#16

str r1,[r0,#40] /* GPCLR0(決定GPOI0 - GPIO31) */

?

/*

* Loop over this forevermore

*/

loop$:

b loop$

?

結(jié)果:

?

總結(jié)

經(jīng)過了多次的嘗試最終點亮了LED燈。盡管如今想起。可能非常easy,當這畢竟是零的突破,在這一小步中,掌握了非常多知識,如總線地址、物理地址的關(guān)系,怎樣看GPIO寄存器,ARM的匯編指令等等,有了這一步的成功我就能進行很多其它復(fù)雜的實驗。

?

總結(jié)

以上是生活随笔為你收集整理的Raspberry PI 系列 —— 裸机点亮LED灯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。