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

    文章

    16019

    浏览量

    343657
  • usb
    usb
    +关注

    关注

    59

    文章

    7436

    浏览量

    258209
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22903
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    USB调试模式是什么意思?USB调试模式有什么用?

    USB调试模式是什么意思?USB调试模式有什么用? USB调试模式是一种在Android设备上进
    的头像 发表于 12-11 11:06 3819次阅读

    python shell怎么用

    Python Shell是一种交互式解释器,可以通过命令行直接运行Python代码。在Shell中,可以输入一行代码并立即得到结果,非常适合于测试、尝试新代码或进行简单的任务。本文将详细介绍
    的头像 发表于 11-29 14:36 372次阅读

    基于灵动MM32 MCU的便携式血氧仪应用

    基于灵动MM32 MCU的便携式血氧仪应用
    的头像 发表于 10-24 15:31 272次阅读
    基于灵动<b class='flag-5'>MM32</b> MCU的便携式血氧仪应用

    RA4M3通过USB实现固件升级

    RA4M3通过USB实现固件升级
    的头像 发表于 10-18 08:06 155次阅读
    RA4M3<b class='flag-5'>通过</b><b class='flag-5'>USB</b><b class='flag-5'>实现</b>固件升级

    灵动微MM32全系列产品选型手册

    电子发烧友网站提供《灵动微MM32全系列产品选型手册.pdf》资料免费下载
    发表于 09-20 14:46 0次下载
    灵动微<b class='flag-5'>MM32</b>全系列产品选型手册

    GD32与MM32哪个好?

    GD32与MM32哪个好? 近年来,中国的芯片产业逐渐崛起,相信很多人都已经听说过或者使用过GD32和MM32这两款芯片。它们都来自于国内芯片厂商——国际信息产业集团公司(简称国产IC)。在选择哪种
    的头像 发表于 08-16 11:33 1042次阅读

    MindSDK为MM32实现了一组TIM样例工程

    MindSDK为MM32使用星辰处理器内核的系列微控制器,实现了一组TIM样例工程,MindSDK中的TIM模块对应硬件定时器TIM外设。
    的头像 发表于 06-30 17:32 664次阅读

    浅谈usb的三种接口和调试功能

     USB调试是一种功能,用于在计算机和Android设备之间进行数据通信和调试。它允许开发人员在通过USB连接的 Android 设备上发送
    发表于 06-30 14:49 2034次阅读

    一个小而美的嵌入式shell - letter shell

    熟悉Linux的朋友的都知道,shell包裹在内核之外的人机交互界面,用于用户和内核之间打交道的功能,类似于windows CMD。 通过Shell将输入的命令与内核通讯,好让内核可以控制硬件开正确
    的头像 发表于 06-10 15:11 4463次阅读
    一个小而美的嵌入式<b class='flag-5'>shell</b> - letter <b class='flag-5'>shell</b>

    剖析Linux shell 函数实现

    作为一个嵌入式 Linux 工程师,肯定需要编写 shell 脚本进行一些自动化工作。刚好,我最近就有类似需求——一键交叉编译 DDS。本着“编写漂亮代码的原则”,我用到了 **shell 函数** 。
    的头像 发表于 05-12 10:27 338次阅读
    剖析Linux <b class='flag-5'>shell</b> 函数<b class='flag-5'>实现</b>

    如何在usb cdc上获取shell

    我正在尝试在 usb cdc 上获取 shell。 我在 2 年前和 1 年前就看到过,但没有具体的建议/演示/解决方案。 你有关于这个话题的任何更新吗?
    发表于 05-12 08:48

    如何在USB VCOM上获取Shell

    到 fsl_shell 中。我想要的是生成一个可通过 USB vcom 接口访问的外壳,以便我可以从 PC 发送设备命令。 SHELL_Init 似乎需要一个 serial_hand
    发表于 05-12 06:46