在线时间1365 小时
UID3338155
注册时间2017-7-26
NXP金币1653
TA的每日心情 | 奋斗 4 小时前 |
---|
签到天数: 595 天 [LV.9]以坛为家II
金牌会员
- 积分
- 7072
- 最后登录
- 2024-4-28
|
本帖最后由 andeyqi 于 2024-1-8 18:24 编辑
关于LPC 系列的 SWM IP功能描述论坛有详细的介绍的帖子(LPC800前生今世 第六章-开关矩阵(SWM: Switch Matrix)),我们基于这篇文档的基础上进行试验,参考官方的(How to Set Up LPC860 Switch Matrix Demo)文件,在LPC860的板子上验证SWM功能。以下为swm IP的框图。
实验方法:
配置uart0分别映射到P0_24/PO_25 及P1_16/P1_17这组GPIO端口 ,基于之前实现的RT-thread(【LPC860-max板卡试用】rt-thread 最小系统适配) 的基础上,添加swm 命令用于触发swm 切换uart0的输出pin脚,实现串口的切换,期待切换成功后在新切换的串口上输出信息。
- #include <rtdevice.h>
- #include <board.h>
- #include <drivers/pin.h>
- #include "fsl_common.h"
- #include "fsl_gpio.h"
- #include "fsl_iocon.h"
- #include "fsl_swm.h"
- #include "pin_mux.h"
- static void _swm_cmd(int argc, char *argv[])
- {
- static int i = 0;
-
- /* Enables clock for switch matrix.: enable */
- CLOCK_EnableClock(kCLOCK_Swm);
-
- if(i%2 == 0)
- {
- /* USART0_TXD connect to P1_17 */
- SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_24);
- /* USART0_RXD connect to P1_16 */
- SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_25);
- }
- else
- {
- /* USART0_TXD connect to P1_17 */
- SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17);
- /* USART0_RXD connect to P1_16 */
- SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16);
- }
-
- /* Disable clock for switch matrix. */
- CLOCK_DisableClock(kCLOCK_Swm);
-
- i++;
- rt_kprintf("swm check done.\n");
- }
- MSH_CMD_EXPORT_ALIAS(_swm_cmd, swm, swm [option]);
复制代码
添加swm测试命令,在当前终端输入swm 命令后,期待切换终端窗口,并打印"swm check done." 日志,运行结果如下,已经按照期待的方式进行端口切换了。
实验方法:
将P1_17 分别映射到UART0的TXD 及 URAT1 的RXD 功能,这样形成本地回环UART0 输出的数据接到URAT1 ,然后UART1打印输出接收到的数据,期待两个串口输出一致。
初始化时配置串口如下:
添加uart1测试命令初始化uart1,然后在uart1 接收中断中输出接收到的数据回显输出,测试代码如下:
- status_t shell_uart_init(void)
- {
- usart_config_t usartConfig;
- status_t status;
- /* Select the main clock as source clock of USART0 (debug console) */
- CLOCK_Select(kUART1_Clk_From_MainClk);
- RESET_PeripheralReset(kUART1_RST_N_SHIFT_RSTn);
- /* config usart struct */
- USART_GetDefaultConfig(&usartConfig);
- usartConfig.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE;
- usartConfig.parityMode = kUSART_ParityDisabled;
- usartConfig.stopBitCount = kUSART_OneStopBit;
- usartConfig.enableRx = true;
- usartConfig.enableTx = true;
- /* init usart */
- status = USART_Init(USART1, &usartConfig, BOARD_DEBUG_USART_CLK_FREQ);
- if (kStatus_Success != status)
- {
- return status;
- }
- /* enable usart rx interrupts */
- USART_EnableInterrupts(USART1, kUSART_RxReadyInterruptEnable | kUSART_RxNoiseInterruptEnable);
- NVIC_EnableIRQ(USART1_IRQn);
-
- return status;
- }
- void USART1_DriverIRQHandler(void)
- {
- uint8_t data = 0;
- if(USART_GetStatusFlags(USART1)&kUSART_RxReady)
- {
- data = USART1->RXDAT;
- USART_WriteBlocking(USART1,(uint8_t *)&data,1);
- }
- }
- static void uart1init(int argc, char *argv[])
- {
- shell_uart_init();
- rt_kprintf("uart1 init.\n");
- }
- MSH_CMD_EXPORT_ALIAS(uart1init, uart1, swm [option]);
复制代码烧写验证查看是否符合预期:
输入uart1 命令后两个串口输出保持一致,从而验证swm 路由功能符合预期。
|
|