- 打卡等级:初来乍到
- 打卡总天数:8
- 最近打卡:2025-03-18 20:40:21
中级会员
- 积分
- 345
|
发表于 2023-10-6 08:34:16
|
显示全部楼层
《STC MCU USB研讨会 - USB大型实战研讨会,冲哥重披战袍》 -- 2023/8/18 Fri
1、虚拟串口的应用:
方案一USB转TTL,外接typeC电脑串口通信
方案二:PCB板上SD卡槽
三: 外置USB转串口线升级程序(定制线)
四:使用USB功能,USB线联电脑,通过CDC进行数据交互 基于USB功能开发,通信块、稳定、校验可靠(车机)
USB-CDC功能
1、UCap 2、 P3.0 P3.1 usb 的 D- D+ 3、P3.2 HID下载,接上,外接上拉电阻,防止持续进入下载模式,不跑用户程序
1、USB库文件下载和工程搭建
1、库文件下载
2、库文件关联进Keil
3、Keil工程头文件
4、main.c文件,增加USB初始化代码
5、添加文件到工程
6、设置工程选项()target、output、L251 MISC
7、下载进MCU STC_ISP
8\CDC 串口出现
9、链接串口实现USB串口数据发接
10、CDC串口不停电下载!
没有使用的函数不编译 Warning消除 不占用程序内存
下载,主频24Mhz
代码分析:
#include "stc32g.h" 调用头文件
#include "stc32_stc8_usb.h"
#define FOSC 24000000UL 24MHz主频定义
char *USER_DEVICEDESC = NULL; CDC串口必用
char *USER_PRODUCTDESC = NULL; CDC串口必用
char *USER_STCISPCMD = "@STCISP#"; 不停电下载
void main()
{
WTST=0;
CKCON=0;
EAXFR=1; STC MCU速度更快的几行代码
P0M1=0x00; P0M0=0x00;
P1M1=0x00; P1M0=0x00;
P2M1=0x00; P2M0=0x00;
P3M1=0x00; P3M0=0x00;
P4M1=0x00; P4M0=0x00;
P5M1=0x00; P5M0=0x00;
P6M1=0x00; P6M0=0x00;
P7M1=0x00; P7M0=0x00; 引脚都初始化为准双向
P3M0 &=~0x03; // P3.0,P3.1 USB D-D+
P3M1 = 0x03; //P3.1
IRC48MCR=0x80; //使能内部USB专用时钟
while (!(IRC48MCR & 0x01)); 等它稳定了切换过去
USBCLK = 0x00;
USBCON = 0x90; 使能USB功能
usb_init(); 调用Lib初始化男塾
EUSB=1; 使能USB
EA=1; 打开总中断
while (DeviceState != DEVSTATE_CONFIGURED); 等USB配置完成
while (1)执行51函数
{
if (bUsbOutReady) 硬件接收完串口数据后,自动将bUsbOutReady位置1
{
USB_SendData(UsbOutBuffer,OutNumber); 接收字节数OutNumber 数据保存在UsbOutBuffer数组
USB_SendData 上位机发的发回来
usb_OUT_done();
关闭
}
}
}
串口助手调试
使用默认的内部自定义命令“@STCISP”
不停电下载, 程序自动跳转到烧录区域 IAP
基于Lib库的USB_CDC串口中断通信:
1、 删除原有的查询Lib库
2、粘贴带有interrupt的lib库
3、打开工程许纳泽新的lib库
4、删除原有的查询代码
5、增加USB中断代码,再中断里添加用户代码即可
void Delay3000ms() //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
while (1)
{
P20 = !P20;
Delay3000ms();
}
/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
返回0:USB会暂停接收串口数据,直到用户自行调用
usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
只有返回0时才需要调用usb_OUT_done()进行手动收尾
强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()
{
P21 = !P21;
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
return 1;
}
及时响应,立即中断
基于CDC串口的printf函数,printf的使用
#define PRINTF_HID
printf("HELLO STC\r\n");
Delay1000ms;
基于CDC串口发送特定指令获取参数
1、创建命令行
2、字符串比较函数
3、增加接收数据和零零行的比较,一样就执行
4、触发软件复位,从ISP开始执行
int strcmp(char *p1,char *p2)
{
int num=0;
for(;*p1!='\0'||*p2!='\0';p1++,p2++)
if(*p1!=*p2)
{
num=*p1-*p2;
break;
}
return num;
}
char i=0;
for( i=0;i<64;i++ )
UsbOutBuffer=0;
if (bUsbOutReady) //如果USB接收到数据
{
UsbOutBuffer[OutNumber] = '\0';
if( strcmp(UsbOutBuffer,CMD_ReadParm) == 0 )
{
// printf("需要获取的系统内部的关键信息!\r\n");
USBCON = 0x00; //清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
Delay1000ms();
IAP_CONTR = 0x60; //触发软件复位,从ISP开始执行
}
for( i=0;i<64;i++ )
UsbOutBuffer=0;
// USB_SendData(UsbOutBuffer,OutNumber); // 使用USB_SendData可向上位机发送数据
// 这里的代码为将接收到的数据原样返回
usb_OUT_done();
基于LIB库的USB-CDC转串口
1、移植串口的驱动,选择合适的主频,初始化串口
2、USB收到的数据通过串口发送出去
3、串口接收到的数据通过USB-CDC发出去
精确的主频选择,决定误差
波特率设置、串口初始化、串口中断
USBCDC转双串口 一箭双雕 烧录器功能 10MBPS (转双路CAN)
CDC COMMUNICATION DEVICE CLASS
1、USB硬件初始计划
2、编写读取函数和写入函数
3、配置USB中断
4、配置设备的设备描述符、标识符等等(自动执行识别和信息)
5、配置端点输入
6、配置端点输出
收藏:USB中文网 在线Unicode转换工具
代码讲解:首先主函数 第一步系统初始化 --提高访问速度、端口设置、P30P31高阻、 USB时钟, 第二部串口初始化函数、实现串口数据,选择引脚UART ,串口初始化寄存器配置, 为了方便USB读取数据(USB请求该数据发送上位机端)
第三步USB初始化函数, 串口结构体定义
void usb_init()
{
usb_write_reg(FADDR, 0x00); //¸üÐÂUSBµØÖ·ºÍ±£´æ¹¦ÄܵØÖ·
usb_write_reg(POWER, 0x08); //Ç¿ÖÆUSB¸´Î»Ò»ÏÂ
usb_write_reg(INTRIN1E, 0x3f); //¿ªÆôÎå¸öUSB¶ËµãµÄ·¢ËÍÖжÏ
usb_write_reg(INTROUT1E, 0x3f); //¿ªÆôÎå¸öUSB¶ËµãµÄ½ÓÊÜÖжÏ
usb_write_reg(INTRUSBE, 0x07); //¿ªÆôUSB¸´Î»£¬»Ø¸´£¬¹ÒÆðÐźÅÖжÏ
usb_write_reg(POWER, 0x00); //¹Ø±Õ¸´Î»
DeviceState = DEVSTATE_DEFAULT; //µ±Ç°É豸״̬ΪĬÈÏ
Ep0State.bState = EPSTATE_IDLE; //¶Ëµã0µÄ״̬Ϊ¿ÕÏÐ
InEpState = 0x00; //ËùÓж˵ãµÄ·¢ËÍλÇå0
OutEpState = 0x00; //ËùÓж˵ãµÄ½ÓÊÕλÇå0
UsbInBusy = 0; //ËùÓж˵ãµÄ·¢ËÍæµλÇå0
UsbOutBusy = 0; //ËùÓж˵ãµÄ½ÓÊÕæµλÇå0
RxRptr = 0; //´®¿ÚºÍUSBת·¢µÄÏà¹Ø´æ´¢±äÁ¿
RxWptr = 0;
TxRptr = 0;
TxWptr = 0;
EUSB = 1; //ÔÊÐíUSBÖжÏ
}
读取函数写入函数usb从指定寄存器读,往指定寄存器写
USB中断函数
发送和接收函数的处理
USB相关主机设置!USB协议实现!框架、模板基本不变
USB-HID通信
1、修改设备符等信息,新增HID信息表是
2、替换HID的class类
3、std请求 增加HID标识符信息
4、删除串口相关函数
5、usb端点1改为输出
6、增加读取和输出函数
UsbTreeView
基于HID协议的简易键盘
WINUSB通信 速度快 即插即用 基于VID PID的通讯手段
|
|