0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 ? 来源:灵动MM32MCU ? 作者:灵动MM32MCU ? 2021-02-15 06:33 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在前面的章节中我们介绍了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所示:

pIYBAF_8DO6AFL3iAAMqMeIJuO8301.png

图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 << 3);

CDC_UART ->GCR = 3 << 3;

UART_ClearITPendingBit(CDC_UART, UART_OVER_ERR);

}

// USB -> UART

if (EP2ReceiveFlag == 1)

{

EP2ReceiveFlag = 0;

for (i = 0; i < RxBufLen; i++)

shellHandler(&cdc_shell, EP2RXBuff[i]);

}

// UART -> 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 < count; i++)

{

USB->rEP2_FIFO = *(EP2TXBuff + i);

}

if ((USB ->rEP2_AVIL & 0x3f) == count)

{

USB->rEP2_CTRL = 0x80 | count;

}

else

{

USB->rTOP |= 1 << 3;

USB->rTOP &= ~(1 << 3);

}

USB->rEP2_CTRL = 0x80 | count;

if (0 == TxBufLen)

EP2TransferFlag = 0;

}

}

}

如上,我们就完成通过MM32 MCU的CDC实现shell调试功能,用串口助手打开虚拟串口,用CDC shell测试发送数据,结果如下:

pIYBAF_8DP-AHq7DAAXuE60Q2B0041.png

图2 功能演示

以上就是MM32 MCU USB的CDC shell功能。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    18077

    浏览量

    371021
  • usb
    usb
    +关注

    关注

    60

    文章

    8265

    浏览量

    274872
  • Shell
    +关注

    关注

    1

    文章

    372

    浏览量

    24344
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何排除 USB 协议分析仪测试中的干扰源?

    工具:通过USB-IF认证的测试工具(如Ellisys USB Validator)生成合规性报告。 对比参考实现:将DUT的协议交互与开源实现
    发表于 08-01 15:00

    【RA-Eco-RA6M4开发板评测】移植shell实现命令交互

    代码见 一. 前言前面我们实现了标准输入输出,为了进一步方便交互调试,我们继续来实现一个精简的shellShell
    发表于 07-19 22:47

    黑芝麻智能携手Nullmax打造辅助驾驶主流量产方案

    ? 黑芝麻智能与Nullmax联合打造的辅助驾驶主流量产方案,基于单颗武当C1236芯片,集成Nullmax自研软件架构与视觉感知算法,实现城区记忆领航、高速领航辅助及记忆泊车等功能。
    的头像 发表于 06-26 18:36 ?740次阅读
    黑芝麻智能携手Nullmax打造<b class='flag-5'>辅助</b>驾驶主流量产<b class='flag-5'>方案</b>

    如何通过串口调试助手通过USB口读取电子标签信息和状态?

    因为刚好项目上需要用到NFC标签所以想能够通过USB口或者串口,用串口调试助手通过发命令的方式 读取电子标签信息和状态而不是用ST25R200_Eval_GUI软件读取
    发表于 06-17 07:51

    通过御控APP实现PLC远程调试与远程监控

    御控APP,通过移动化、智能化的手段,实现了PLC远程调试与监控,为工业生产带来了便捷与高效。
    的头像 发表于 06-04 09:49 ?248次阅读

    灵动微电子MM32MCU的主流型芯片选型

    灵动微电子MM32系列32位MCU已经在江湖上久负盛名,以产品平台化、系列化、兼容性好、性价比高、易于开发著称。MM32MCU分为超值型、主流型、性能型、低功耗、汽车控制、电机与电源等六大系列。今天给大家综合介绍MM32MCU的
    的头像 发表于 05-06 13:32 ?1080次阅读
    灵动微电子<b class='flag-5'>MM</b>32MCU的主流型芯片选型

    USB 3.0CX3中的辅助引导加载程序后无法识别怎么解决?

    的引导加载程序实现基于来自boot_fw/src/spi_test.c的参考代码。 观察到的行为 1当直接加载应用程序(不使用 SBL)时 →USB 3.0 工作正常。 2. 通过辅助
    发表于 05-06 08:39

    极致性价比USB-C接口ESD保护方案

    什么是USB-CUSBType-C(简称USB-C)是通用串行总线(USB)的标准化接口规范。其插头与插座采用对称式设计,支持双向插拔操作,物理尺寸为8.3mm×2.5
    的头像 发表于 03-24 18:03 ?628次阅读
    极致性价比<b class='flag-5'>USB</b>-C接口ESD保护<b class='flag-5'>方案</b>

    如何通过J-Link实现STM32H5控制调试端口

    基于J-Link实现STM32H5安全编程介绍了在禁用TrustZone时,如何通过J-Link实现STM32H5控制调试端口的安全锁定或回归打开。
    的头像 发表于 03-17 10:25 ?635次阅读
    如何<b class='flag-5'>通过</b>J-Link<b class='flag-5'>实现</b>STM32H5控制<b class='flag-5'>调试</b>端口

    Linux从零到精通:最简单的Shell脚本入门教程

    通过简单的命令和脚本,实现对系统的灵活控制和自动化管理。 shell脚本前言 shell脚本入门 shell变量基础
    的头像 发表于 12-05 09:56 ?1709次阅读
    Linux从零到精通:最简单的<b class='flag-5'>Shell</b>脚本入门教程

    乐鑫USB方案设备互联传输,丰富的外设支持应用

    启明云端/01乐鑫USB方案USB是一种通用的总线标准,用于连接主机和外部设备。乐鑫USB方案为用户提供了方便快捷的设备互联和数据传输方式。
    的头像 发表于 11-14 01:00 ?986次阅读
    乐鑫<b class='flag-5'>USB</b><b class='flag-5'>方案</b>设备互联传输,丰富的外设支持应用

    什么是EPS?通过马达来辅助转向操作的系统

    背景 ? EPS是一种通过马达来减轻和辅助驾驶员在转向操作时所需力量的设备。此外,通过采用EPS,可望提高燃效,降低车辆重量。我们将在本消息中就EPS的功能和系统构成进行解说,同时对构成的电子零部件
    的头像 发表于 11-03 14:23 ?1212次阅读
    什么是EPS?<b class='flag-5'>通过</b>马达来<b class='flag-5'>辅助</b>转向操作的系统

    TCSH shell 编程入门

    ICer从业人员最先需要掌握的语言,就是linux shell语言。TCSH是ICer使用最多的Shell语言,可以说ICer入门语言从TCSH开始。
    发表于 11-01 10:45 ?0次下载

    求助,请问PCM2904能实现耳机输入,USB输出的功能吗?

    您好! 我想实现一个从手机或者电脑支持耳机插口的设备上获取音频然后通过USB输出, 也就是 headphone-->USB AUDIO CODEC--->
    发表于 10-21 06:00

    shell具有的功能和特点

    是执行命令。用户可以在 Shell 提示符下输入命令,Shell 会解析命令并将其传递给操作系统执行。Shell 支持各种类型的命令,包括内置命令、外部命令和脚本命令。 命令历史 Shell
    的头像 发表于 08-30 14:48 ?1453次阅读