大联大
直播中

赖嘉宁

7年用户 178经验值
私信 关注
[经验]

浅析LPC82X开关矩阵

LPC82x 系列是基于 NXP 推出的 LPC800 系列里面非常典型的基于 ARM Cortex-MO+ 的低成本 32 位 MCU,其应用广泛,工作频率可高达 30MHz。尤其 LPC82X 灵活的外设功能 – 开关矩阵 更是让其在市场具有了更大的优势。
开关矩阵(Switch Matrix)是 NXP 公司新推出的在 MCU 中集成的一个非常有特色的外设功能,通过开关矩阵可以将芯片内部所有数字外设功能引脚分配到除电源、地之外的任意引脚,从而提高了设计的灵活性。
一、开关矩阵简介

        开关矩阵功能示意图如下:

        

        可分配的功能包括:
                UART、SPI、I2C、SCT、比较器输出、CLKOUT、逻辑匹配输出
                特定功能引脚仅可被管理(不能被分配):
                外部晶振引脚、比较器输入口、ADC 采样、复位口、SWD 调试接口、GPIO 口

1、LPC82x 开关矩阵优势   
        数字外设可以根据需要分配到芯片其它引脚,因此将大大简化用户的设计。即:
        (1) 系统硬件设计时,以外围器件布局及 PCB 布局为主导,不用考虑信号的管脚位置,帮助缓解 PCB 走线拥挤,降低开发成本;
        (2) 更换系统外围器件或主控制器时,避免更改硬件设计,降低维护成本;
        (3) 解决原理图设计错误在原理图管脚功能设计有误的情况下,可以通过软件重新分配外设功能
        (4) 合理的情况下分配多个外设功能到指定的管脚。
        下面我们以实际应用中一个小案例来实际体验一下 SWM 的特点。


        如图下图所示:
        a 图中:MCU 驱动 SPI Flash 应用威廉希尔官方网站 ,但是可以发现此威廉希尔官方网站 设计错误,SPI Flash 的 MOSI/MISO 引脚和 MCU 对应引脚应该直接相连,而实际威廉希尔官方网站 中采用交叉连接,因此该威廉希尔官方网站 无法直接使用。
        如果图 a 中的 MCU 是 LPC824,则可以灵活的通过 SWM 来实现 SPI 外设引脚功能信号的重新分配,不用重新设计硬件而解决问题。
        
2、LPC82x 开关矩阵在芯片上的位置
        (1) 开关矩阵可以管理以下外设 GPIO
                   ① SCT 定时器
                   ② SPI
                   ③ I2C
                   ④ UART
        (2) 开关矩阵配置好后,不需要时钟源
        


3、LPC82x 开关矩阵功能框图

        

4、LPC82x 配置多种外设功能到同一个管脚
        初始化分配好后,在接下来的程序中仍然可以修改开关矩阵的配置。
        多种输入功能分配到一个管脚最优的解决方式是根据用户的需求分时切换不同的功能到指定的 I/O 管脚。
        


        多项输出功能分配到一个管脚开关矩阵是一组复用的逻辑关系。
        许多路信号驱动一个输出缓冲,如果使能了多组输出到一个管脚,则信号会被混合在一起。
        
二、开关矩阵的配置及寄存器
1、设置开关矩阵的主要步骤:

        

2、LPC82x 开关矩阵基础设置
      (1) 在默认状态下,只有 RESET 和串口 0 被分配到了对应的管脚上。
            与调试无关的引脚,在默认状态下均为 GPIO。
            在配置 I/O 管脚上的功能前,需要通过 PINENABLE0 寄存器先禁用,然后再分配功能。
            一旦 I/O 管脚被设置为 ADC 功能,则对应的数字功能自动从该管脚上移除。
      (2) 在配置开关矩阵的寄存器时,是需要打开系统时钟的。
            在设置完开关矩阵后,关闭其时钟源可以降低系统的功耗
            锁住 I/O 配置可以保护设置
            SYSAHBCLKCTRL(第 7 位)中矩阵开关时钟的控制位
     (3) 在使能或者使用外设前,需要先通过设置 PINASSIGN[0:11] 寄存器配置好外设对应的管脚。
     (4) 注意:如果分配外设功能到 SWD 相关的引脚,会禁用 SWD 功能。


3、LPC82x 管脚分配寄存PINASSIGN[0:11]
        配置外设功能连接到对应 I/O 管脚
        CMSIS 标准函数名称: LPC_SWD->PINASSIGNn
        LPCOPEN API 名称: Chip_SWM_MovablePinAssign
        


        特定功能可通过该寄存器禁用或使能并连接到特定的 I/O 管脚
        CMSIS 标准函数名称:LPC_SWD->PINENABLE0
        LPCOPEN API 名称: Chip_SWM_EnableFixedPin
        
三、开关矩阵图形配置工具

        开关矩阵的配置非常简单易用!用户可以使用图形界面工具生成配置文件,或者手工通过软件配置。
        通过以下链接下载 LPC82x 开关矩阵图形配置工具
        开关矩阵配置工具,支持网页版,Windows,Linux 和 MAC
        https://www.nxp.com/pages/lpc-initialization-tool:LPC-INITIALIZATION-TOOL?tab=Design_Tools_Tab

        


        第一步:选择对应封装的器件,选择完器件/封装后,会显示管脚默认分配的功能。

        
        
        第二步:点击“Focal Peripheral”选择需要配置的外设,这里我们以 USART1 功能为例,选择好外设后,会弹出需要定义的功能。
        
        第三步:鼠标选择需要配置的引脚功能(选中后,功能绿色方格会变成橙色)。然后,鼠标选择需要分配到的 I/O 管脚,即可。这里,以 USART1_RXD 功能分配到 PIO0_14 为例。
        
        第三步也可以先选择需要设置的管脚,然后在这里,以 USART1_RXD 功能分配到 PIO0_14 为例。
        
        此时,U1_RXD 功能引脚就被分配到原先的 PIO0_14 的位置。


        第四步,按照前述步骤三,分配好用户所需要的功能。



        若需要删除分配的功能,则点击对应管脚上的“X”图标即可。


      
        用户选择“SWM.C”对话框后,可以找到最终生成的初始化程序,直接复制到用户的代码中并调用即可配置好开关矩阵。
        别忘了关闭开关矩阵的时钟源,以降低系统耗!
        Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM)
        提示:为了降低功耗,用户在配置完开关矩阵后可以关闭其时钟源



四、开关矩阵手动配置
        接下来是介绍手工配置开关矩阵。开关矩阵相关寄存器比较简单,PINASSIGN[0:11] 寄存器组和 PINENABLE0 寄存器;此外,用户还需要配置 SYSAHBCLKCTRL 的第 7 位使能和禁用开关矩阵。
        我们以配置 PIO0_0 为 U2_TXD 和 PIO0_19 位 U2_RXD 为例:


        第一步:找对对应功能的 PINASSIGN[0:11] 寄存器。
        本例,U2_TXD 和 U2_RXD 均对应 PINASSIGN2。
        
        
        第二步:根据需要分配的 I/O 管脚,设置 PINASSIGN[0:11] 寄存器。
        
        配置 PINASSIGN2 寄存器如下:
                LPC_SWM->PINASSIGN2=(LPC_SWM->PINASSIGN2& ~(0xFF<<16)) | (0<<16); //P0.0 = U2TxD0
                LPC_SWM->PINASSIGN2=(LPC_SWM->PINASSIGN2& ~(0xFF<<24)) | (1<<24); //P0.1 = U2RxD0
       最终配置源码:
                Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); // 打开开关矩阵时钟源
                LPC_SWM->PINASSIGN2=(LPC_SWM->PINASSIGN2& ~(0xFF<<16)) | (0<<16); // 设置P0.0 = U2TxD0
                LPC_SWM->PINASSIGN2=(LPC_SWM->PINASSIGN2& ~(0xFF<<24)) | (1<<24); // 设置P0.1 = U2RxD0
                Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); // 关闭开关矩阵时钟源

更多回帖

发帖
×
20
完善资料,
赚取积分