这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 中断模式的USB-CDC/虚拟串口库函数及使用说明,STC32G/STC8H

共3条 1/1 1 跳转至

中断模式的USB-CDC/虚拟串口库函数及使用说明,STC32G/STC8H

助工
2023-06-05 09:20:19     打赏

中断模式的 USB-CDC/虚拟串口库函数 及使用说明
===STC32G12K128 / STC8H8K64U

===USB-CDC虚拟串口/就是最简单的串口, WIN10 及以后都不用装驱动了!!!


大家已经非常熟悉 查询模式的STC USB-CDC/虚拟串口库函数
当串口接收的数据量大或者有其他高优先级中断需要响应时,查询模式可能会无法及时处理接收的数据。
基于实际的应用需求,现提供中断模式的 USB-CDC/虚拟串口库函数,供参考和使用,见本贴附件

当在USB中断服务程序中接收到来自于上位机的数据包后,
在USB的中断服务程序中会调用一个回调函数usb_OUT_callback(),
用户只需要在自己的代码中实现usb_OUT_callback(),
并在处理完成接收到的串口数据后,返回1就可以了
剩下后续的收尾工作中断服务程序会自动完成

下面以STC32G12K128系列的中断模式库为例进行说明(STC8H完全类似)
第一步、新建项目,选择目标芯片型号为STC32G12K128

第二步、将下面的代码保存为main.c,并将文件添加到项目中

  1. #include "stc32g.h"

  2. #include "stc32_stc8_usb.h"


  3. char *USER_DEVICEDESC = NULL;

  4. char *USER_PRODUCTDESC = NULL;

  5. char *USER_STCISPCMD = "@STCISP#";


  6. void main()

  7. {

  8.     P_SW2 |= 0x80;

  9.    

  10.     P0M1 = 0x00;   P0M0 = 0x00;

  11.     P1M1 = 0x00;   P1M0 = 0x00;

  12.     P2M1 = 0x00;   P2M0 = 0x00;

  13.     P3M1 = 0x00;   P3M0 = 0x00;

  14.     P4M1 = 0x00;   P4M0 = 0x00;

  15.     P5M1 = 0x00;   P5M0 = 0x00;

  16.     P6M1 = 0x00;   P6M0 = 0x00;

  17.     P7M1 = 0x00;   P7M0 = 0x00;


  18.     P3M0 &= ~0x03;

  19.     P3M1 |= 0x03;

  20.    

  21.     IRC48MCR = 0x80;

  22.     while (!(IRC48MCR & 0x01));

  23.    

  24.     USBCLK = 0x00;

  25.     USBCON = 0x90;

  26.    

  27.     usb_init();                                     //USB CDC 接口配置

  28.    

  29.     IE2 |= 0x80;                                    //使能USB中断

  30.     EA = 1;

  31.    

  32.     while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置


  33.     while (1);

  34. }


  35. /************************************************

  36. 函数功能:USB-CDC串口接收数据的回调函数

  37. 函数描述:回调函数由USB中断在接收到串口数据时自动调用

  38.           回调函数处理完成串口数据后需要返回1

  39. 函数返回:返回1:USB中断服务程序自动完成后续的收尾工作

  40.           返回0:USB会暂停接收串口数据,直到用户自行调用

  41.                  usb_OUT_done()函数后USB才会重新恢复接收数据

  42. 注意事项:当函数返回1时用户无需调用usb_OUT_done()

  43.           只有返回0时才需要调用usb_OUT_done()进行手动收尾

  44.           强烈建议usb_OUT_callback返回1

  45. ************************************************/

  46. BOOL usb_OUT_callback()

  47. {

  48.     USB_SendData(UsbOutBuffer,OutNumber);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

  49.    

  50.     return 1;

  51. }

第三步、将库文件“stc_usb_cdc_32g_interrupt.lib”也添加到项目中

第四步、对项目进行如下设置

第五步、最后对项目进行编译产生HEX文件

将hex文件下载到目标芯片中即可。

下面的附件为中断模式的库文件
同时顺便间之前的查询模式的库文件和“stc32_stc8_usb.h”头文件也一并上传,供大家下载和参考

STC_CDC_INTERRUPT_LIBRARY.rar

STC_CDC_QUERY_LIBRARY.rar

STC_HID_QUERY_LIBRARY.rar





关键词: 中断模式的 USB-CDC/虚拟串口库函数 及使用    

助工
2023-06-05 09:21:03     打赏
2楼

Q1. 实例中的“BOOL usb_OUT_callback()”就相当于中断程序,只要USB-CDC接收到上位机发来的程序就自动启动这个程序?
A1. 是的. usb_OUT_callback()是一个回调函数,只要USB-CDC接收到上位机发来的数据,中断服务程序就会自动调用这个程序

Q2. 在这个程序中处理上位机发来的数据。接收的数据保存在UsbOutBuffer中,数量是OutNumber
A2. 是的

Q3. USB发送数据还是调用USB_SendData(SendBuffer,SendNumber); ,SendBuffer,SendNumber分别是要发送数据的缓冲区地址和发送数据数量
A3. 是的

Q4. 只要调用上述程序,且处理完接收到的数据,并且最后“return 1;”就无需再调用“usb_OUT_done()”函数,
A4. 是的. 中断服务程序发现回调函数的返回值为1,就会自动去做剩下的工作,用户无需在软件中调用“usb_OUT_done()”函数


菜鸟
2023-06-05 10:21:33     打赏
3楼

谢谢分享!


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]