總體概述
開(kāi)關(guān)矩陣顧名思義就是一個(gè)由多個(gè),甚至多組開(kāi)關(guān)組成的陣列,這個(gè)陣列的目的就是把片內(nèi)外設(shè)的輸入輸出信號(hào)線,按照用戶(hù)的意向,通過(guò)編程連接到特定的外部引腳上。
開(kāi)關(guān)矩陣可以為LPC800的使用者帶來(lái)很多方便和實(shí)用的特性:
-
很多用戶(hù)都碰到過(guò),設(shè)計(jì)PCB時(shí)芯片引腳的順序與板上的器件不匹配,走線繞來(lái)繞去;有了這個(gè)開(kāi)關(guān)矩陣,用戶(hù)可以按照最佳布線要求,安排MCU的功能引出腳。
-
有些工程師在設(shè)計(jì)PCB時(shí),由于疏忽或?qū)ζ骷睦斫庥姓`,可能會(huì)造成連線錯(cuò)誤,例如把I2C的SDA和SCL搞反了,把UART的TX和RX搞反了等。遇到這種情況,不必割線、飛線、重新設(shè)計(jì)PCB,只需要在配置開(kāi)關(guān)矩陣時(shí),在代碼中按照實(shí)際的連線編程配置即可,完全不必改動(dòng)硬件。
-
用戶(hù)經(jīng)常會(huì)因?yàn)楫a(chǎn)品升級(jí)換代,需要重新設(shè)計(jì)PCB,但只是做少量的修改或擴(kuò)充,或者僅僅是更換一個(gè)功能更強(qiáng)的MCU,而希望盡可能地保持原有的布局和布線走向不變;開(kāi)關(guān)矩陣同樣能滿(mǎn)足用戶(hù)的這個(gè)需要。
-
通常一款MCU都會(huì)內(nèi)置多個(gè)及多種外設(shè),例如LPC824的串行通信外設(shè)就包含3個(gè)USART、4個(gè)I2C和2個(gè)SPI,即使不計(jì)算其它外設(shè)(例如SCT、GPIO等)的引出腳,所有這些串行通信外設(shè)的引出腳數(shù)目,就已經(jīng)超過(guò)芯片總的引腳數(shù)目。有了開(kāi)關(guān)矩陣,用戶(hù)可以按照自己的意愿引出需要的功能,在引腳總數(shù)允許的情況下,可以進(jìn)行隨意的功能組合。
開(kāi)關(guān)矩陣也有其局限性,模擬功能和電源/地線引腳不能通過(guò)開(kāi)關(guān)矩陣重新分配引出腳;模擬功能具有固定的不能被重新分配的引出腳,但用戶(hù)可以按照需要關(guān)閉引出腳對(duì)應(yīng)的模擬功能,從而騰出該引出腳用于其它數(shù)字功能。
1.1 SWM模型特性LPC800全系列的每個(gè)型號(hào)都標(biāo)配SWM開(kāi)關(guān)矩陣。
開(kāi)關(guān)矩陣的功能有兩個(gè):
-
把數(shù)字外設(shè)的輸入輸出功能自由地分配到指定的外部引腳。能夠自由分配外部引腳的功能稱(chēng)為可移動(dòng)功能。
-
使能或關(guān)閉模擬功能或需要特定電氣特性的功能,例如ADC和/或模擬比較器的輸入功能,晶體振蕩器的輸入輸出引腳,具有超快速模式的I2C0功能等。對(duì)于這些不能自由分配外部引腳的功能,稱(chēng)為固定功能。
下面兩張表分別列出了所有可移動(dòng)功能和固定功能,以及它們?cè)诟鱾€(gè)系列中的配置情況。* 括號(hào)中為L(zhǎng)PC81x的信號(hào)名稱(chēng)。
表1 可移動(dòng)功能一覽表
上表中列出了所有目前LPC800產(chǎn)品系列的可移動(dòng)功能信號(hào),可以看出這些信號(hào)全部是數(shù)字信號(hào)。右邊四列分別是各個(gè)系列的配置情況,數(shù)字代表所在行的信號(hào)在對(duì)應(yīng)的系列中是可移動(dòng)功能,編號(hào)的意義將在1.3節(jié)的應(yīng)用例程中介紹;格中“-”表示對(duì)應(yīng)的系列沒(méi)有這個(gè)信號(hào)。
I2C0_SDA和I2C0_SCL這兩個(gè)信號(hào)只在LPC81x中是可移動(dòng)功能,在其它系列中都是不可移動(dòng)的。LPC82x和LPC84x的其它I2C模塊,I2C1~3的信號(hào)是可移動(dòng)功能信號(hào)。
這里需要注意的是,在LPC81x系列中,I2C0_SDA和I2C0_SCL這兩個(gè)信號(hào)是可移動(dòng)的,但只有把它們安排在PIO0_10和PIO0_11引腳時(shí),才能達(dá)到超高速(1Mbit/s),移動(dòng)到其它的引腳時(shí)只能實(shí)現(xiàn)最高400 kbit/s的速率。
固定功能信號(hào)分兩類(lèi):數(shù)字信號(hào)和模擬信號(hào);這樣的區(qū)分將涉及到信號(hào)間互聯(lián)的策略,本章后面的段落將討論這個(gè)策略。* 對(duì)應(yīng)的信號(hào)與其它信號(hào)復(fù)用相同引腳。
表2固定功能一覽表
表2中右邊四列分別是各個(gè)系列的配置情況,數(shù)字代表所在行的信號(hào)在對(duì)應(yīng)的系列中是否有該功能,編號(hào)的意義將在1.3節(jié)的應(yīng)用例程中介紹;格中“-”表示對(duì)應(yīng)的系列沒(méi)有這個(gè)信號(hào)。
每一個(gè)可移動(dòng)功能,可以被分配使用任意一個(gè)引腳。而固定功能只能使用芯片指定的引腳。GPIO的輸出端口也只能使用芯片指定的引腳。
下面是LPC80x的可移動(dòng)功能和固定功能列表,這個(gè)新的子系列的SWM寄存器排列與其它系列略有不同,但不會(huì)影響用戶(hù)的使用。
表3LPC80x可移動(dòng)功能一覽表
* 對(duì)應(yīng)的信號(hào)與其它信號(hào)復(fù)用相同引腳? ??表4LPC80x固定功能一覽表
另外,在LPC804中的PLU模塊共有6個(gè)輸入端和8個(gè)輸出端,它們也是可移動(dòng)功能,但不能向其它可移動(dòng)功能那樣可以被任意地分配到任一個(gè)引腳,每個(gè)PLU的輸入/輸出端分別只能在PINASSIGNFIXED0寄存器中被分配到3個(gè)引腳,如下表:
每個(gè)PLU的信號(hào)在PINASSIGNFIXED0寄存器中占據(jù)2個(gè)二進(jìn)制控制位,具體配置方法請(qǐng)參考用戶(hù)手冊(cè)。
1.2 SWM模塊的內(nèi)部構(gòu)成1.2.1 模塊框圖
下面這個(gè)框圖來(lái)自LPC800的用戶(hù)手冊(cè):
圖1.開(kāi)關(guān)矩陣(SWM)框圖
這個(gè)圖全面地描繪了開(kāi)關(guān)矩陣與各個(gè)內(nèi)部外設(shè)、連接外部引腳的焊盤(pán)、GPIO模塊以及引腳中斷單元之間的關(guān)系。這張圖只畫(huà)出了一個(gè)外部引腳和與之對(duì)應(yīng)的內(nèi)部結(jié)構(gòu),其它引腳及內(nèi)部結(jié)構(gòu)和這張圖基本一樣;以LPC824封裝為HVQFN33的芯片為例,它有29個(gè)GPIO引腳,則其內(nèi)部就有29套上圖這樣的電路。
對(duì)于某些不具備模擬功能的引腳,它們的片內(nèi)結(jié)構(gòu)將不包含上圖中的模擬部分(黃色區(qū)域)。
按照用戶(hù)手冊(cè)的功能描述,可以把LPC824的最大引腳封裝的開(kāi)關(guān)矩陣,用圖2示意性地展現(xiàn)出來(lái)。這張圖清晰地展示了一個(gè)完整的開(kāi)關(guān)陣列(矩陣)的結(jié)構(gòu);此圖只是一個(gè)幫助理解和記憶的示意圖,并不代表芯片內(nèi)部的真實(shí)電路。圖中左邊一列的PIO0_0~PIO0_28表示外部引腳,而右邊一列的PIO0_0~PIO0_28表示GPIO模塊的內(nèi)部輸出端。

下面把SWM的功能分成三個(gè)組,分別進(jìn)行介紹。(注:這里的分組只是為了方便說(shuō)明,實(shí)際在芯片手冊(cè)中并沒(méi)有此類(lèi)分組)
1.2.2 固定功能開(kāi)關(guān)組
上圖左側(cè)以黃色標(biāo)注的一組開(kāi)關(guān),可以稱(chēng)它為固定功能開(kāi)關(guān)組,每一個(gè)開(kāi)關(guān)旁邊,都用黃字標(biāo)示該開(kāi)關(guān)對(duì)應(yīng)的固定功能信號(hào)。這組開(kāi)關(guān)中,在芯片復(fù)位后,多數(shù)開(kāi)關(guān)默認(rèn)為斷開(kāi)固定功能與外部引腳的連接;但有三個(gè)信號(hào)特殊,在芯片復(fù)位后,SWDIO、SWCLK和RESETN對(duì)應(yīng)的開(kāi)關(guān)將這三個(gè)信號(hào)連接到外部引腳上。
另外PIO0_1對(duì)應(yīng)的固定功能信號(hào)有一個(gè)模擬功能(ACMP_I2)和一個(gè)數(shù)字功能(CLKIN);PIO0_6、PIO0_14和PIO0_23,分別對(duì)應(yīng)兩個(gè)固定功能模擬信號(hào);這些信號(hào)的連接示意圖如下。
? ? ? 圖3.LPC824的復(fù)用固定功能模擬信號(hào)開(kāi)關(guān)示意圖
▲固定功能開(kāi)關(guān)組:決定需要把某個(gè)固定功能信號(hào)連接到對(duì)應(yīng)的外部引腳,這組開(kāi)關(guān)是一對(duì)一的;以LPC82x為例,表2列出了25個(gè)固定功能,其中有四對(duì)固定功能信號(hào)復(fù)用輸入引腳,因此共有25個(gè)固定功能開(kāi)關(guān)。(注:LPC82x中最大配置的芯片有25個(gè)固定功能,其它芯片中固定功能則少于這個(gè)數(shù)目)
模擬的固定功能信號(hào)對(duì)應(yīng)的開(kāi)關(guān)是排他性的,當(dāng)對(duì)應(yīng)的模擬信號(hào)連接到外部引腳時(shí),其它任何信號(hào)不能再連接到該引腳;數(shù)字的固定功能信號(hào)對(duì)應(yīng)的開(kāi)關(guān),用于把使能的信號(hào)連接到對(duì)應(yīng)的引腳,但不排斥其它可移動(dòng)功能也連接到這個(gè)相同的引腳。
? ? ? ? ? ? ? ??圖4.固定功能開(kāi)關(guān)組(模擬信號(hào))示意圖
圖5.固定功能開(kāi)關(guān)組(數(shù)字信號(hào))示意圖
引腳使能寄存器0(PINENABLE0)中的每一位,對(duì)應(yīng)圖4或圖5所示的一個(gè)開(kāi)關(guān)。
圖2中部蘭色陰影框起來(lái)的部分,可以稱(chēng)為可移動(dòng)功能開(kāi)關(guān)組。在這個(gè)縱橫矩陣中,每個(gè)交叉點(diǎn)都是一個(gè)開(kāi)關(guān);每列(縱向)只能有一個(gè)開(kāi)關(guān)閉合;每行(橫向)可以有多個(gè)開(kāi)關(guān)閉合;復(fù)位后所有開(kāi)關(guān)默認(rèn)為斷開(kāi)。
▲可移動(dòng)功能開(kāi)關(guān)組:該組開(kāi)關(guān)決定需要把某個(gè)可移動(dòng)功能信號(hào)連接到哪個(gè)外部引腳。表1的第一列的每一個(gè)可移動(dòng)功能,都對(duì)應(yīng)這樣的可移動(dòng)功能開(kāi)關(guān)組;表1列出了48個(gè)可移動(dòng)功能,也就是說(shuō)芯片內(nèi)部實(shí)現(xiàn)了48個(gè)這樣的開(kāi)關(guān)組。(注:最大配置的芯片有48個(gè)可移動(dòng)功能,其它芯片中可移動(dòng)功能數(shù)目可參看表1)
圖6.可移動(dòng)功能開(kāi)關(guān)組(共48組)示意圖A
每個(gè)引腳分配寄存器0~11(Pin assign register)都有4個(gè)字節(jié),每個(gè)字節(jié)控制上圖所示的一個(gè)可移動(dòng)功能開(kāi)關(guān)組,即每個(gè)引腳分配寄存器控制四個(gè)可移動(dòng)功能信號(hào)的引腳分配。
圖7.可移動(dòng)功能開(kāi)關(guān)組(共48組)示意圖B
上圖是圖6的另一種畫(huà)法,虛線框起來(lái)的一組開(kāi)關(guān),由引腳分配寄存器的對(duì)應(yīng)字節(jié)控制,任何時(shí)候,只能有一個(gè)開(kāi)關(guān)閉合或所有開(kāi)關(guān)斷開(kāi)。
圖2右側(cè)以橘紅色標(biāo)注的一組開(kāi)關(guān),稱(chēng)為GPIO開(kāi)關(guān)組。當(dāng)其中任一開(kāi)關(guān)閉合時(shí),對(duì)應(yīng)的GPIO輸出端口已固定功能開(kāi)關(guān)的狀態(tài),將有可能連接到外部引腳。當(dāng)某個(gè)開(kāi)關(guān)K所在行中有任意一個(gè)開(kāi)關(guān)閉合時(shí),這個(gè)開(kāi)關(guān)K會(huì)自動(dòng)斷開(kāi),很顯然這樣可以避免GPIO模塊的輸出與可移動(dòng)功能信號(hào)相互沖突。
▲GPIO開(kāi)關(guān)組:該組開(kāi)關(guān)決定是否要把GPIO模塊的某個(gè)端口輸出到對(duì)應(yīng)的引腳。
圖8.GPIO開(kāi)關(guān)組示意圖
將GPIO模塊的某個(gè)端口的輸出連接到外部引腳的條件有兩個(gè):一是沒(méi)有任何作為輸出的可移動(dòng)功能分配到對(duì)應(yīng)的引腳;二是沒(méi)有使能對(duì)應(yīng)的固定功能,例如:如果要輸出GPIO模塊的PIO0_6信號(hào),則應(yīng)該關(guān)閉對(duì)應(yīng)的固定功能ADC_1和VDDCMP。
從圖1可以看出,每個(gè)引腳都有兩個(gè)內(nèi)部連接點(diǎn)(焊盤(pán)),分別處理數(shù)字信號(hào)和模擬信號(hào);實(shí)際使用中,對(duì)IOCON(輸入輸出配置)模塊的設(shè)置決定數(shù)字焊盤(pán)的輸入輸出特性;而使用數(shù)字焊盤(pán)還是模擬焊盤(pán)與外部引腳相連接,則由開(kāi)關(guān)矩陣決定;當(dāng)在開(kāi)關(guān)矩陣中使能了某個(gè)端口的固定模擬功能,則該外部引腳將使用模擬焊盤(pán);其它情況下,不論引腳是分配了可移動(dòng)的功能信號(hào),還是固定功能的數(shù)字信號(hào),或是GPIO的輸出端,該外部引腳都是對(duì)應(yīng)數(shù)字焊盤(pán)的信號(hào)。
1.2.3 開(kāi)關(guān)矩陣的使用特性
從圖2和以上的描述,可以總結(jié)出以下一些特性:
■一旦使能某個(gè)固定模擬功能時(shí),該功能將占用對(duì)應(yīng)的引腳,所有其它任何信號(hào)都不能使用該引腳。
■當(dāng)使能某個(gè)固定數(shù)字功能信號(hào)時(shí),其他的可移動(dòng)數(shù)字信號(hào),也可以被分配使用該引腳,即多個(gè)信號(hào)線在芯片內(nèi)部是互通的。例如使能了CLKIN輸入功能后,還可以分配一個(gè)或多個(gè)SCT的輸入端至相同的引腳,這樣CLKIN信號(hào)也同時(shí)輸入至SCT中。
■如果某個(gè)引腳對(duì)應(yīng)的固定功能未使能時(shí),一個(gè)或多個(gè)可移動(dòng)功能可以被分配使用該引腳;當(dāng)沒(méi)有任何可移動(dòng)功能使用該引腳時(shí),對(duì)應(yīng)的GPIO輸出端口將能夠取得該引腳的控制權(quán)。使用GPIO輸出功能時(shí),需要關(guān)閉對(duì)應(yīng)的固定功能并且沒(méi)有任何可移動(dòng)功能使用對(duì)應(yīng)的引腳。
■一個(gè)或多個(gè)可移動(dòng)功能可以被分配使用相同的引腳,但其中只能有一個(gè)可移動(dòng)輸出功能(包含雙向功能信號(hào))。多個(gè)可移動(dòng)輸入功能可以使用同一個(gè)引腳;例如多個(gè)SCT的輸入端可以使用同一個(gè)引腳,這樣可以用一個(gè)外部信號(hào)同步SCT的多組定時(shí)。
■當(dāng)可移動(dòng)輸入功能與某個(gè)可移動(dòng)輸出功能被分配到同一個(gè)引腳時(shí),這些輸入功能將接收前述輸出功能的信號(hào)。使用者可以用這個(gè)特性實(shí)現(xiàn)很多環(huán)回的操作;例如把USART的RXD和TXD信號(hào)通過(guò)此方式連接,實(shí)現(xiàn)自循環(huán)。
■不管引腳連接到哪種數(shù)字功能信號(hào)(固定數(shù)字功能、可移動(dòng)功能或GPIO模塊),GPIO模塊的輸入端都始終與它對(duì)應(yīng)的引腳連接,GPIO輸入寄存器將反映引腳的數(shù)字電平狀態(tài)。
■當(dāng)任意模擬信號(hào)被分配使用外部引腳,該引腳的模擬焊盤(pán)被使能,同時(shí)數(shù)字焊盤(pán)將被斷開(kāi)。
■當(dāng)任意數(shù)字輸出信號(hào)被分配到外部引腳,該引腳的數(shù)字焊盤(pán)被使能。
■只要引腳的數(shù)字焊盤(pán)被使能(未斷開(kāi)),對(duì)應(yīng)的引腳中斷就會(huì)有輸入信號(hào),即該引腳的輸入信號(hào)(如果被使能的話)將可能觸發(fā)引腳中斷。
下面這個(gè)簡(jiǎn)單的流程圖,以另一種方式描述了開(kāi)關(guān)矩陣的用法。圖9.開(kāi)關(guān)矩陣的使用
第一個(gè)例子是使用SCT在板載LED燈上實(shí)現(xiàn)一個(gè)呼吸燈(SCT的呼吸燈不是本章重點(diǎn),將不做注解),然后通過(guò)改變開(kāi)關(guān)矩陣的設(shè)置,實(shí)現(xiàn)一組LED燈的輪流顯示。
第二個(gè)例子是使用LPC824的開(kāi)關(guān)矩陣,把芯片上的兩個(gè)USART模塊進(jìn)行對(duì)接,實(shí)現(xiàn)一發(fā)一收而不需片外連線。
1.3.1 設(shè)置開(kāi)關(guān)矩陣的函數(shù)
開(kāi)關(guān)矩陣的設(shè)置是通過(guò)一組32位寄存器PINASSIGN[n],和一個(gè)32位寄存器PINENABLE0實(shí)現(xiàn)。
寄存器PINENABLE0中的每一位,是對(duì)應(yīng)的固定功能的使能位,即圖4或圖5中的一個(gè)開(kāi)關(guān);表2最右邊三列中的數(shù)字,分別是每個(gè)系列中各個(gè)固定功能信號(hào)使能位在寄存器PINENABLE0中的索引號(hào)。
對(duì)于PINASSIGN[n] 寄存器組,我們把它相像成一個(gè)字節(jié)數(shù)組,每個(gè)字節(jié)對(duì)應(yīng)圖6或圖7所示的一個(gè)可移動(dòng)功能開(kāi)關(guān)組,即每個(gè)字節(jié)對(duì)應(yīng)一個(gè)可移動(dòng)功能,這個(gè)字節(jié)中填寫(xiě)的內(nèi)容就是該功能被分配到的引腳編號(hào)。表1最右邊三列中的數(shù)字,分別是每個(gè)系列中各個(gè)可移動(dòng)功能信號(hào),在上述字節(jié)數(shù)組中的索引號(hào)。例如在LPC82x和LPC83x系列中,功能SCT_OUT0的索引號(hào)是31,由于每個(gè)PINASSIGN寄存器里有四個(gè)字節(jié),所以SCT_OUT0的配置字節(jié)是PINASSIGN[7]的第三個(gè)字節(jié),即位24~31,如下圖:
讀者可以方便地使用下面這個(gè)函數(shù)設(shè)置可移動(dòng)功能信號(hào)。
代碼片段1.置可移動(dòng)功能信號(hào)引腳的函數(shù)
這個(gè)函數(shù)簡(jiǎn)化了SWM寄存器的配置,以后會(huì)經(jīng)常用到。
1.3.2 設(shè)置開(kāi)關(guān)矩陣簡(jiǎn)例
■例1:使能I2C0的兩個(gè)信號(hào)。
在LPC82x和LPC83x中,I2C0的兩個(gè)信號(hào)是固定功能,需要使用PINENABLE0使能,分別使用P0_11和P0_12兩個(gè)引腳:在LPC81x中,I2C0的兩個(gè)信號(hào)是可移動(dòng)功能,可以使用上一節(jié)的函數(shù)設(shè)置引腳分配。
■例2:使能CLKIN輸入功能,同時(shí)把這個(gè)信號(hào)作為所有SCT的輸入。這個(gè)例子演示了把多個(gè)可移動(dòng)功能分配至同一個(gè)引腳,同時(shí)使能這個(gè)引腳的固定功能。
引腳P0_1是固定功能CLKIN對(duì)應(yīng)的引腳,使能CLKIN后P0_1即成為它的輸入引腳,再把所有SCT的輸入端也分配使用這個(gè)輸入腳,這樣輸入信號(hào)也同時(shí)同步地導(dǎo)入至所有SCT的輸入端。
1.3.3 通過(guò)開(kāi)關(guān)矩陣實(shí)現(xiàn)呼吸燈的輪轉(zhuǎn)
在LPC824-Lite開(kāi)發(fā)板上共有八個(gè)LED燈,這部分線路圖如下:
從上圖中可以看出,八個(gè)LED燈分別連接到MCU的P0_7、13、16、17、19、27、28、18引腳上。
本例程使用LPC824的SCT產(chǎn)生一個(gè)PWM波形,當(dāng)這個(gè)PWM信號(hào)輸出到某個(gè)LED時(shí),對(duì)應(yīng)的LED就會(huì)忽明忽暗地顯現(xiàn)呼吸燈的效果。例程中通過(guò)開(kāi)關(guān)矩陣(SWM),在不改變?nèi)魏蜸CT配置的情況下,實(shí)現(xiàn)輪流逐個(gè)點(diǎn)亮LED燈的效果。在此基礎(chǔ)上,通過(guò)變換GPIO輸出,實(shí)現(xiàn)另一個(gè)LED燈的閃爍。
本例程可以讓讀者體會(huì)到,在不改變信號(hào)源的配置的情況下,僅改變SWM的配置即可改變信號(hào)的輸出引腳;作為對(duì)比,GPIO的輸出是不能通過(guò)開(kāi)關(guān)矩陣改變輸出引腳的,LED燈的閃爍操作則必須通過(guò)改變對(duì)應(yīng)的GPIO輸出狀態(tài),才能改變輸出引腳的狀態(tài)。
下圖是SCT的PWM波形輪流輸出至八個(gè)LED燈的示意圖。
圖10.輪流輸出PWM信號(hào)至八個(gè)LED燈的示意圖
為了實(shí)現(xiàn)呼吸燈的效果,即LED燈逐漸地由暗變亮,再逐漸地由亮變暗,需要控制輸出PWM波形的占空比,從100%(全滅)逐漸減少至0%(全亮),再?gòu)?%逐漸增加到100%。
本例程使用SysTick和幾個(gè)全局變量控制PWM占空比的改變和時(shí)序。
代碼片段2.SysTick中斷處理函數(shù)——改變PWM占空比
SysTick的中斷處理函數(shù)的操作非常簡(jiǎn)單,每次進(jìn)入都會(huì)改變輸出占空比;改變的速度快慢是由SysTick的設(shè)置決定。
下面代碼就是主程序部分。
代碼片段3.開(kāi)關(guān)矩陣實(shí)現(xiàn)呼吸燈輪轉(zhuǎn)主程序
初始化完所有用到的資源后,在主循環(huán)中有兩個(gè)操作,其一是當(dāng)SCT輸出的占空比達(dá)到100%,轉(zhuǎn)換SCT輸出的外部引腳,實(shí)現(xiàn)呼吸燈的輪轉(zhuǎn);其二是使用GPIO輸出控制另一個(gè)LED燈的閃爍。
數(shù)組LED_Pins[8],是為了方便程序輪流操作八個(gè)LED燈;數(shù)組中存放了每個(gè)燈對(duì)應(yīng)的引腳編號(hào)。
用GPIO輸出,實(shí)現(xiàn)LED燈閃爍的實(shí)現(xiàn)代碼如下。
代碼片段4. GPIO實(shí)現(xiàn)LED燈閃爍
函數(shù)Toggle_LED_Pins()的作用就是定時(shí)變換LED燈的亮或滅,實(shí)現(xiàn)閃爍的效果。該函數(shù)以呼吸燈信號(hào)的占空比為定時(shí)依據(jù),實(shí)現(xiàn)LED循環(huán)閃爍:
上述LED_On和LED_Off是兩個(gè)宏定義,直接控制GPIO輸出端口的狀態(tài):
#define LED_On(led) LPC_GPIO_PORT->CLR0 = (1<<(led))
|
|
#define LED_Off(led) LPC_GPIO_PORT->SET0 = (1<<(led))
|
1.3.4 兩個(gè)USART模塊對(duì)接
這個(gè)實(shí)例演示了通過(guò)開(kāi)關(guān)矩陣實(shí)現(xiàn)片內(nèi)外設(shè)模塊的互連,完成互相通信。
LPC800的每個(gè)USART模塊都可以實(shí)現(xiàn)同步的串行傳輸,即比普通的異步傳輸多一條時(shí)鐘信號(hào)線。本實(shí)例配置USART1作為發(fā)送方,配置USART2作為接收方,需要分別連接三個(gè)信號(hào)線,如下圖:
通過(guò)開(kāi)關(guān)矩陣的配置,上述連接可以在芯片內(nèi)部直接實(shí)現(xiàn)。如果不需要連接其它外設(shè),用戶(hù)不必再對(duì)開(kāi)發(fā)板進(jìn)行任何改動(dòng)。
下圖是開(kāi)關(guān)矩陣的配置代碼, USART1和USART2的初始化代碼和通信的測(cè)試代碼不在此說(shuō)明。 代碼片段5.為USART1和USART2配置輸入輸出引腳
讀者在運(yùn)行這個(gè)例程時(shí),可以嘗試更改上述06~11行代碼,分別把USART1和USART2的三個(gè)信號(hào)配置到不同的引腳,然后再在開(kāi)發(fā)板上把對(duì)應(yīng)的信號(hào)短接,以此體會(huì)開(kāi)關(guān)矩陣在內(nèi)部信號(hào)互連的特點(diǎn)。
在實(shí)際的項(xiàng)目開(kāi)發(fā)中,用戶(hù)可以使用開(kāi)關(guān)矩陣的這一特性,配置本項(xiàng)目中沒(méi)有用到的片內(nèi)模塊,對(duì)那些對(duì)外通信的模塊實(shí)行適當(dāng)?shù)谋O(jiān)測(cè),在不干擾正常通信并且不增加任何外部硬件的情況下,提供更多的調(diào)試跟蹤手段。
1.4注意事項(xiàng)
開(kāi)關(guān)矩陣的使用相當(dāng)簡(jiǎn)單,但有以下幾點(diǎn)需要注意的:
1. 配置開(kāi)關(guān)矩陣時(shí),必須先打開(kāi)SWM的時(shí)鐘,配置完成后,可以關(guān)閉SWM的時(shí)鐘節(jié)省功耗。
2. 不能把多于一個(gè)的輸出功能或雙向功能信號(hào),分配至同一個(gè)引腳上。
3. 只要引腳不是模擬功能,不管是輸出功能還是輸入功能,對(duì)應(yīng)的GPIO輸入端始終連接到引腳,這樣通過(guò)GPIO端口隨時(shí)可以讀出引腳的電平狀態(tài)。同時(shí),如果在SYSCON中選擇了該端口作為中斷觸發(fā)源,該引腳將可能觸發(fā)中斷,尤其當(dāng)該引腳為數(shù)字輸出功能時(shí),芯片內(nèi)部的輸出信號(hào)也會(huì)觸發(fā)中斷。
通過(guò)開(kāi)關(guān)矩陣SWM能夠?qū)崿F(xiàn)一個(gè)輸出對(duì)多個(gè)輸入信號(hào)的鏈接,這是通過(guò)把輸出信號(hào)送到引腳上,再通過(guò)引腳的輸入端口“穿回”到芯片內(nèi)部。如果選擇了模擬信號(hào),那么只有模擬信號(hào)送到引腳上,數(shù)字信號(hào)不能送到引腳上,否則就會(huì)干擾模擬信號(hào)。而且這時(shí)候數(shù)字輸入的那部分也是關(guān)閉的。如果不是最大封裝,那些沒(méi)封出來(lái)的引腳是可以用來(lái)做這種穿回,來(lái)實(shí)現(xiàn)內(nèi)部信號(hào)互聯(lián)。
END
更多恩智浦AI-IoT市場(chǎng)和產(chǎn)品信息,邀您同時(shí)關(guān)注“NXP客?!蔽⑿殴娞?hào)

NXP客棧
恩智浦致力于打造安全的連接和基礎(chǔ)設(shè)施解決方案,為智慧生活保駕護(hù)航。
長(zhǎng)按二維碼,關(guān)注我們
恩智浦MCU加油站
這是由恩智浦官方運(yùn)營(yíng)的公眾號(hào),著重為您推薦恩智浦MCU的產(chǎn)品信息、開(kāi)發(fā)技巧、教程文檔、培訓(xùn)課程等內(nèi)容。

長(zhǎng)按二維碼,關(guān)注我們
原文標(biāo)題:LPC800前生今世 第六章-開(kāi)關(guān)矩陣(SWM: Switch Matrix)
文章出處:【微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
mcu
+關(guān)注
關(guān)注
146文章
17932瀏覽量
363170 -
恩智浦
+關(guān)注
關(guān)注
14文章
5967瀏覽量
115185
原文標(biāo)題:LPC800前生今世 第六章-開(kāi)關(guān)矩陣(SWM: Switch Matrix)
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
電源設(shè)計(jì)中功率因數(shù)校正講解
激光器電源技術(shù)電子書(shū)
施耐德電氣創(chuàng)贏計(jì)劃第六季正式啟動(dòng)
飛凌嵌入式ElfBoard ELF 1板卡-uboot移植之IOMUX介紹
第六章 外部中斷

第六章 GPIO輸入——按鍵檢測(cè)

SESIP的前生今世和未來(lái)
《DNESP32S3使用指南-IDF版_V1.6》第六章 新建基礎(chǔ)工程
AUMO傲目榮獲第六屆金輯獎(jiǎng)“最具成長(zhǎng)價(jià)值獎(jiǎng)”
《DNK210使用指南 -CanMV版 V1.0》第六章 Kendryte K210固件燒錄
第六章-電機(jī)驅(qū)動(dòng)和PWM STM32項(xiàng)目

XLT開(kāi)關(guān)矩陣

評(píng)論