找回密码
 立即注册
查看: 926|回复: 9

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

[复制链接]
  • TA的每日心情
    开心
    2023-12-12 20:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    49

    主题

    34

    回帖

    1163

    积分

    管理员

    积分
    1163
    发表于 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, 下载次数: 124

    stc32g_cdc_demo_asm.zip

    106.81 KB, 下载次数: 99

    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

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

    截图202310201124495973.jpg

    截图202310201126106915.jpg

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 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


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

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

    以下 STC32G12K128

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

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

    截图202310201132432635.jpg

    截图202310201134427638.jpg


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 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


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 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


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 11:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    7

    主题

    46

    回帖

    383

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-30 00:51
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    0

    主题

    44

    回帖

    138

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 59 天

    [LV.5]常住居民I

    0

    主题

    183

    回帖

    364

    积分

    中级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 06:28 , Processed in 0.071418 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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