当前位置:   article > 正文

【正点原子STM32连载】第五十四章 USB虚拟串口(Slave)实验 摘自【正点原子】APM32E103最小系统板使用指南

【正点原子STM32连载】第五十四章 USB虚拟串口(Slave)实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第五十四章 USB虚拟串口(Slave)实验

本章将介绍使用APM32E103作为USB从设备,虚拟出串口与PC进行通信。通过本章的学习,读者将学习到APM32E103作为USB从设备虚拟出串口的使用。
本章分为如下几个小节:
54.1 硬件设计
54.2 程序设计
54.3 下载验证

54.1 硬件设计
54.1.1 例程功能

  1. 程序运行后,模拟出虚拟串口,通过数据线与PC连接后,可通过PC上的串口调试助手进行数据通讯,开发板端会通过USB虚拟串口实时发送USB虚拟串口接收到的数据
  2. LED0闪烁,指示程序正在运行
    54.1.2 硬件资源
  3. LED
    LED0 - PB5
    LED1 - PE5
  4. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  5. SD卡(SDIO驱动)
  6. USBD
    54.1.3 原理图
    请见第53.1.3小节中USB SLAVE接口与MCU的连接原理图的相关内容。
    54.2 程序设计
    54.2.1 Geehy的USB驱动
    请见第53.2.1小节中Geehy的USB驱动的相关内容。
    54.2.2 实验应用代码
    本章实验的应用代码,如下所示:
int main(void)
{
    uint8_t t = 0;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    led_init();                                       /* 初始化LED */
    lcd_init();                                       /* 初始化LCD */
    
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "USB Virtual USART TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    
    CDC_Init();
    
    while (1)
    {
        t++;
        
        if (t == 20)
        {
            LED0_TOGGLE();
            t = 0;
        }
        
        delay_ms(10);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

从上面的代码中可以看出,在调用完驱动库中的CDC初始化函数CDC_Init()后便进入死循环了,其他相关的操作都由驱动库和中断中完成了,在usbd_cdc.c文件中out endpoint传输完成回调函数USBD_VCP_OutEpCallback(),如下所示:

/*!
 * @brief	OUT endpoint transfer done handler(except EP0)
 *
 * @param	ep: OUT endpoint
 *
 * @retval	None
 */
void USBD_VCP_OutEpCallback(uint8_t ep)
{
    uint32_t dataCnt;
    
    if (ep == USB_EP_1)
    {
    		dataCnt = g_usbDev.outBuf[USB_EP_1].xferCnt;
    		
    		USBD_TxData(USB_EP_1, dataBuf, dataCnt);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

从上面的代码中可以看到,在out endpoint传输完成后,也就是USB的虚拟串口接收到数据后,便将数据原封不动地通过虚拟串口发送回去,达到“回显”的目的。
54.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时可以将开发板通过USB SLAVE接口与PC进行连接,待PC自动完成驱动安装后,便可看到PC上多出了一个端口设备,此时可以通过串口调试助手与该端口进行通信,可以看到无论串口调试助手发送任何数据,都会在串口调试助手的接受区看到发送出去的数据,这是因为APM32E103将虚拟串口接收到的数据原封不动地通过虚拟串口发送回去,实现了“回显”的效果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/172506
推荐阅读
相关标签
  

闽ICP备14008679号