找回密码
 立即注册
查看: 3028|回复: 21

51 开源 汇编语言调用USB-CDC库文件实现USB-CDC虚拟串口通信,取代传统串口

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-14 15:13:34
已绑定手机

54

主题

53

回帖

1680

积分

管理员

积分
1680
发表于 2023-10-20 11:03:39 | 显示全部楼层 |阅读模式
51 开源 只会汇编的 老专家 | USB 福音 | 不懂C语言照样用C语言的USB库
1,STC8H8K64U汇编程序调用USB-CDC库,产生USB-CDC虚拟串口通信程序
2,STC32G12K128汇编程序调用USB-CDC库,产生USB-CDC虚拟串口通信程序
用汇编实现USB-CDC虚拟串口通信|取代传统的串口,供需要的老专家参考

STC官网 | 库函数 页面也已添加https://www.stcai.com/khs
截图202310201103123269.jpg


stc8h_cdc_demo_asm.zip

94.13 KB, 下载次数: 450

stc32g_cdc_demo_asm.zip

106.81 KB, 下载次数: 332

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 11:26:46 | 显示全部楼层
截图202310201123596538.jpg

截图202310201124495973.jpg

截图202310201126106915.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 11:26:56 | 显示全部楼层
//STC8H8K64U汇编程序调用USB-CDC库产生USB-CDC虚拟串口通信程序, 主程序

$INCLUDE(STC8H.INC)

;************************************************

    DEVSTATE_ATTACHED       EQU     0
    DEVSTATE_POWERED        EQU     1
    DEVSTATE_DEFAULT        EQU     2
    DEVSTATE_ADDRESS        EQU     3
    DEVSTATE_CONFIGURED     EQU     4
    DEVSTATE_SUSPENDED      EQU     5
   
    EXTRN   CODE(USB_INIT)
    EXTRN   CODE(USB_OUT_DONE)
    EXTRN   CODE(_USB_SENDDATA)
   
    EXTRN   XDATA(DEVICESTATE)
    EXTRN   XDATA(OUTNUMBER)
   
    EXTRN   BIT(BUSBFEATUREREADY)
    EXTRN   BIT(BUSBINBUSY)
    EXTRN   BIT(BUSBOUTREADY)
    EXTRN   XDATA(USBFEATUREBUFFER)
    EXTRN   XDATA(USBINBUFFER)
    EXTRN   XDATA(USBOUTBUFFER)
   
    PUBLIC  USER_DEVICEDESC
    PUBLIC  USER_PRODUCTDESC
    PUBLIC  USER_STCISPCMD
    PUBLIC  USB_OUT_CALLBACK

;************************************************

?XD?MAIN    SEGMENT XDATA              ;定义数据段

    RSEG    ?XD?MAIN
USER_DEVICEDESC:
    DS      3
USER_PRODUCTDESC:
    DS      3
USER_STCISPCMD:
    DS      3

;************************************************

    CSEG    AT  0000H
    LJMP    RESET                       ;复位跳转

;************************************************

?PR?MAIN    SEGMENT CODE                ;定义代码段
    RSEG    ?PR?MAIN
RESET:
    MOV     R0,#7FH
    CLR     A
CLEARRAM:
    MOV     @R0,A
    DJNZ    R0,CLEARRAM
   
    MOV     SP,#7FH

    ORL     P_SW2,#80H
    CLR     A
    MOV     P0M0,A
    MOV     P0M1,A
    MOV     P1M0,A
    MOV     P1M1,A
    MOV     P2M0,A
    MOV     P2M1,A
    MOV     P3M0,A
    MOV     P3M1,A
    MOV     P4M0,A
    MOV     P4M1,A
    MOV     P5M0,A
    MOV     P5M1,A
    MOV     P6M0,A
    MOV     P6M1,A
    MOV     P7M0,A
    MOV     P7M1,A
   
    MOV     DPTR,#USER_DEVICEDESC
    CLR     A
    MOVX    @DPTR,A
    INC     DPTR
    MOVX    @DPTR,A
    INC     DPTR
    MOVX    @DPTR,A
   
    MOV     DPTR,#USER_PRODUCTDESC
    CLR     A
    MOVX    @DPTR,A
    INC     DPTR
    MOVX    @DPTR,A
    INC     DPTR
    MOVX    @DPTR,A
   
    MOV     DPTR,#USER_STCISPCMD        ;初始化不停电下载复位命令
    MOV     A,#0FFH
    MOVX    @DPTR,A
    INC     DPTR
    MOV     A,#HIGH TAB_STCISPCMD
    MOVX    @DPTR,A
    INC     DPTR
    MOV     A,#LOW TAB_STCISPCMD
    MOVX    @DPTR,A
   
    ANL     P3M0,#NOT 03H               ;设置P3.0/P3.1为高阻输入模式
    ORL     P3M1,#03H
   
    MOV     DPTR,#IRC48MCR              ;启动IRC48M时钟
    MOV     A,#80H
    MOVX    @DPTR,A
WAITIRC48:
    MOVX    A,@DPTR
    JNB     ACC.0,WAITIRC48
   
    MOV     USBCLK,#00H                 ;USB相关寄存器初始化
    MOV     USBCON,#90H
   
    LCALL   USB_INIT                    ;初始化USB模块
   
    ORL     IE2,#80H                    ;使能USB中断
    SETB    EA

    MOV     DPTR,#DEVICESTATE
WAITUSBCFG:
    MOVX    A,@DPTR                     ;等待USB配置完成
    CJNE    A,#DEVSTATE_CONFIGURED,WAITUSBCFG
   
MAIN:
    JMP     MAIN

;************************************************
;函数功能:USB-CDC串口接收数据的回调函数
;函数描述:回调函数由USB中断在接收到串口数据时自动调用
;          回调函数处理完成串口数据后需要返回1
;函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
;          返回0:USB会暂停接收串口数据,直到用户自行调用
;                 usb_OUT_done()函数后USB才会重新恢复接收数据
;注意事项:当函数返回1时用户无需调用usb_OUT_done()
;          只有返回0时才需要调用usb_OUT_done()进行手动收尾
;          强烈建议usb_OUT_callback返回1
;************************************************
USB_OUT_CALLBACK:                       ;实现USB回调函数
    MOV     R3,#01H
    MOV     R2,#HIGH USBOUTBUFFER
    MOV     R1,#LOW USBOUTBUFFER
    MOV     DPTR,#OUTNUMBER
    MOVX    A,@DPTR
    MOV     R5,A
    MOV     R4,#00H
    LCALL   _USB_SENDDATA               ;数据原路返回
    SETB    C                           ;返回1
    RET

;************************************************

TAB_STCISPCMD:
    DB      "@STCISP#",0

;************************************************

    END


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 11:30:52 | 显示全部楼层
以上 STC8H8K64U

以下 STC32G12K128

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 11:32:24 | 显示全部楼层
STC32G12K128
截图202310201132209593.jpg

截图202310201132432635.jpg

截图202310201134427638.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 11:35:49 | 显示全部楼层
// STC32G12K128的汇编程序调用USB-CDC库产生USB-CDC虚拟串口通信程序的主程序

$INCLUDE(STC32G.INC)
;************************************************

    DEVSTATE_ATTACHED       EQU     0
    DEVSTATE_POWERED        EQU     1
    DEVSTATE_DEFAULT        EQU     2
    DEVSTATE_ADDRESS        EQU     3
    DEVSTATE_CONFIGURED     EQU     4
    DEVSTATE_SUSPENDED      EQU     5

    EXTRN   ECODE(USB_INIT?)
    EXTRN   ECODE(USB_OUT_DONE?)
    EXTRN   ECODE(USB_SENDDATA?)

    EXTRN   EDATA(DEVICESTATE)
    EXTRN   EDATA(OUTNUMBER)

    EXTRN   BIT(BUSBFEATUREREADY)
    EXTRN   BIT(BUSBINBUSY)
    EXTRN   BIT(BUSBOUTREADY)
    EXTRN   XDATA(USBFEATUREBUFFER)
    EXTRN   XDATA(USBINBUFFER)
    EXTRN   XDATA(USBOUTBUFFER)

    PUBLIC  USER_DEVICEDESC
    PUBLIC  USER_PRODUCTDESC
    PUBLIC  USER_STCISPCMD
    PUBLIC  USB_OUT_CALLBACK?

;************************************************

?ED?MAIN    SEGMENT EDATA               ;定义数据段
    RSEG    ?ED?MAIN
USER_DEVICEDESC:
    DS      4
USER_PRODUCTDESC:
    DS      4
USER_STCISPCMD:
    DS      4

;************************************************

    CSEG    AT  0000H
    LJMP    RESET                       ;复位跳转

;************************************************

?PR?MAIN    SEGMENT CODE                ;定义代码段
    RSEG    ?PR?MAIN
RESET:
    MOV     R0,#7FH
    CLR     A
CLEARRAM:
    MOV     @R0,A
    DJNZ    R0,CLEARRAM

    MOV     DR60,#0100H

    MOV     WTST,#00H
    MOV     CKCON,#00H
    SETB    EAXFR

    CLR     A
    MOV     P0M0,A
    MOV     P0M1,A
    MOV     P1M0,A
    MOV     P1M1,A
    MOV     P2M0,A
    MOV     P2M1,A
    MOV     P3M0,A
    MOV     P3M1,A
    MOV     P4M0,A
    MOV     P4M1,A
    MOV     P5M0,A
    MOV     P5M1,A
    MOV     P6M0,A
    MOV     P6M1,A
    MOV     P7M0,A
    MOV     P7M1,A

    MOV     DR0,#0
    MOV     USER_DEVICEDESC,DR0

    MOV     DR0,#0
    MOV     USER_PRODUCTDESC,DR0

    MOV     WR0,#WORD2 TAB_STCISPCMD
    MOV     WR2,#WORD0 TAB_STCISPCMD
    MOV     USER_STCISPCMD,DR0          ;初始化不停电下载复位命令

    ECALL   USB_INIT?                   ;初始化USB模块

    SETB    EA

WAITUSBCFG:
    MOV     R11,DEVICESTATE             ;等待USB配置完成
    CJNE    A,#DEVSTATE_CONFIGURED,WAITUSBCFG

MAIN:
    JMP     MAIN

;************************************************
;函数功能:USB-CDC串口接收数据的回调函数
;函数描述:回调函数由USB中断在接收到串口数据时自动调用
;          回调函数处理完成串口数据后需要返回1
;函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
;          返回0:USB会暂停接收串口数据,直到用户自行调用
;                 usb_OUT_done()函数后USB才会重新恢复接收数据
;注意事项:当函数返回1时用户无需调用usb_OUT_done()
;          只有返回0时才需要调用usb_OUT_done()进行手动收尾
;          强烈建议usb_OUT_callback返回1
;************************************************
USB_OUT_CALLBACK?:                       ;实现USB回调函数
    MOV     WR0,#WORD2 USBOUTBUFFER
    MOV     WR2,#WORD0 USBOUTBUFFER
    MOV     R6,#00H
    MOV     R7,OUTNUMBER
    ECALL   USB_SENDDATA?               ;数据原路返回
    SETB    C                           ;返回1
    ERET

;************************************************

TAB_STCISPCMD:
    DB      "@STCISP#",0

;************************************************

    END


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-10-20 17:18:04 | 显示全部楼层
全面进入 USB-1T-8051 时代
STC8H2K08U-48MHZ-TSSOP20,RMB <=1.2
STC8H2K08U-48MHZ-SOP16,RMB <=1.2
STC8H2K17U-48MHZ-TSSOP20,RMB <=1.3
STC8H2K17U-48MHZ-SOP16,RMB <=1.3
硬件USB支持 仿真/下载, RTC 实时时钟
真12位ADC, 16位高级PWM新增硬件移相功能
===已完成最后版图设计,主频仿真达到48MHz
截图202310201716127911.jpg

截图202310201718285442.jpg

截图202310201719054356.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-30 20:21:43

9

主题

62

回帖

697

积分

高级会员

积分
697
发表于 2023-12-11 21:58:03 | 显示全部楼层
本帖最后由 琪琪鸭 于 2023-12-11 21:59 编辑

我正在研究屠龙刀例程 18号(ucb-cdc) 和 36号(usb-cdc 转两路can)例程,虚拟出两个串口在哪里实现的  瞅一晚上了 感觉usb初始化程序一模一样,不多说了先磕一个,求大神解答。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-05-07 00:09:51

0

主题

43

回帖

144

积分

注册会员

积分
144
发表于 2023-12-12 10:15:36 来自手机 | 显示全部楼层
👍
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-04-30 00:26:42

0

主题

336

回帖

1490

积分

金牌会员

积分
1490
发表于 2024-3-7 17:36:59 | 显示全部楼层
学习了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:08 , Processed in 0.136817 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表