前言
收到板子了,盒子的扣子费了点力气打开,打开一看,扑面而来的高级感,拿到手上可以感觉到分量很足,所有元件又整齐又紧凑,底部还有四个塑料柱子支撑防滑防静电,拿上附带的typec线立马插上电点个灯试试先
由于板子缺少了cherryusb必须的一些配置文件,所以需要做一点适配,适配的内容已经提交pr了,不久后应该就能直接用了,所以本文主要演示下FRDM-MCXA156使用cherryusb实现虚拟串口,通过串口可以发数据给虚拟串口
FRDM-MCXA156开发板介绍


FRDM-MCXA156开发板基于 Arm® Cortex®-M33 核心,提供高达 1MB 的闪存 和 128KB 的 RAM,其中还包括 8KB 的 ECC 内存保护
同时支持CAN-FD, FlexIO, FS USB, I3C, LPLUART, LPSPI, LPI2C, DMA 和 LDO,支持板载的CMSIS-DAP以及JTAG/SWD
其中板子还带有一个精度为±0.5°C的精确温度传感器
开发环境
RT-Thread源码: https://github.com/RT-Thread/rt-thread
RT-Thread Env工具: https://www.rt-thread.org/download.html
官方教程文档:NXP FRDM-MCXA156
教程
- 打开env,来到bsp\nxp\mcx\mcxa\frdm-mcxa156目录下输入menuconfig回车


- 按照图片选项配置(其中USB Device Speed也可以用FS全速模式)

按下ESC返回,直到提示保存,按下Y
这样就配置好了
输入scons —target=mdk5
用keil打开该bsp下的project.uvprojx
虚拟串口发送数据到串口需要修改下代码
来到cdc_acm_template.c,修改成以下函数代码(去掉原本的注释,换成红色部分的代码)


然后来到cherryusb.c中

粘贴以下代码,这段实现的功能是让虚拟串口发送数据到终端串口(其中的buffer带了cache可能会有点问题,这里仅作为演示)
#include <rtthread.h>
#include <board.h>
#include "stdio.h"
#include "usb_dc.h"
#include "usb_config.h"
#include "usb_util.h"
#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM
#define CDC_IN_EP 0x81
#define CDC_OUT_EP 0x02
#define CDC_INT_EP 0x83
extern volatile bool ep_tx_busy_flag;
/* Register the EMAC device */
static int rt_hw_stm32_cherryusb_cdc_init(void)
{
extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base);
cdc_acm_init(0, 0x400A4000u);
return 0;
}
INIT_COMPONENT_EXPORT(rt_hw_stm32_cherryusb_cdc_init);
void cdc_acm_data_send(char *format, ...)
{
uint8_t str[2048];
uint32_t str_len;
va_list arg;
va_start(arg, format);
vsprintf(str, format, arg);
va_end(arg);
str_len=strlen(str);
ep_tx_busy_flag = true;
usbd_ep_start_write(0, CDC_IN_EP, str, str_len);
while (ep_tx_busy_flag) {
}
}
static int cherry_usb_cdc_send(int argc, char *argv[])
{
char str[100];
if (argc == 2)
{
rt_strncpy(str, argv[1], 100);
rt_kprintf("%s",str);
extern void cdc_acm_data_send(char *format, ...);
cdc_acm_data_send("%s\r\n",str);
}
}
MSH_CMD_EXPORT(cherry_usb_cdc_send, send the cdc data for test)
#endif
按照图片的步骤编译烧写程序到板子上

最后按下开发板的复位即可开始运行程序,板子上的USB FS就是虚拟串口,连接到电脑上
运行结果
将板子上的USB FS通过type-c线连接到电脑上,随着一声清脆的叮咚,就可以看到串口被正常识别到了

打开2个串口助手或者XCOM,一个选择板子的调试串口,一个选择虚拟串口
串口终端输入cherry_usb_cdc_send+文本可以发送数据到虚拟串口,反过来直接在虚拟串口发送文本也可以传到串口终端
可以看到两个串口助手之间可以互相传输数据
注意:通过串口终端发送数据前需要先连接虚拟串口,不然会异常

结语
在代码中可以这样调用虚拟串口打印数据,cdc_acm_data_send就类似于printf
extern void cdc_acm_data_send(char *format, ...);
cdc_acm_data_send("Hello World\r\n");