當我們想操控一個硬體的時候,我們有必要先去瞭解這個硬體的一些物理特性,比如如何點亮LED,那麼我們首先就得瞭解LED的一些特性,如下: LED本身有兩個接線點,一個是LED的負極,一個是LED的正極。LED這個硬體本身存在的作用就是亮或者不亮,而我們想要LED亮或者不亮,那就可以通過對LED的正負極 ...
如何一步步點亮LED
註:實驗是基於s5pv210的板子,這篇筆記參考自《朱老師物聯網大講堂》朱老師隨堂筆記
文中提到的手冊下載鏈接:(https://yunpan.cn/OcSz7Yh35ISJK7 訪問密碼 6665;https://yunpan.cn/OcSz7SzsfS7a6p 訪問密碼 180f)
想要點亮LED,首先就得知道LED為什麼會被點亮。那麼就先來瞭解一下LED的一些物理特性:LED本身有2個接線點,一個是LED的正極,一個是LED的負極。LED這個硬體的功能就是點亮或者不亮,物理上想要點亮一顆LED只需要給他的正負極上加正電壓即可,要熄滅一顆LED只需要去掉電壓即可。
那麼現在開始一步步去達到點亮LED的目的。
想要點亮板子上的LED等,那麼就需要去查閱硬體手冊(X210BV3),找到LED所對應的原理圖如下:
通過查找到的內容我們可以得到的信息如下:
D26是電源指示燈,因為一端接5V電壓,一端接地,只要一上電,這顆LED就會亮;
其餘四顆LED的正極是確定的,所以如果我們想要這四顆LED亮,我們能做的就只能在負極上做文章,讓正負極之間形成電壓差,從而點亮,那麼怎麼去控制負極的電壓,後面會一步步到那裡去,所以耐心的往後看
其餘的四顆LED可以得到他們負極分別所對應的引腳號是多少:
D22 -> GPJ0_3
D23 -> GPJ0_4
D24 -> GPJ0_5
D25 -> PWMTOUT1(GPD0_1,怎麼得到的這個引腳號呢,通過PWMTOUT1這個名字去核心板的手冊<x210cv3.pdf>查找所對應的引腳)
當進行到這一步,你可能會有一些疑問,為什麼要去找每顆LED對應的引腳號呢?查找到對應的引腳號又有什麼用呢?
那麼針對這些個問題,我們需要在瞭解了下麵的知識後才能知道為什麼?
1.我們是想通過寫程式去控制LED亮或者不亮,那麼我們為什麼可以通過程式去控制硬體?
<1>編寫程式去控制硬體的關鍵就是寄存器
<2>那麼什麼是寄存器?
寄存器分為通用寄存器和特殊功能寄存器,我在這裡講的寄存器是特殊功能寄存器(SFR:special function register)
*寄存器屬於CPU外設的硬體組成部分
*CPU可以像訪問記憶體一樣訪問寄存器
*寄存器是CPU的硬體設計者制定的,目的是留作外設被編程式控制制的“活動開關”
*正如彙編指令集是CPU的編程介面API一樣,寄存器是外設硬體的軟體編程介面API。使用軟體編程式控制制某一硬體,其實就是編程讀寫該硬體的寄存器。
關於寄存器就說到這裡,那麼接下來我想描述的就是與寄存器有關一個內部外設--GPIO(general purpose input/output):通用輸入輸出。在這裡,我們可以把GPIO理解成晶元上的引腳,當然,晶元上有很多引腳,不是所有的引腳都是GPIO,只有一部分是。作為GPIO的這類引腳,他的特點就是可以通過編程去控制它的工作模式,也可以編程式控制制它的電壓高低
通過之前的分析我們知道,我們設計電路時就把LED接在了一個GPIO上,這樣我們就可以通過編程式控制制GPIO的模式和輸入輸出值來操控LED亮還是滅;如果你當時設計電路時把LED接在非GPIO上那我們就不可能通過編程去控制了。
所以瞭解到了這裡,應該就明白我們為什麼要去查找每顆LED所對應的引腳號了。因為LED的正極的電壓是3.3V(這個可以通過手冊知道),而LED的負極是接在GPIO上的,所以我們想要點亮LED,我們就得去控制GPIO的工作模式輸出,並且輸出一個低電壓,從而讓正負極形成電壓差,LED就被點亮,而我們想要去控制GPIO的工作模式和輸出電壓的高低,那就需要去通過寄存器,也就 是特殊功能寄存器,通過對寄存器的值的配置從而達到對GPIO的設定。
那麼我們既然知道了想要控制LED,由於LED的負極接在GPIO上,是輸入還是輸出,是高電壓還是低電壓是GPIO說了算,所以我們需要去控制GPIO,而想要控制GPIO,又需要通過寄存器去配置寄存器中的相關值,從而達到對GPIO的控制,達到對LED的控制。
所以到此,我們需要做的就是去修改寄存器當中的值,那麼怎麼去修改寄存器當中的值?這肯定不能說想怎麼改就這麼改,得去查數據手冊,因為這些都是人家設計者在設計時就確定好了的,所以我們需要去查數據手冊作為參考,按設計者提供的信息去做相應的修改,才能達到最終想要的結果。
現在開始查閱數據手冊(S5PV210_UM_REV1.1.pdf)
打開數據手冊,找到section 02_system下的2 GENERAL PURPOSE INPUT/ OUTPUT下的2.2.20 PORT GROUP GPJ0 CONTROL REGISTER 。因為我們接的引腳是GPJ0的是3、4、5.(當然還有一個接GPD0的就不說了,都是一樣的原理和查法)。所以就得找到GPJ0所對應的寄存器,我們通過目錄找到關於GPJ0對應寄存器的信息地方,我們可以看到
在這裡我只截取了GPJ0CON、GPJ0DAT,的相關內容,因為點亮LED只需要這兩個寄存器就可以實現,其他的暫時沒有去瞭解
查閱數據手冊可知,GPJ0相關的寄存器有以下:
GPJ0CON, (GPJ0 control)GPJ0控制寄存器,用來配置各引腳的工作模式
GPJ0DAT, (GPJ0 data)當引腳配置為input/output模式時,寄存器的相應位和引腳的電平高低相對應。
GPJ0PUD, (pull up down)控制引腳內部弱上拉、下拉
GPJ0DRV, (driver)配置GPIO引腳的驅動能力
GPJ0CONPDN,(記得是低功耗模式下的控制寄存器)
GPJ0PUDPDN (記得是低功耗模式下的上下拉寄存器)
註:在驅動LED點亮時,應該將GPIO配置為output模式。
實際上真正操控LED的硬體,主要的有:GPJ0CON, GPJ0DAT 這麼2個。
通過這樣查找過後,我提取出這樣一些需要的信息:
***GPJ0CON的地址:Address = 0xE0200240;(因為s5pv210是I/O與記憶體統一編址,我想操作寄存器可以像訪問地址一樣通過地址去訪問寄存器,去讀寫)
0001 = intput(如果想要讓對應的引腳為輸出模式,就需要把對應的引腳的位配置成 0001)所以我們編程式,需要把GPJ0_3,GPJ0_4,GPJ0_5對應的寄存器的對應位設置成0001,其他的位就不用管。
***關於GPJ0DAT寄存器我們可以得到的信息是:
GPJ0DAT,的地址:Address = 0xE0200240;【When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port,the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefined value will be read.(翻 譯:把埠作為輸入埠配置時,對應的比特為引腳狀態,把埠作為輸出埠配置時,引腳狀態和對應的比特相同,埠作為功能型引腳配置時,可讀出未定義值。)】
這段話是什麼意思呢,意思就是如果想要讓GPJ0_3的引腳輸出高電壓,那麼GPJ0DAT對應的比特位(有0~7位)的bit 3就要配置為1.如果想要讓GPJ0_3的引腳輸出低電壓,那麼GPJ0DAT對應的比特位(有0~7位)的bit 3就要配置為0. GPJ0DAT中的0~7八個比特位分別對應GPJ0CON中的0~7個埠。
當瞭解完這些過後,我就可以真正的開始寫程式去實現點亮LED等了
_start:
//首先需要把對應的埠配置為輸出模式,所以我們需要把bit12~bit23 配置0001 //0001 0001
ldr r0, =0x11111111 //給r0寫入一個值,這個值的作用是把相應的位置1
ldr r1, = 0xE0200240 //把寄存器地址寫入r0中
str r0 ,[r1] //把GPJ0_3、GPJ0_4、GPJ0_5配置成輸出模式
//當配置好引腳的模式後,接下來需要做的就是通過GPJ0DAT寄存器讓引腳輸出低 //電壓
ldr r0, =(1 << 3) | (1<<4) | (1<<5) //給r0寫入一個值,這個值的作用是把相應的位置1
ldr r1, = 0xE0200244 //把寄存器地址寫入r0中
str r0 ,[r1]
b . //最後寫的跳轉指令是個死迴圈,為了防止cpu跑飛
當這個程式經過一系列的編譯鏈接後,最後會得到一個bin文件,將這個bin文件通過usb啟動,有dnw軟體將這個文件下載到開發板里,當cpu工作的時候,就會讀取代碼,最終會看到LED被成功點亮