admin 发表于 2023-10-20 11:03:39

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

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



神农鼎 发表于 2023-10-20 11:26:46







神农鼎 发表于 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)
   
    PUBLICUSER_DEVICEDESC
    PUBLICUSER_PRODUCTDESC
    PUBLICUSER_STCISPCMD
    PUBLICUSB_OUT_CALLBACK

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

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

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

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

    CSEG    AT0000H
    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


神农鼎 发表于 2023-10-20 11:30:52

以上 STC8H8K64U

以下 STC32G12K128

神农鼎 发表于 2023-10-20 11:32:24

STC32G12K128







神农鼎 发表于 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)

    PUBLICUSER_DEVICEDESC
    PUBLICUSER_PRODUCTDESC
    PUBLICUSER_STCISPCMD
    PUBLICUSB_OUT_CALLBACK?

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

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

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

    CSEG    AT0000H
    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


神农鼎 发表于 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







琪琪鸭 发表于 2023-12-11 21:58:03

本帖最后由 琪琪鸭 于 2023-12-11 21:59 编辑

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

略略略 发表于 2023-12-12 10:15:36

👍

xxxevery 发表于 2024-3-7 17:36:59

学习了
页: [1]
查看完整版本: 51 开源 汇编语言调用USB-CDC库文件实现USB-CDC虚拟串口通信,取代传统串口