本帖最后由 不语arc 于 2025-2-10 20:01 编辑
1.LPUART资源
MCXA156微控制器拥有五个低功耗通用异步收发器(LPUART)模块:LPUART0、LPUART1、LPUART2、LPUART3和LPUART4。然而,FRDM-MCXA156开发板仅支持与LPUART0、LPUART1和LPUART2模块之间的通信。下图展示了FRDM-MCXA156的LPUART结构图。
LPUART0模块被称为MCU-Link,可以作为USB到UART桥使用,通过虚拟通信(VCOM)端口调试MCXA156。
LPUART1是一个拥有8个位置的mikroBUS插座连接器,允许插入的mikroBUS click板通过UART连接与MCXA156 MCU进行通信。
LPUART2是一个双排各8个位置的Arduino插座连接器,允许插入的Arduino板通过UART连接与MCXA156 MCU进行通信。
因此选择开发板预留的LPUART0作为串口接口。
2. 代码配置
导入SDK中的frdmmcxa156_lpuart_polling 工程作为基准。
2.1 配置的初始化结构体 lpuart_config_t:
/*! @brief LPUART configuration structure. */
typedef struct _lpuart_config
{
uint32_t baudRate_Bps; /*!< LPUART baud rate */
lpuart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */
lpuart_data_bits_t dataBitsCount; /*!< Data bits count, eight (default), seven */
bool isMsb; /*!< Data bits order, LSB (default), MSB */
#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT
lpuart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */
#endif
#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO
uint8_t txFifoWatermark; /*!< TX FIFO watermark */
uint8_t rxFifoWatermark; /*!< RX FIFO watermark */
#endif
#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT
bool enableRxRTS; /*!< RX RTS enable */
bool enableTxCTS; /*!< TX CTS enable */
lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */
lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */
#endif
lpuart_idle_type_select_t rxIdleType; /*!< RX IDLE type. */
lpuart_idle_config_t rxIdleConfig; /*!< RX IDLE configuration. */
bool enableTx; /*!< Enable TX */
bool enableRx; /*!< Enable RX */
} lpuart_config_t;
关键参数:
-
baudRate_Bps:指定LPUART的波特率,即每秒传输的比特数。
-
parityMode:定义了奇偶校验模式,可以是无校验(默认)、偶校验或奇校验。
-
dataBitsCount:指定了数据位的数量,默认为8位,也可以设置为7位。数据位是实际传输的数据部分。
-
isMsb:确定数据位的顺序,最低有效位(LSB)优先(默认),或者最高有效位(MSB)优先。这决定了数据在传输线上的排列顺序。
-
enableTx / enableRx:布尔值,用于分别启用或禁用发送和接收功能。
2.2 核心函数:开发板发送数据
传入参数: LPUART 外设基地址的指针、写入的数据起始地址、数据的大小(以字节为单位)
status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length)
{
assert(NULL != data);
const uint8_t *dataAddress = data;
size_t transferSize = length;
#if UART_RETRY_TIMES
uint32_t waitTimes;
#endif
while (0U != transferSize)
{
#if UART_RETRY_TIMES
waitTimes = UART_RETRY_TIMES;
while ((0U == (base->STAT & LPUART_STAT_TDRE_MASK)) && (0U != --waitTimes))
#else
while (0U == (base->STAT & LPUART_STAT_TDRE_MASK))
#endif
{
}
#if UART_RETRY_TIMES
if (0U == waitTimes)
{
return kStatus_LPUART_Timeout;
}
#endif
base->DATA = *(dataAddress);
dataAddress++;
transferSize--;
}
/* Ensure all the data in the transmit buffer are sent out to bus. */
#if UART_RETRY_TIMES
waitTimes = UART_RETRY_TIMES;
while ((0U == (base->STAT & LPUART_STAT_TC_MASK)) && (0U != --waitTimes))
#else
while (0U == (base->STAT & LPUART_STAT_TC_MASK))
#endif
{
}
#if UART_RETRY_TIMES
if (0U == waitTimes)
{
return kStatus_LPUART_Timeout;
}
#endif
return kStatus_Success;
}
LPUART_WriteBlocking
函数是一个用于通过 LPUART 模块发送数据的阻塞式写入函数。它通过轮询(polling)的方式等待 LPUART 发送寄存器为空或 TX FIFO 有空间,然后将数据写入到发送缓冲区,并继续等待直到所有数据都被发送出去。
3.上位机vofa+
vofa+上位机功能丰富、界面高级,而且免费 ,非常推荐。
vofa+有多种发送格式,具体如下:
RawData 协议,适用于那些不需要解析数据、仅仅查看字节流的需求。在这种模式下,VOFA+ 充当一个普通的串口助手,接收到的数据会直接显示出来。
FireWater 协议,是一种非常直观简洁的与 VOFA+ 上位机通信的协议。它的设计灵感来源于 CSV(逗号分隔值)文件格式,通过将print函数重定向即可直接使用,注意数据之间用逗号隔开,并且每帧数据后加上换行符。这种协议非常适合用于打印出简单的数值型数据,并在 VOFA+ 中绘制动态曲线图。
JustFloat 协议,是专门针对需要高效传输大量浮点数数据的情况设计的。该协议采用小端浮点数组的形式进行字节流传输,这样可以节省带宽并且保持较高的准确性。每个数据包后面通常附有一个特定的帧尾标志来标识数据包的结束。
我使用JustFloat发送格式,只需要在包尾发送对应的tail[4]{0x00,0x00,0x80,0x7f}即可上传多个通道的数据。
发送函数:void vofa_JustFloat_output(float s1,float s2,float s3,float s4)
{
float data[4];
uint8_t tail[4] = {0x00,0x00,0x80,0x7f};
//发送数据
data[0] = s1;
data[1] = s2;
data[2] = s3;
data[3] = s4;
LPUART_WriteBlocking(DEMO_LPUART,(uint8_t*)data,sizeof(float)* 4); //发送数据
//发送帧尾
LPUART_WriteBlocking(DEMO_LPUART,tail,4);
}
4.应用函数测试
编写4个正弦方程测试函数,每个变量的步长随意。
void vofa_FireWater_output_test (void)
{
static float t1 = 0;
static float t2 = 0;
static float t3 = 0;
static float t4 = 0;
vofa_JustFloat_output(sin(t1), cos(t2),sin(2*t3), cos(2*t4));
t1 = t1+0.1;
t2 = t2+0.2;
t3 = t3+0.5;
t4 = t4+0.3;
}
在while(1)中测试
while (1)
{
vofa_FireWater_output_test();
for(ch=0xffff;ch>0;ch--); //延时
}
在vofa+软件中,拖拽xy轴到显示界面,右键选择y轴,再点击all,即可看到四个波形。
选择0.1的步长,可以发现生成的四条正弦波很标准!
总结,LPUART模块非常方便,验证成功