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

    文章

    17194

    浏览量

    351847
  • usb
    usb
    +关注

    关注

    60

    文章

    7963

    浏览量

    265215
  • Shell
    +关注

    关注

    1

    文章

    366

    浏览量

    23415
收藏 人收藏

    评论

    相关推荐

    快速入门!RNDIS网卡实现USB上网~

    本文将带你使用RNDIS的方式,搭配Linux主控终端,快速实现USB上网。   RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over
    的头像 发表于 12-24 17:02 568次阅读
    快速入门!RNDIS网卡<b class='flag-5'>实现</b><b class='flag-5'>USB</b>上网~

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

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

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

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

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

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

    丢掉数据线,你还会调试Android设备吗?

    进行连接,当Android设备USB接口出现问题或身边没有USB数据线时,使用WiFi调试Android设备便成为了一种实用的替代方案。本文以平板电脑为例,为大家介
    的头像 发表于 08-14 17:09 411次阅读
    丢掉数据线,你还会<b class='flag-5'>调试</b>Android设备吗?

    灵动微电子MM32系列MCU SPI LCD彩屏参考方案

    ,同时也受到了市场的广泛关注,为此,灵动微电子推出了搭载MM32系列MCU的SPI LCD彩屏参考方案。 硬件方案介绍 LCD显示应用开发一直以来都是方案开发公司的难点项目,在开发过程
    的头像 发表于 04-26 10:01 2407次阅读
    灵动微电子<b class='flag-5'>MM32</b>系列MCU SPI LCD彩屏参考<b class='flag-5'>方案</b>

    USB调试助手来调试USB所遇到的困惑求解

    请教下大家,用USB调试助手来调试USB所遇到的困惑。问题如下面截图; 在程序只找到一个MCU接收PC所发数据的函数(如下)。但这是EP1的,而非EP2的。但在
    发表于 04-23 07:32

    CW-DAPLINK调试工具

    CW-DAPLINK是武汉芯源半导体有限公司专为CW32系列MCU的在线调试和编程工具而设计的。 它通过SWD接口和应用单板的MCU进行在线通信。通过CW-DAPLINK的全速USB
    的头像 发表于 04-09 17:16 817次阅读
    CW-DAPLINK<b class='flag-5'>调试</b>工具

    MM32自旋系列电机专用 24V电机驱动DK板功能介绍

    电子发烧友网站提供《MM32自旋系列电机专用 24V电机驱动DK板功能介绍.pdf》资料免费下载
    发表于 03-24 09:24 2次下载

    请问如何通过AURIX辅助其他SOC实现功能安全设计?

    请问如何通过AURIX辅助其他SOC实现功能安全设计?
    发表于 01-24 07:05

    DCS系统调试方案编制说明

    为高效优质完成调校工作,确保工艺试车进度,并实现长期、安全稳定生产的目标,特编制本DCS系统调试方案
    的头像 发表于 01-18 10:47 583次阅读
    DCS系统<b class='flag-5'>调试</b><b class='flag-5'>方案</b>编制说明

    DCS系统调试内容及方法

    在这一层次中,通过设置断点1、2,使DCS调试辅助仪表盘仪表调试相对独立、互不干扰,从而便于实现对这两个工序的平行作业,并可避免因设备状态
    发表于 01-18 10:46 1927次阅读
    DCS系统<b class='flag-5'>调试</b>内容及方法