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
    +关注

    关注

    147

    文章

    18609

    浏览量

    387097
  • usb
    usb
    +关注

    关注

    60

    文章

    8372

    浏览量

    281707
  • Shell
    +关注

    关注

    1

    文章

    373

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    灵动微32位单片机MM32充电系统监控解决方案

    MM32F0040系列32位单片机提出的电流监控方案,凭借其高性能、高集成度与高可靠性,正成为越来越多充电设备厂商的理想选择。
    的头像 发表于 11-26 16:33 315次阅读

    RK 平台 USB 摄像头成像调试指南:从信号到画质的全流程优化

    信号调试到画质优化的实操方案,助力开发者快速解决成像难题。 一、先搞懂:成像差的核心诱因 USB 摄像头成像模糊、卡顿、断连等问题,本质是 “信号传输” 与 “硬件适配” 双重问题: •信号层面:
    的头像 发表于 11-26 07:05 121次阅读
    RK 平台 <b class='flag-5'>USB</b> 摄像头成像<b class='flag-5'>调试</b>指南:从信号到画质的全流程优化

    基于MM32 MCU系列微控制器的空调外机智能控制方案

    MCU微控制器为核心的智能方案逐渐成为主流。英尚微电子推出以灵动微MM32 MCU系列为主控的空调外机参考方案,旨在为空调系统提供更加智能化的控制方案
    的头像 发表于 11-25 17:10 289次阅读

    Auracast广播音频解决方案通过Nordic Semiconductor无线连接技术 在公共场所提供辅助听力支持

    Semiconductor双核nRF5340多协议SoC驱动的完整解决方案,让场馆和终端用户通过 Auracast 广播音频技术在公共场所实现辅助听力支持。   AuriTM解决
    的头像 发表于 11-05 17:59 2921次阅读

    LuatOS AGPS 辅助定位开发实战教程

    、数据解析、定位模块调优等实战环节,附带完整代码与调试技巧,助开发者快速上手。   一、AGPS 概述   AGPS(Assisted GPS,辅助全球卫星定位系统)通过移动网络预先获取卫星星历、时间等
    的头像 发表于 10-31 17:34 1003次阅读
    LuatOS AGPS <b class='flag-5'>辅助</b>定位开发实战教程

    博世中阶智能辅助驾驶方案实现规模化交付

    10月17日,博世中阶智能辅助驾驶迎来批量交付的关键节点。今年上半年,该方案已获得捷途、东风、北汽等五家车企的十余款车型定点。历经数月的开发调试与严苛测试,如今顺利实现规模化交付,充分
    的头像 发表于 10-23 09:07 473次阅读

    如何排除 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 1182次阅读
    黑芝麻智能携手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 436次阅读

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

    灵动微电子MM32系列32位MCU已经在江湖上久负盛名,以产品平台化、系列化、兼容性好、性价比高、易于开发著称。MM32MCU分为超值型、主流型、性能型、低功耗、汽车控制、电机与电源等六大系列。今天给大家综合介绍MM32MCU的
    的头像 发表于 05-06 13:32 1894次阅读
    灵动微电子<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 1000次阅读
    极致性价比<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 1064次阅读
    如何<b class='flag-5'>通过</b>J-Link<b class='flag-5'>实现</b>STM32H5控制<b class='flag-5'>调试</b>端口