總體概述
開關矩陣顧名思義就是一個由多個,甚至多組開關組成的陣列,這個陣列的目的就是把片內外設的輸入輸出信號線,按照用戶的意向,通過編程連接到特定的外部引腳上。
開關矩陣可以為LPC800的使用者帶來很多方便和實用的特性:
-
很多用戶都碰到過,設計PCB時芯片引腳的順序與板上的器件不匹配,走線繞來繞去;有了這個開關矩陣,用戶可以按照最佳布線要求,安排MCU的功能引出腳。
-
有些工程師在設計PCB時,由于疏忽或對器件的理解有誤,可能會造成連線錯誤,例如把I2C的SDA和SCL搞反了,把UART的TX和RX搞反了等。遇到這種情況,不必割線、飛線、重新設計PCB,只需要在配置開關矩陣時,在代碼中按照實際的連線編程配置即可,完全不必改動硬件。
-
用戶經常會因為產品升級換代,需要重新設計PCB,但只是做少量的修改或擴充,或者僅僅是更換一個功能更強的MCU,而希望盡可能地保持原有的布局和布線走向不變;開關矩陣同樣能滿足用戶的這個需要。
-
通常一款MCU都會內置多個及多種外設,例如LPC824的串行通信外設就包含3個USART、4個I2C和2個SPI,即使不計算其它外設(例如SCT、GPIO等)的引出腳,所有這些串行通信外設的引出腳數目,就已經超過芯片總的引腳數目。有了開關矩陣,用戶可以按照自己的意愿引出需要的功能,在引腳總數允許的情況下,可以進行隨意的功能組合。
開關矩陣也有其局限性,模擬功能和電源/地線引腳不能通過開關矩陣重新分配引出腳;模擬功能具有固定的不能被重新分配的引出腳,但用戶可以按照需要關閉引出腳對應的模擬功能,從而騰出該引出腳用于其它數字功能。
1.1 SWM模型特性LPC800全系列的每個型號都標配SWM開關矩陣。
開關矩陣的功能有兩個:
-
把數字外設的輸入輸出功能自由地分配到指定的外部引腳。能夠自由分配外部引腳的功能稱為可移動功能。
-
使能或關閉模擬功能或需要特定電氣特性的功能,例如ADC和/或模擬比較器的輸入功能,晶體振蕩器的輸入輸出引腳,具有超快速模式的I2C0功能等。對于這些不能自由分配外部引腳的功能,稱為固定功能。
下面兩張表分別列出了所有可移動功能和固定功能,以及它們在各個系列中的配置情況。* 括號中為LPC81x的信號名稱。
表1 可移動功能一覽表
上表中列出了所有目前LPC800產品系列的可移動功能信號,可以看出這些信號全部是數字信號。右邊四列分別是各個系列的配置情況,數字代表所在行的信號在對應的系列中是可移動功能,編號的意義將在1.3節的應用例程中介紹;格中“-”表示對應的系列沒有這個信號。
I2C0_SDA和I2C0_SCL這兩個信號只在LPC81x中是可移動功能,在其它系列中都是不可移動的。LPC82x和LPC84x的其它I2C模塊,I2C1~3的信號是可移動功能信號。
這里需要注意的是,在LPC81x系列中,I2C0_SDA和I2C0_SCL這兩個信號是可移動的,但只有把它們安排在PIO0_10和PIO0_11引腳時,才能達到超高速(1Mbit/s),移動到其它的引腳時只能實現最高400 kbit/s的速率。
固定功能信號分兩類:數字信號和模擬信號;這樣的區分將涉及到信號間互聯的策略,本章后面的段落將討論這個策略。* 對應的信號與其它信號復用相同引腳。
表2固定功能一覽表
表2中右邊四列分別是各個系列的配置情況,數字代表所在行的信號在對應的系列中是否有該功能,編號的意義將在1.3節的應用例程中介紹;格中“-”表示對應的系列沒有這個信號。
每一個可移動功能,可以被分配使用任意一個引腳。而固定功能只能使用芯片指定的引腳。GPIO的輸出端口也只能使用芯片指定的引腳。
下面是LPC80x的可移動功能和固定功能列表,這個新的子系列的SWM寄存器排列與其它系列略有不同,但不會影響用戶的使用。
表3LPC80x可移動功能一覽表
* 對應的信號與其它信號復用相同引腳? ??表4LPC80x固定功能一覽表
另外,在LPC804中的PLU模塊共有6個輸入端和8個輸出端,它們也是可移動功能,但不能向其它可移動功能那樣可以被任意地分配到任一個引腳,每個PLU的輸入/輸出端分別只能在PINASSIGNFIXED0寄存器中被分配到3個引腳,如下表:
每個PLU的信號在PINASSIGNFIXED0寄存器中占據2個二進制控制位,具體配置方法請參考用戶手冊。
1.2 SWM模塊的內部構成1.2.1 模塊框圖
下面這個框圖來自LPC800的用戶手冊:
圖1.開關矩陣(SWM)框圖
這個圖全面地描繪了開關矩陣與各個內部外設、連接外部引腳的焊盤、GPIO模塊以及引腳中斷單元之間的關系。這張圖只畫出了一個外部引腳和與之對應的內部結構,其它引腳及內部結構和這張圖基本一樣;以LPC824封裝為HVQFN33的芯片為例,它有29個GPIO引腳,則其內部就有29套上圖這樣的電路。
對于某些不具備模擬功能的引腳,它們的片內結構將不包含上圖中的模擬部分(黃色區域)。
按照用戶手冊的功能描述,可以把LPC824的最大引腳封裝的開關矩陣,用圖2示意性地展現出來。這張圖清晰地展示了一個完整的開關陣列(矩陣)的結構;此圖只是一個幫助理解和記憶的示意圖,并不代表芯片內部的真實電路。圖中左邊一列的PIO0_0~PIO0_28表示外部引腳,而右邊一列的PIO0_0~PIO0_28表示GPIO模塊的內部輸出端。
圖2.LPC824的HVQFN33封裝內部開關矩陣完整示意圖
下面把SWM的功能分成三個組,分別進行介紹。(注:這里的分組只是為了方便說明,實際在芯片手冊中并沒有此類分組)
1.2.2 固定功能開關組
上圖左側以黃色標注的一組開關,可以稱它為固定功能開關組,每一個開關旁邊,都用黃字標示該開關對應的固定功能信號。這組開關中,在芯片復位后,多數開關默認為斷開固定功能與外部引腳的連接;但有三個信號特殊,在芯片復位后,SWDIO、SWCLK和RESETN對應的開關將這三個信號連接到外部引腳上。
另外PIO0_1對應的固定功能信號有一個模擬功能(ACMP_I2)和一個數字功能(CLKIN);PIO0_6、PIO0_14和PIO0_23,分別對應兩個固定功能模擬信號;這些信號的連接示意圖如下。
? ? ? 圖3.LPC824的復用固定功能模擬信號開關示意圖
▲固定功能開關組:決定需要把某個固定功能信號連接到對應的外部引腳,這組開關是一對一的;以LPC82x為例,表2列出了25個固定功能,其中有四對固定功能信號復用輸入引腳,因此共有25個固定功能開關。(注:LPC82x中最大配置的芯片有25個固定功能,其它芯片中固定功能則少于這個數目)
模擬的固定功能信號對應的開關是排他性的,當對應的模擬信號連接到外部引腳時,其它任何信號不能再連接到該引腳;數字的固定功能信號對應的開關,用于把使能的信號連接到對應的引腳,但不排斥其它可移動功能也連接到這個相同的引腳。
? ? ? ? ? ? ? ??圖4.固定功能開關組(模擬信號)示意圖
圖5.固定功能開關組(數字信號)示意圖
引腳使能寄存器0(PINENABLE0)中的每一位,對應圖4或圖5所示的一個開關。
圖2中部蘭色陰影框起來的部分,可以稱為可移動功能開關組。在這個縱橫矩陣中,每個交叉點都是一個開關;每列(縱向)只能有一個開關閉合;每行(橫向)可以有多個開關閉合;復位后所有開關默認為斷開。
▲可移動功能開關組:該組開關決定需要把某個可移動功能信號連接到哪個外部引腳。表1的第一列的每一個可移動功能,都對應這樣的可移動功能開關組;表1列出了48個可移動功能,也就是說芯片內部實現了48個這樣的開關組。(注:最大配置的芯片有48個可移動功能,其它芯片中可移動功能數目可參看表1)
圖6.可移動功能開關組(共48組)示意圖A
每個引腳分配寄存器0~11(Pin assign register)都有4個字節,每個字節控制上圖所示的一個可移動功能開關組,即每個引腳分配寄存器控制四個可移動功能信號的引腳分配。
圖7.可移動功能開關組(共48組)示意圖B
上圖是圖6的另一種畫法,虛線框起來的一組開關,由引腳分配寄存器的對應字節控制,任何時候,只能有一個開關閉合或所有開關斷開。
圖2右側以橘紅色標注的一組開關,稱為GPIO開關組。當其中任一開關閉合時,對應的GPIO輸出端口已固定功能開關的狀態,將有可能連接到外部引腳。當某個開關K所在行中有任意一個開關閉合時,這個開關K會自動斷開,很顯然這樣可以避免GPIO模塊的輸出與可移動功能信號相互沖突。
▲GPIO開關組:該組開關決定是否要把GPIO模塊的某個端口輸出到對應的引腳。
圖8.GPIO開關組示意圖
將GPIO模塊的某個端口的輸出連接到外部引腳的條件有兩個:一是沒有任何作為輸出的可移動功能分配到對應的引腳;二是沒有使能對應的固定功能,例如:如果要輸出GPIO模塊的PIO0_6信號,則應該關閉對應的固定功能ADC_1和VDDCMP。
從圖1可以看出,每個引腳都有兩個內部連接點(焊盤),分別處理數字信號和模擬信號;實際使用中,對IOCON(輸入輸出配置)模塊的設置決定數字焊盤的輸入輸出特性;而使用數字焊盤還是模擬焊盤與外部引腳相連接,則由開關矩陣決定;當在開關矩陣中使能了某個端口的固定模擬功能,則該外部引腳將使用模擬焊盤;其它情況下,不論引腳是分配了可移動的功能信號,還是固定功能的數字信號,或是GPIO的輸出端,該外部引腳都是對應數字焊盤的信號。
1.2.3 開關矩陣的使用特性
從圖2和以上的描述,可以總結出以下一些特性:
■一旦使能某個固定模擬功能時,該功能將占用對應的引腳,所有其它任何信號都不能使用該引腳。
■當使能某個固定數字功能信號時,其他的可移動數字信號,也可以被分配使用該引腳,即多個信號線在芯片內部是互通的。例如使能了CLKIN輸入功能后,還可以分配一個或多個SCT的輸入端至相同的引腳,這樣CLKIN信號也同時輸入至SCT中。
■如果某個引腳對應的固定功能未使能時,一個或多個可移動功能可以被分配使用該引腳;當沒有任何可移動功能使用該引腳時,對應的GPIO輸出端口將能夠取得該引腳的控制權。使用GPIO輸出功能時,需要關閉對應的固定功能并且沒有任何可移動功能使用對應的引腳。
■一個或多個可移動功能可以被分配使用相同的引腳,但其中只能有一個可移動輸出功能(包含雙向功能信號)。多個可移動輸入功能可以使用同一個引腳;例如多個SCT的輸入端可以使用同一個引腳,這樣可以用一個外部信號同步SCT的多組定時。
■當可移動輸入功能與某個可移動輸出功能被分配到同一個引腳時,這些輸入功能將接收前述輸出功能的信號。使用者可以用這個特性實現很多環回的操作;例如把USART的RXD和TXD信號通過此方式連接,實現自循環。
■不管引腳連接到哪種數字功能信號(固定數字功能、可移動功能或GPIO模塊),GPIO模塊的輸入端都始終與它對應的引腳連接,GPIO輸入寄存器將反映引腳的數字電平狀態。
■當任意模擬信號被分配使用外部引腳,該引腳的模擬焊盤被使能,同時數字焊盤將被斷開。
■當任意數字輸出信號被分配到外部引腳,該引腳的數字焊盤被使能。
■只要引腳的數字焊盤被使能(未斷開),對應的引腳中斷就會有輸入信號,即該引腳的輸入信號(如果被使能的話)將可能觸發引腳中斷。
下面這個簡單的流程圖,以另一種方式描述了開關矩陣的用法。圖9.開關矩陣的使用
1.3 開關矩陣的應用例程下面將以兩個例子展示如何使用開關矩陣:
第一個例子是使用SCT在板載LED燈上實現一個呼吸燈(SCT的呼吸燈不是本章重點,將不做注解),然后通過改變開關矩陣的設置,實現一組LED燈的輪流顯示。
第二個例子是使用LPC824的開關矩陣,把芯片上的兩個USART模塊進行對接,實現一發一收而不需片外連線。
1.3.1 設置開關矩陣的函數
開關矩陣的設置是通過一組32位寄存器PINASSIGN[n],和一個32位寄存器PINENABLE0實現。
寄存器PINENABLE0中的每一位,是對應的固定功能的使能位,即圖4或圖5中的一個開關;表2最右邊三列中的數字,分別是每個系列中各個固定功能信號使能位在寄存器PINENABLE0中的索引號。
對于PINASSIGN[n] 寄存器組,我們把它相像成一個字節數組,每個字節對應圖6或圖7所示的一個可移動功能開關組,即每個字節對應一個可移動功能,這個字節中填寫的內容就是該功能被分配到的引腳編號。表1最右邊三列中的數字,分別是每個系列中各個可移動功能信號,在上述字節數組中的索引號。例如在LPC82x和LPC83x系列中,功能SCT_OUT0的索引號是31,由于每個PINASSIGN寄存器里有四個字節,所以SCT_OUT0的配置字節是PINASSIGN[7]的第三個字節,即位24~31,如下圖:
讀者可以方便地使用下面這個函數設置可移動功能信號。
代碼片段1.置可移動功能信號引腳的函數
這個函數簡化了SWM寄存器的配置,以后會經常用到。
1.3.2 設置開關矩陣簡例
■例1:使能I2C0的兩個信號。
在LPC82x和LPC83x中,I2C0的兩個信號是固定功能,需要使用PINENABLE0使能,分別使用P0_11和P0_12兩個引腳:在LPC81x中,I2C0的兩個信號是可移動功能,可以使用上一節的函數設置引腳分配。
■例2:使能CLKIN輸入功能,同時把這個信號作為所有SCT的輸入。這個例子演示了把多個可移動功能分配至同一個引腳,同時使能這個引腳的固定功能。
引腳P0_1是固定功能CLKIN對應的引腳,使能CLKIN后P0_1即成為它的輸入引腳,再把所有SCT的輸入端也分配使用這個輸入腳,這樣輸入信號也同時同步地導入至所有SCT的輸入端。
1.3.3 通過開關矩陣實現呼吸燈的輪轉
在LPC824-Lite開發板上共有八個LED燈,這部分線路圖如下:
從上圖中可以看出,八個LED燈分別連接到MCU的P0_7、13、16、17、19、27、28、18引腳上。
本例程使用LPC824的SCT產生一個PWM波形,當這個PWM信號輸出到某個LED時,對應的LED就會忽明忽暗地顯現呼吸燈的效果。例程中通過開關矩陣(SWM),在不改變任何SCT配置的情況下,實現輪流逐個點亮LED燈的效果。在此基礎上,通過變換GPIO輸出,實現另一個LED燈的閃爍。
本例程可以讓讀者體會到,在不改變信號源的配置的情況下,僅改變SWM的配置即可改變信號的輸出引腳;作為對比,GPIO的輸出是不能通過開關矩陣改變輸出引腳的,LED燈的閃爍操作則必須通過改變對應的GPIO輸出狀態,才能改變輸出引腳的狀態。
下圖是SCT的PWM波形輪流輸出至八個LED燈的示意圖。
圖10.輪流輸出PWM信號至八個LED燈的示意圖
為了實現呼吸燈的效果,即LED燈逐漸地由暗變亮,再逐漸地由亮變暗,需要控制輸出PWM波形的占空比,從100%(全滅)逐漸減少至0%(全亮),再從0%逐漸增加到100%。
本例程使用SysTick和幾個全局變量控制PWM占空比的改變和時序。
代碼片段2.SysTick中斷處理函數——改變PWM占空比
SysTick的中斷處理函數的操作非常簡單,每次進入都會改變輸出占空比;改變的速度快慢是由SysTick的設置決定。
下面代碼就是主程序部分。
代碼片段3.開關矩陣實現呼吸燈輪轉主程序
初始化完所有用到的資源后,在主循環中有兩個操作,其一是當SCT輸出的占空比達到100%,轉換SCT輸出的外部引腳,實現呼吸燈的輪轉;其二是使用GPIO輸出控制另一個LED燈的閃爍。
數組LED_Pins[8],是為了方便程序輪流操作八個LED燈;數組中存放了每個燈對應的引腳編號。
用GPIO輸出,實現LED燈閃爍的實現代碼如下。
代碼片段4. GPIO實現LED燈閃爍
函數Toggle_LED_Pins()的作用就是定時變換LED燈的亮或滅,實現閃爍的效果。該函數以呼吸燈信號的占空比為定時依據,實現LED循環閃爍:
上述LED_On和LED_Off是兩個宏定義,直接控制GPIO輸出端口的狀態:
#define LED_On(led) LPC_GPIO_PORT->CLR0 = (1<<(led))
|
|
#define LED_Off(led) LPC_GPIO_PORT->SET0 = (1<<(led))
|
1.3.4 兩個USART模塊對接
這個實例演示了通過開關矩陣實現片內外設模塊的互連,完成互相通信。
LPC800的每個USART模塊都可以實現同步的串行傳輸,即比普通的異步傳輸多一條時鐘信號線。本實例配置USART1作為發送方,配置USART2作為接收方,需要分別連接三個信號線,如下圖:
通過開關矩陣的配置,上述連接可以在芯片內部直接實現。如果不需要連接其它外設,用戶不必再對開發板進行任何改動。
下圖是開關矩陣的配置代碼, USART1和USART2的初始化代碼和通信的測試代碼不在此說明。 代碼片段5.為USART1和USART2配置輸入輸出引腳
讀者在運行這個例程時,可以嘗試更改上述06~11行代碼,分別把USART1和USART2的三個信號配置到不同的引腳,然后再在開發板上把對應的信號短接,以此體會開關矩陣在內部信號互連的特點。
在實際的項目開發中,用戶可以使用開關矩陣的這一特性,配置本項目中沒有用到的片內模塊,對那些對外通信的模塊實行適當的監測,在不干擾正常通信并且不增加任何外部硬件的情況下,提供更多的調試跟蹤手段。
1.4注意事項
開關矩陣的使用相當簡單,但有以下幾點需要注意的:
1. 配置開關矩陣時,必須先打開SWM的時鐘,配置完成后,可以關閉SWM的時鐘節省功耗。
2. 不能把多于一個的輸出功能或雙向功能信號,分配至同一個引腳上。
3. 只要引腳不是模擬功能,不管是輸出功能還是輸入功能,對應的GPIO輸入端始終連接到引腳,這樣通過GPIO端口隨時可以讀出引腳的電平狀態。同時,如果在SYSCON中選擇了該端口作為中斷觸發源,該引腳將可能觸發中斷,尤其當該引腳為數字輸出功能時,芯片內部的輸出信號也會觸發中斷。
通過開關矩陣SWM能夠實現一個輸出對多個輸入信號的鏈接,這是通過把輸出信號送到引腳上,再通過引腳的輸入端口“穿回”到芯片內部。如果選擇了模擬信號,那么只有模擬信號送到引腳上,數字信號不能送到引腳上,否則就會干擾模擬信號。而且這時候數字輸入的那部分也是關閉的。如果不是最大封裝,那些沒封出來的引腳是可以用來做這種穿回,來實現內部信號互聯。
END
更多恩智浦AI-IoT市場和產品信息,邀您同時關注“NXP客棧”微信公眾號
? ? ?NXP客棧
恩智浦致力于打造安全的連接和基礎設施解決方案,為智慧生活保駕護航。
長按二維碼,關注我們
恩智浦MCU加油站
這是由恩智浦官方運營的公眾號,著重為您推薦恩智浦MCU的產品信息、開發技巧、教程文檔、培訓課程等內容。
長按二維碼,關注我們
原文標題:LPC800前生今世 第六章-開關矩陣(SWM: Switch Matrix)
文章出處:【微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
-
mcu
+關注
關注
146文章
17123瀏覽量
350994 -
恩智浦
+關注
關注
14文章
5857瀏覽量
107321
原文標題:LPC800前生今世 第六章-開關矩陣(SWM: Switch Matrix)
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論