女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何組合一排LED并使它們閃爍序列

454398 ? 來源:wv ? 2019-10-25 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

步驟1:材料

對于此項目,您將需要

Raspberry pi 3

七個LEDs

七個220歐姆電阻

一個10k歐姆電阻

一個按鈕

您還需要計算機設置程序才能以裸機方式處理raspberry pi 3。查看我以前的指導,以了解如何為使用pi裸機設置環境。

此項目從開始到結束大概需要3-4個小時。

好,我們開始吧!!!!

步驟2:電路

要構建此模塊,我們需要一行6個LED分別連接到GPIO 20-25。我們還需要一個連接到GPIO 27的指示燈。該指示燈將向我們指示是否已按下按鈕。最后,我們需要連接按鈕。按鈕的一側將連接到3.3v,另一側連接到下拉引腳。我們將使用GPIO 17連接到按鈕。 GPIO 17將成為我們的輸入引腳。 GPIO 17連接到一個10k歐姆的電阻,該電阻連接到地(GND)。我們這樣做是為了確保GPIO 17始終設置為低電平。如果不是,則該引腳有可能在高點和低點之間放棄,從而給我們帶來隨機的結果。為了避免這種情況,我們可以使用電阻較大的電阻將引腳下拉至0v。

在面包板上設置電路是一個簡單的過程。請遵循上面的電路圖。將引線的短邊連接到GND,將長邊連接到220歐姆電阻。對其他5個不同的led重復此操作。這樣一來,您總共應該連接六個LED。從一端開始,將第一個LED的正極連接到GPIO 20,然后將下一個引腳連接到GPIO 21,依此類推。..最后一個LED應該連接到GPIO 25。

對于指示燈led連接led的短端連接到GND,長端連接到220 ohm電阻,然后將電阻連接到GPIO 17。

將按鈕連接到試驗板。我使用的按鈕上有四個連接。我們將只使用底部的兩個。將一端連接到正極軌,另一端連接到10k歐姆電阻。將GPIO 17連接到10k電阻。按下按鈕時,它將GPIO 17連接至將引腳設置為高電平的正極。

將3.3v引腳連接至正極,并將GND引腳連接至負極。

最后將正軌和負軌連接在一起,以便可以使用兩側。

步驟3:代碼:簡介

編碼部分是從上一個閃爍的項目中已經學到的東西建立的。

該項目中的兩個新事物是,我們設置了堆棧框架的使用方式,以便我們可以模擬高級功能,并進行設置使用系統時鐘等待特定毫秒數的等待函數。

堆棧是一種常見的編程結構。它實際上是一個地址序列,可用于臨時存儲內容。堆棧具有兩個基本功能

您可以將項目推入堆棧頂部

,也可以將項目從堆棧頂部彈出

可以按不同的版本設置堆棧,但是對于該項目,我們將堅持默認配置。當您將某些東西推入堆棧時,它會放在頂部。當下一件物品被推入堆棧時,新物品將成為頂部,而舊物品將位于其下方。希望您以前曾經使用過堆棧,如果沒有的話,可以在網上找到更多更深入的解釋。幸運的是,Arm有一個push和pop指令,因此使用堆棧很容易組裝。

我們將要探索的第二件事是訪問系統計時器,這樣我們可以將程序延遲一定的時間。

第4步:代碼:堆棧/堆棧框架

設置要使用的堆棧就像一行代碼一樣簡單。由于鏈接器的設置方式(kernel.ld),我們在編譯時將所有代碼插入0x8000之后。因此,我們需要將此值移到sp寄存器中。

mov sp,#0x8000

將其添加到代碼頂部并使用堆棧應該沒問題。

現在進入堆棧框架。堆棧框架基本上是當我們預留堆棧的一部分以用于過程調用時。這使我們能夠實現高級語言(如Java和C ++)使用的功能。這些語言使用堆棧來跟蹤函數調用。我們可以在匯編中做同樣的事情。

堆棧框架:

要將函數調用模擬為高級語言,我們將保留寄存器我們想通過將它們放置在堆棧上來使用,然后如果需要將其用于變量,我們還可以在堆棧中預留本地內存。在函數末尾,我們必須破壞堆棧幀并將堆棧重置為以前的狀態。

通常,如果函數需要返回任何內容,則應將其放在r0中。/p》

如果函數接受參數,則應將其放在函數分支的前面。

堆棧框架:SETUP

我們通過設置堆棧框架開始該功能。

push {r7,lr}

mov r7,sp

push {}

ldr,[r7,#8] @第一個參數與r7的偏移量為#8

然后我們通過清理堆棧框架來結束堆棧框架

pop

pop {r7,lr}

。此過程使我們無需更改任何寄存器即可調用函數。它還允許在函數內調用函數,因為堆棧框架將始終保留lr,因此允許進行多個級別的函數調用。

=======================================

stack frame visual

=======================================

0x0 | 《=sp

---------------------------------------

0x4 |

---------------------------------------

0x8 |

---------------------------------------

0x12|

---------------------------------------

0x16|

---------------------------------------

0x20|

---------------------------------------

0x24|

---------------------------------------

0x28|

======================================= Example Function with one argument.

_______________________________________ push {r1} @argument r1=0x1234

b ex_func =======================================

stack frame visual

=======================================

0x0 | 0x1234 《=sp The argument is pushed onto the stack

---------------------------------------

0x4 |

---------------------------------------

0x8 |

---------------------------------------

0x12|

---------------------------------------

0x16|

---------------------------------------

0x20|

---------------------------------------

0x24|

---------------------------------------

0x28|

======================================= ex_func:

push {r7,lr}

mov r7,sp @r7 will equal 0x8

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7 《=sp

---------------------------------------

0x12|

---------------------------------------

0x16|

---------------------------------------

0x20|

---------------------------------------

0x24|

---------------------------------------

0x28|

======================================= push {r1-r3} @using r1,r2,and r3 so we preserve them

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7

---------------------------------------

0x12| r3 saved register

---------------------------------------

0x16| r2 saved register

---------------------------------------

0x20| r1 《=sp saved register

---------------------------------------

0x24|

---------------------------------------

0x28|

=======================================

pop r1,[r7,#8] @remember r7=0x8, the old sp. To access the argument at 0x0 we need to go up by 8

@thats why we do [r7,#8] which is the same as putting the value at 0x0 (0x1234) into r1 sub sp,sp,#8 @moves sp down to create local memory

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7

---------------------------------------

0x12| r3 saved register

---------------------------------------

0x16| r2 saved register

---------------------------------------

0x20| r1 saved register

---------------------------------------

0x24| empty

---------------------------------------

0x28| empty 《=sp

======================================= To end the function we need to move the value to be returned if any into ro

步驟5:代碼:系統計時器

要使用系統計時器設置延遲,我將其編寫在一個單獨的文件中,因此也可以在以后的項目中使用。為此,我們基本上需要訪問計時器并獲取初始時間戳。一旦有了,我們將再次訪問時間戳。我們將從最初的時間戳中減去第二個時間戳,并將其與所需的值進行比較。

算法非常簡單,最困難的部分是訪問正確的寄存器。

計時器的基地址為0x3f003000

計時器的lo字的偏移量為0x4

計時器的高位字的偏移量為0x8

嘗試編寫自己的等待函數!如果需要參考,請附上我的代碼。

步驟6:代碼:獲取輸入

對于該項目,我使用了GPLEV0寄存器。本質上,它保持引腳0-31的狀態。我們正在使用GPIO 17作為輸入。要將此引腳設置為輸入,我們必須訪問FSEL1寄存器并清除GPIO 17專用的三位。

GPLEV0偏移量0x34

FSEL1偏移量0x04

通過掩碼將GPIO 17設置為輸入0xFF1FFFFF

我們還需要將位20-27設置為輸出。

FSEL2偏移量0x08

將掩碼設置為20到27以輸出0x249249

由于我們使用的是輸出,我們還需要訪問GPSET0寄存器以打開引腳,而GPCLR0寄存器以關閉引腳

GPSET0偏移量0x1c

GPCLR0偏移量0x28

由于等待功能以微秒為單位,因此您可以使用以下幾個值

半秒0x7a120 = 500,000微秒= 1/2秒

四分之一秒0x3d090 = 250,000微秒= 1/4秒

秒的八分之一0x1e848 = 125,000微秒= 1/8秒

好,讓我們開始編碼!

mov r0, @return

上面的代碼設置了我們的代碼,因此它可以正常運行。

Then we need to undo the stack frame

下一步我設置基址的地址和我們將要使用的偏移量。

Get rid of local memory created

在這里,我設置了一些以后將要使用的有用符號。

add sp,sp,#8

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7

---------------------------------------

0x12| r3 saved register

---------------------------------------

0x16| r2 saved register

---------------------------------------

0x20| r1 《=sp saved register

---------------------------------------

0x24| empty

---------------------------------------

0x28| empty

=======================================

出于可讀性考慮,我為寄存器的目的設置了一些符號。

Replace saved registers

要將此引腳設置為輸入,首先要獲得適當的偏移,然后再加載掩碼;最后,我將掩碼寫回到寄存器中。

pop {r1-r3}

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7 《=sp

---------------------------------------

0x12| r3

---------------------------------------

0x16| r2

---------------------------------------

0x20| r1

---------------------------------------

0x24| empty

---------------------------------------

0x28| empty

=======================================

我做的和輸入一樣,只是使用了不同的偏移量和掩碼。

Replace r7 and link register

接下來,我開始主程序循環。我首先描述我要程序執行的操作。

pop {r7,lr}

=======================================

stack frame visual

=======================================

0x0 | 0x1234 The argument is pushed onto the stack

---------------------------------------

0x4 | lr 《=sp

---------------------------------------

0x8 | r7

---------------------------------------

0x12| r3

---------------------------------------

0x16| r2

---------------------------------------

0x20| r1

---------------------------------------

0x24| empty

---------------------------------------

0x28| empty

=======================================

我以一個小的等待值開始循環。

Finally, we need to clean up after the argument

add sp,sp,#4

=======================================

stack frame visual

=======================================

0x0 | 0x1234 《=sp

---------------------------------------

0x4 | lr

---------------------------------------

0x8 | r7

---------------------------------------

0x12| r3

---------------------------------------

0x16| r2

---------------------------------------

0x20| r1

---------------------------------------

0x24| empty

---------------------------------------

0x28| empty

=======================================

mov pc,lr Return

在這里,我正在檢查引腳17的狀態,該函數將返回r0中指定引腳的狀態。我的所有功能都將在末尾列出。

Notice that nothing is overwritten in the stack. We simply move the stack pointer back to it‘s original place.

我檢查返回值,然后跳轉到一個功能,該功能可以打開指示燈并循環或關閉指示燈

如果按下該按鈕,它將GPIO17連接到3.3v,因此將其設置為高電平。因此,如果按下按鈕,輸入功能將返回1,從而指示器打開并且LED的環路上升,從GPIO20到GPIO 26接通。

基本上就是這樣。接下來,我將介紹在input_loop中調用的函數。

步驟7:代碼:函數定義

首先,我們有get輸入

b main

.section .text

main:

mov sp,#0x8000

我的函數有一個參數,即GPIO引腳的編號。該功能使用引腳號創建一個掩碼來測試GPLEV0中的位。 tst執行邏輯“與”并設置標志。如果and返回true,則未設置零標志。

r1:0000_1000

r2:0000_1000

tst r2,r1

結果:未設置零標志

結果返回到r0。

.equ BASE_ADDR,0x3f200000 @Base address

.equ GPFSEL0, 0x0

.equ GPFSEL1, 0x04 @FSEL1 register offset | use to select GPIO 10-19 and set input/output/alt func

.equ GPFSEL2, 0x08 @FSEL2 register offset | use to select GPIO 20-29 and set input/output/alt func

.equ GPSET0, 0x1c @GPSET0 register offset| use to set GPIO’s logic level high(3.3v)

.equ GPCLR0, 0x28 @GPCLR0 register offset| use to set GPIO‘s logic level low(0v)

.equ GPLEV0, 0x34 @GPIO level offset | use to read current level of pin(on/off)[high/low]{3.3v/0v}

接下來,我有兩個函數可以打開指示器并關閉指示燈。當指示燈打開時,該功能將分支并通過GPIO引腳循環。當指示燈熄滅時,該功能將通過GPIO引腳分支和向下循環。

.equ CLEAR_BITS21_23,0xFF1FFFFF @mask to clear bits 21 through 23 | use to set GPIO 17 to input

.equ SET_20_27,0x249249 @mask to set bits 20 through 27 | use to set GPIO 20-27 to output

.equ SET_BIT27,0x8000000 @mask to set bits 27 | use to set GPIO 27 to high(3.3v) or low(0v) GPIO 27 is indicator light

.equ half_second, 0x7a120 @hex value for half a second in microseconds

.equ quarter_second, 0x3d090 @hex value for quarter of a second in microseconds

.equ eighth_second,0x1e848 @hex value for eigth of a second in microseconds

前兩個功能設置向上或向下循環功能。他們只是確保在循環開始之前將計數器設置為正確的數字。 loop_up和loop_down函數在本質上彼此相同。一個循環通過以GPIO 20開頭并以GPIO 26結尾的引腳,然后循環通過以GPIO 26開頭并以GPIO 20結尾的引腳。

循環位置i或j移入r0和然后調用turn_on函數。這會根據傳遞到r0的數字打開一個引腳。然后,循環將等待八分之一秒,然后再關閉引腳并遞增或遞減計數器。

base .req r1 @Sets symbol base to refer to r1: can use base and r1 interchangeably base《=》r1

ldr base,=BASE_ADDR @base = 0x3f20000, load base with the base address of peripheralsoffset .req r2 @Sets symbol offset to refer to r2: can use offset and r2 interchangeably offset《=》r2

mask .req r3 @Sets symbol mask to refer to r3 mask《=》r3

i .req r4 @Sets symbol i to refer to r4 i《=》r4

j .req r5 @Sets symbol j to refer to r5 j《=》r5

return .req r0 @return 《=》 r0

turn_on和turn_of函數。

步驟8:將它們放在一起。

現在,您已經編寫了所有代碼文件,您需要生成一個二進制kernel.img。我設置了一個簡單的makefile,將其吐出來。只需下載它,然后將第4行的代碼變量更改為文件名即可。

如果您無法使代碼正常工作,請下載并編譯我的代碼,然后將kernel.img放到pi上。如果可以,那么如果不返回電路步驟并嘗試重建電路,則代碼可能存在問題。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    242

    文章

    23843

    瀏覽量

    674012
  • 樹莓派
    +關注

    關注

    121

    文章

    2007

    瀏覽量

    107456
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    5050 RGBW 四合一全彩 LED 燈珠

    20mA*4 功能性5050 RGBW 四合一全彩 LED 燈珠是種集成了紅(Red)、綠(Green)、藍(Blue)和白(White)四種顏色 LED 芯片的照明元件。這種燈珠因
    發表于 06-27 10:02

    目前市場上主流的LLC+PFC組合IC(二合一控制器)匯總

    以下是目前市場上主流的LLC+PFC組合IC(二合一控制器)匯總,涵蓋國內外廠商的典型型號及其特點: 國際廠商方案 MPS(芯源系統) HR1200/HR1203/HR1211/HR1270
    的頭像 發表于 04-08 16:31 ?1393次閱讀

    合一與三合一信號浪涌保護器的技術解析及行業應用

    防護關鍵設備的核心組件,其技術選型直接影響系統的可靠性。二合一與三合一信號浪涌保護器因功能集成度的差異,在應用場景和技術特性上存在顯著區別。 地凱科技 將從技術原理、行業應用、國家標準等多維度展開分析,為工程實踐提供參考。
    的頭像 發表于 02-27 10:34 ?399次閱讀
    二<b class='flag-5'>合一</b>與三<b class='flag-5'>合一</b>信號浪涌保護器的技術解析及行業應用

    自制DLP4710LC板子在display模式下投圖能觀察到LED閃爍的原因?

    獲取到信息,開始在Display模式下,投任意Test pattern或splash圖片,DMD和LED都正常顯示,肉眼觀察不到閃爍;但是轉到Light Control界面的Internal
    發表于 02-18 06:37

    AFE4990接上電源可以亮會,打開測試軟件LED開始不穩定閃爍,怎么解決?

    最近使用AFE4990的評估板,開始測得的波形是正常的,后來不知怎么,接上電源可以亮會,打開測試軟件LED開始不穩定閃爍,采集數據的時候跳出對話框如下 想問下,怎么解決?
    發表于 01-14 07:27

    超融合一體機屬于什么設備

    超融合一體機是種高度集成化的硬件設備,它將計算、存儲和網絡功能融為體,通過軟件定義的方式,提供了高度集成、高可用性、高性能的數據中心解決方案。主機推薦小編為您整理發布超融合一體機的
    的頭像 發表于 12-21 10:18 ?779次閱讀

    深妙科技 室內外LED電源、LED屏多媒體播放器和二合一視頻處理器維修方法

    ?關于室內外LED電源、LED屏多媒體播放器和二合一視頻處理器的維修,您可以考慮以下幾個方面: 1. 常見問題排查 LED電源 檢查電源是否正常供電,使用萬用表測量輸出電壓是否穩定 檢
    的頭像 發表于 12-05 11:33 ?778次閱讀
    深妙科技 室內外<b class='flag-5'>LED</b>電源、<b class='flag-5'>LED</b>屏多媒體播放器和二<b class='flag-5'>合一</b>視頻處理器維修方法

    LSTM神經網絡在時間序列預測中的應用

    LSTM是種特殊的循環神經網絡(RNN),它能夠學習長期依賴關系。與傳統的RNN相比,LSTM通過引入門控機制(輸入門、遺忘門、輸出門)來解決梯度消失和梯度爆炸的問題,使其能夠處理更長的序列數據。 LSTM的工作原理 LSTM單元包含三個門控機制,
    的頭像 發表于 11-13 09:54 ?2048次閱讀

    隆基Hi-MO X6防積灰組件燃動低碳造車夢

    從高空鳥瞰,在山東省煙臺市福山區經濟開發區,片面積超過三個標準足球場大小的屋頂被一排排光伏面板覆蓋,它們有序鋪列,汲光成電,源源不斷地輸出綠色電力。
    的頭像 發表于 11-04 11:22 ?794次閱讀

    負載管的閃爍噪聲和熱噪聲的區別

    負載管的閃爍噪聲和熱噪聲是兩種不同的噪聲類型,它們在電子設備中的表現和影響各有特點。 閃爍噪聲(1/f噪聲) 定義 : 閃爍噪聲,也稱為1/f噪聲或粉紅噪聲,是
    的頭像 發表于 10-10 11:19 ?1219次閱讀

    繼電器組合組合架的作用

    繼電器組合組合架是電氣控制系統中的重要組成部分,它們在電路中起到保護、控制和信號傳遞的作用。繼電器組合組合架的設計和應用對于確保電氣系統
    的頭像 發表于 09-27 14:35 ?1450次閱讀

    文全了解麥克風陣列

    什么是麥克風陣列? 想象一下一個小型音響部隊在你面前,它們站成一排,用不同的麥克風捕捉聲音。這就是麥克風陣列的基本概念。麥克風陣列由多個麥克風組成,按照特定的布局排列在起,用來捕捉和
    的頭像 發表于 09-03 16:03 ?2991次閱讀
    <b class='flag-5'>一</b>文全了解麥克風陣列

    硅基CCD:基礎知識

    圖 1:CCD 上的電荷轉移示意圖。(A) 當傳感器暴露在光線下時,不同數量的光電子會積聚在傳感器內的像素上。每一排電子使用正電壓向下移動一排。(B) 通過將正電壓分散在相鄰像素(在同列中)以將
    的頭像 發表于 08-20 06:28 ?865次閱讀
    硅基CCD:基礎知識

    【「時間序列與機器學習」閱讀體驗】時間序列的信息提取

    本章主講時間序列的信息提取,章節中有許多概念定義和數學公式,配有Python代碼演示,細細品讀與理解動手演練,還是很開拓思維視野的。下面以筆記形式進行展開。 時間序列的信息提取是時間序列
    發表于 08-17 21:12

    【「時間序列與機器學習」閱讀體驗】全書概覽與時間序列概述

    它們都試圖從數據中獲取信息、發現模式,某種程度上預測未來的數據。2.多維時間序列 多維時間序列是指在同時間點上收集的多個相關變量的觀測
    發表于 08-07 23:03