如何通过MM32 USB实现shell辅助调试方案

在前面的章节中我们介绍了mm32 usb各种功能类型,也介绍了如何通过串口或者j-link rtt方式实现shell辅助调试方式,但是其都需要依赖额外的工具,比如串口方式就需要usb转ttl,j-link rtt需要使用j-link下载器,所以希望有新的方法实现shell,本次我们介绍usb cdc的方式来实现shell功能。
本次我们采用mm32l373 miniboard作为测试开发板,验证usb cdc的方式来实现shell功能。
前面已经为大家讲解了shell的串口方法,其实原理一样,只是用mm32 usb枚举成串口设备替代usb转ttl,直接从usb获取数据到mcu,也不需要额外占用mcu的串口,节省资源和硬件,相关的代码都可以从之前的文章获取,本次只是融合两者,改变实现接口,具体代码参考如下:
对于cdc部分,其函数初始化配置及相关全局变量定义内容,代码如下:
#define usbd_power 0
#define usbd_max_packet0 64
#define usbd_devdesc_idvendor 0x2f81 //0x0d28
#define usbd_devdesc_idproduct 0x0001 //0x0204
以上是定义的mm32 mcu cdc设备vid和pid,灵动微电子已经获得usb组织授权的vid和pid。当设备插入电脑上,可以查看到如上标识的cdc设备,如图1所示:
图1 pc设备管理器列表
对于mm32 mcu的cdc功能来说,
在使用cdc功能之前先调用usb初始化函数来初始化usb协议栈。
int main(void)
{
// usb device initialization and connect
usbd_init();
usbd_connect(__true);
while (!usbd_configured()) // wait for usb device to configure
{
}
while (1)
{
}
}
对于shell部分其函数初始化配置及相关全局变量定义内容,代码如下:
typedef struct
{
char *command; // shell命令提示符
char buffer[shell_command_max_length]; // shell命令缓冲buffer
unsigned short length; // shell命令长度大小
unsigned short cursor; // shell光标位置偏移
char *param[shell_parameter_max_number]; // shell参数变量
char history[shell_history_max_number][shell_command_max_length]; // 历史记录区域
unsigned short historycount; // 历史记录数量
short historyflag; // 当前记录偏移位置
short historyoffset; // 历史记录偏移大小
shell_commandtypedef *commandbase; // 命令表基地址
unsigned short commandnumber; // 命令数量
int keyfuncbase; // 按键响应表基地址
unsigned short keyfuncnumber; // 按键响应数量
shell_inputmode status; // shell输入状态
unsigned char isactive; //是不是当前激活的shell
shellread read; // shell读函数接口
shellwrite write; // shell写函数接口
}shell_typedef;
如上所示,为对象的定义接口,移植的步骤先定义一个shell对象,即:shell_typedef cdc_shell,然后实例化对象的操作接口,具体说明看注释,对于其中我们需要关注的是shell的读写接口。由于本次我们使用usb cdc接收和发送数据,所以我们只需要在usb cdc的函数中处理接收到的数据即可,我们使用shellhandler(&cdc_shell, ep2rxbuff[i]);来处理数据的交互,具体函数代码参考串口shell代码。
shell的发送接口,只需要把数据拷贝到buffer即可。
shell的读写接口移植到cdc上,代码如下:
void usbd_cdc_task(void)
{
uint8_t i, count;
notifyonstatuschange();
if (cdc_uart ->isr & 0x08)
{
cdc_uart ->gcr &= ~(3 if (ep2receiveflag == 1)
{
ep2receiveflag = 0;
for (i = 0; i usb
if (ep2transferflag == 1)
{
if (txbuflen > 0)
{
while (usb->rep2_ctrl & 0x80);
if (txbuflen > 64)
{
uart_readdata(ep2txbuff, 64);
count = 64;
txbuflen -= 64;
}
else
{
uart_readdata(ep2txbuff, txbuflen);
count = txbuflen;
txbuflen = 0;
}
usb_buf_busy_flag = 1;
for (i = 0; i rep2_fifo = *(ep2txbuff + i);
}
if ((usb ->rep2_avil & 0x3f) == count)
{
usb->rep2_ctrl = 0x80 | count;
}
else
{
usb->rtop |= 1 if (0 == txbuflen)
ep2transferflag = 0;
}
}
}
如上,我们就完成通过mm32 mcu的cdc实现shell调试功能,用串口助手打开虚拟串口,用cdc shell测试发送数据,结果如下:
图2 功能演示
以上就是mm32 mcu usb的cdc shell功能。


Samplify公司扩大其全球机构,设立中国办事处
新基建赋能5G等领域提质增效
惠普董事会否决施乐335亿的收购提议
服务器带宽和宽带是一样的吗,它们有什么区别
SCL如何使用经典Step7的接口型式
如何通过MM32 USB实现shell辅助调试方案
两种常见无线电架构对比
HDMI视频采集卡在电视信号采集中的应用
BMI160参数概述 BOSCH/博世六轴加速度 陀螺仪 传感器
5G手机销量接近全球的50% 中国成为5G换机率最高国家之一
传特斯拉汽车可实现完全无人驾驶
AGM X2的户外黑科技大盘点!
SMT加工的焊接裂缝原因
FXO端口的断开呼叫的问题
采用CPLD器件MAX7128实现温度控制系统的应用设计
利用耦合电感器的优点
天舟七号货运飞船成功对接空间站,携带厌氧古菌探索外星生命
丰田汽车生产计划方案批准,于2023年前在泰国启动EV和PHV生产
水平定向钻进跟踪与导向仪中地下传感发射探头的设计
一种如何自学几种新技巧的机器人