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

    文章

    19227

    浏览量

    405115
  • usb
    usb
    +关注

    关注

    60

    文章

    8486

    浏览量

    286498
  • Shell
    +关注

    关注

    1

    文章

    376

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    自制USB隔离模块:为开发调试筑起安全防线

    针对高压调试易烧电脑、市售隔离模块使用不便的痛点,本文分享一款自制的USB隔离模块。该模块采用ADuM3160磁隔离芯片、双路隔离电源与继电器自动切换,并扩展出四个USB口,配合稳固的外壳设计,为
    的头像 发表于 03-16 16:56 679次阅读
    自制<b class='flag-5'>USB</b>隔离模块:为开发<b class='flag-5'>调试</b>筑起安全防线

    RK3588平台USB摄像头调试实战:从报错到稳定运行

    在嵌入式开发中,RK3588 凭借强劲的算力常被用于边缘计算、工业视觉等场景,而 USB 摄像头作为常见外设,调试过程中难免遇到各类 “卡壳” 问题。最近我们在 RK3588 上调试 USB
    的头像 发表于 02-04 16:13 832次阅读

    如何为IoT设备添加USB功能?乐鑫ESP-USB单芯片方案详解

    降低物料成本与设计复杂度。设备可作为USB主机连接摄像头、4G模组等外设,亦可作为USB设备实现无线存储、HID交互等功能,同时支持便捷的固件升级与调试
    的头像 发表于 02-04 09:31 1173次阅读
    如何为IoT设备添加<b class='flag-5'>USB</b>功能?乐鑫ESP-<b class='flag-5'>USB</b>单芯片<b class='flag-5'>方案</b>详解

    告别USB线!无线ADB调试,附全志/瑞芯微实战教程

    前言:作为嵌入式开发者,很多人习惯性使用ADB而不是调试的debug串口。尤其是在使用buildroot或ubuntu这类非Android系统的嵌入式设备时,传统的ADB调试依赖于通过USB
    的头像 发表于 01-23 08:32 5892次阅读
    告别<b class='flag-5'>USB</b>线!无线ADB<b class='flag-5'>调试</b>,附全志/瑞芯微实战教程

    简单高效的一体化USB电源管理IC解决方案

    ADI提供了多款简化USB线缆电源转换的器件,其中LTC3455实现了超高水平的功能集成度。LTC3455 采用4mm × 4mm QFN封装,能够无缝管理交流适配器、
    的头像 发表于 01-13 13:59 5236次阅读
    简单高效的一体化<b class='flag-5'>USB</b>电源管理IC解决<b class='flag-5'>方案</b>

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

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

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

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

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

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

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

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

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

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

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