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
//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
以上 STC8H8K64U
以下 STC32G12K128
STC32G12K128
// 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
全面进入 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:59 编辑
我正在研究屠龙刀例程 18号(ucb-cdc) 和 36号(usb-cdc 转两路can)例程,虚拟出两个串口在哪里实现的瞅一晚上了 感觉usb初始化程序一模一样,不多说了先磕一个{:4_197:},求大神解答。 👍 学习了