串口shell交互在现在程序里也扮演重要作用如无线模块的射频参数校准,本文就以UART来进行简易交互。
一、工程初始化
首先要清楚UART模块必然会有Port、DIO、UART、IntCtrl,故新建工程后逐个来配置。打开《S32K3xx Reference Manual》在左侧目录书签的附件栏可以看到很多有用Excel表格,在其中找到《S32K312_IOMUX.xlsx》,

翻看原理图可以看到PTC2是LPUART0_RX,PTC3是LPUART0_TX或者查看IOMUX表格的“S32K312 Pinout”页,切到Pins页进行方向、功能配置,也可把标签改个名字,

切到外设页,需要添加DIO、UART、IntCtrl模块即第一功能、第二复用功能、中断配置项,在外设页组件栏,配置Port的属性因为有两个引脚需要在PortContainer下PortPin依次添加两项,而关键管脚编号Mscr需要查IOMUX表格的“S32K312_IO Signal Table”页,可以查看到PTC2是SIUL_MSCR66,PTC3是SIUL_MSCR67,

故在Port组件栏也是如此配置第一功能LPUART0_TX和LPUART0_RX DIO口,

然后就是类似STM32程序一样开始配置第二复用功能UART包括波特率、校验、字长、停止位数等,

然后就是类似STM32的NVIC中断矢量配置,因为PTC2和PTC3属于LPUART0,故中断矢量类型是LPUART0_IRQ0,ISR对应也设成LPUART_UART_IP_O_IRQHandler,

做完这些就可以更新生成源码了。
二、编码测试
在工程下面生产了很多配置源码,主要用到RTD接口如下:
rtd/src:clock_ip.c:Clock_Ip_Init
rtd/src/lpuart_uart_ip.c:Lpuart_Uart_Ip_Init/Lpuart_Uart_Ip_AsyncSend/Lpuart_Uart_Ip_AsyncReceive
rtd/src/intctrl_ip.c:IntCtrl_Ip_Init
rtd/src/siul2_port_ip.c:Siul2_Port_Ip_Init
rtd/src/siul2_dio_ip.c:Siul2_Dio_Ip_TogglePins
在main.c 添加以下代码:
#include "Mcal.h"
#include "Lpuart_Uart_Ip.h"
#include "Lpuart_Uart_Ip_Irq.h"
#include "Clock_Ip.h"
#include "IntCtrl_Ip.h"
#include "Siul2_Port_Ip.h"
#include "string.h"
uint8 TX_Buffer[]="Hello S32K312!\r\n";
uint8 RX_Buffer[50];
#define UART_LPUART0_INTERNAL_CHANNEL 0
volatile int exit_code = 0;
int main(void)
{
/* Write your code here */
uint16 len=0;
Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals,g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);
IntCtrl_Ip_Init(&IntCtrlConfig_0);
Lpuart_Uart_Ip_Init(UART_LPUART0_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_0);
Lpuart_Uart_Ip_AsyncSend(UART_LPUART0_INTERNAL_CHANNEL,TX_Buffer, sizeof(TX_Buffer));
//Lpuart_Uart_Ip_AbortSendingData(UART_LPUART0_INTERNAL_CHANNEL);
for(;;)
{
Lpuart_Uart_Ip_AsyncReceive(UART_LPUART0_INTERNAL_CHANNEL,RX_Buffer,20);
if(strcmp((char *)RX_Buffer,"chip")==0)
{
len=sizeof("S32K312");
memcpy(TX_Buffer,"S32K312",len);
Lpuart_Uart_Ip_AsyncSend(UART_LPUART0_INTERNAL_CHANNEL,TX_Buffer, len);
Lpuart_Uart_Ip_AbortReceivingData(UART_LPUART0_INTERNAL_CHANNEL);
memset(RX_Buffer,0,sizeof(RX_Buffer));
}
if(strcmp((char *)RX_Buffer,"fac")==0)
{
len=sizeof("NXP");
memcpy(TX_Buffer,"NXP",len);
Lpuart_Uart_Ip_AsyncSend(UART_LPUART0_INTERNAL_CHANNEL,TX_Buffer, len);
Lpuart_Uart_Ip_AbortReceivingData(UART_LPUART0_INTERNAL_CHANNEL);
memset(RX_Buffer,0,sizeof(RX_Buffer));
}
}
return exit_code;
}
然后还是按照第1篇环境搭建教程所说点击编译再仿真就能看到实际运行效果,如输入“chip”,S32K312回复“S32K312”,输入“fac”,S32K312回复“NXP”等等类似,

此文章来自“S32K312 开发板评测活动”测评者:明祥軍
欢迎在博文下方留言评论,我们会及时回复您的问题。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:WPIg
NXP S32K312 RTD LLD串口简易操作

231

被折叠的 条评论
为什么被折叠?



