总体概述
开关矩阵顾名思义就是一个由多个,甚至多组开关组成的阵列,这个阵列的目的就是把片内外设的输入输出信号线,按照用户的意向,通过编程连接到特定的外部引脚上。
开关矩阵可以为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开关矩阵。
开关矩阵的功能有两个:
下面两张表分别列出了所有可移动功能和固定功能,以及它们在各个系列中的配置情况。* 括号中为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寄存器排列与其它系列略有不同,但不会影响用户的使用。
表3 LPC80x可移动功能一览表
* 对应的信号与其它信号复用相同引脚 表4 LPC80x固定功能一览表
另外,在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加油站】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !