跟冲哥学习STC单片机心得之不停电下载USB-HID
在学习冲哥视频第4集之前的教程,我们的程序写入单片机都是通过先按下P3.2不放,再按下电源按钮,接着松开电源按钮,再放开P3.2。让STCISP软件识别到“STC-USB-Writer”后再点“下载/编程”写入程序到单片机。在第4集,冲哥讲到更便捷的不停电下载程序方法,并且高手必须会。
但是在跟着冲哥的视频一路敲代码下来,发现程序总是会报一堆乱七八糟的警告,编译无法通过,但是把冲哥教程的程序下载下来又可以编绎通过。在查找芯片手册半天也没有找到解决办法。
几次三番都想放弃了,后面想到冲哥的视频里多次出现学习单片机一定要耐烦,不能碰到一点小小问题就放弃。
后来在论坛搜索到神农鼎大哥推荐的B站的一个USB-HID不停电下载的视频,才在里面终于找到答案。
可以说这里面还是有几个坑的,我替大家踩过了,希望大家在学习这个不停电下载时能够跳过这几个坑。
当然也有可能是我逛论坛太少了,本着学习的态度,也记录下自己在学习单片机过程中的一些心得与体会吧。
USB-HID不停电下载操作步骤:
1.新建好工程,并将main.c主程序添加到工程内;
2.在main程序中引用“comm/stc32_stc8_usb.h”,并设置好“include path”;// 冲哥的视频是把要用的库文件和.h文件统一放到comm文件夹内
3.在“Options for Targer 'Target1'”中,将Memory mode改为“xsmall”,OUTPUT中Create HEX File画勾
4.添加stc_usb_hid_32.LIB库文件;
5.在“Options for Targer 'Target1'”的L251Misc中Misc control中添加“REMOVEUNUSED”;
6.按F7生成target files。
7.打开STCISP软件,在“收到用户命令后复位到ISP监控程序区”中勾选对应选项
其实主要编译不能通过是因为第3和第5点。请看我录制的操作视频
18
更新:不停电下载之使用USB-CDC,
与USB-HID对比,main.c主程序中的void sys_init()需要增加2行语句,
USBCLK = 0x00;
USBCON = 0x90;
在Options for Target 'Target1'中的选项设定与USB-HID一致,主要是修改memory mode为‘xsmall’,在L251 Misc中增加‘REMOVEUNUSED'。
添加stc_usb_cdc.LIB库到工程中,
Windows7的电脑操作系统需要在STCISP软件中安装USB-CDC串口驱动程序,Win10则不需要。
首次下载程序需要按P3.2+电源键进行USB-HID下载模式。程序下载入单片机后,会弹出USB-CDC(COM端口号)。
在“收到用户命令后复位到ISP监控程序区”中勾选USB-CDC/串口模式,
勾选“使用默认的内部自定义命令“@STCISP#””
“下次使用STC-HID接口进行ISP下载”
“每次下载前都先发送自定义命令”
即可在下次写入单片机程序时无需手动断电,可直接按“下载/编程”刷写程序。
我每次下载程序时,串口会从CDC模拟出来的变成USB writer1
然后再重新下载就可以了,我不知道这种操作是否是对的
1,下载走的是 USB-HID
2,下载成功立即复位到用户程序区,
跑的是你烧录入用户程序区的 USB-CDC程序
感谢啊!果然可以了 感觉STC越来越好玩了. hapyou 发表于 2024-3-2 23:18
感谢啊!果然可以了
89
目前测试也可以通过USB-HID收发数据。可以看下我这个视频。
/**************************************************************************
“通过USB HID协议打印数据信息”操作步骤:
1.新建好工程,并将main.c主程序添加到工程内,主程序需增加
if(bUsbOutReady)
{
USB_SendData(UsbOutBuffer,64);//发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //接收应答(固定格式)
}
2.在main程序中引用“comm/stc32_stc8_usb.h”,并设置好“include path”,打开stc32_stc8_usb.h,将
#define PRINTF_HID//printf输出直接重定向到USB HID接口printf函数重定向到USB输出数据,取消这行的注释,使其启用;
3.在“Options for Targer 'Target1'”中,将Memory mode改为“xsmall”,OUTPUT中Create HEX File画勾
4.添加stc_usb_hid_32.LIB库文件;
5.在“Options for Targer 'Target1'”的L251Misc中Misc control中添加“REMOVEUNUSED”;
6.按F7生成target files。
7.打开STCISP软件,在“收到用户命令后复位到ISP监控程序区”中勾选对应选项
**************************************************************************/
#include <STC32G.H>
#include "comm/stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void delay_ms(u16 ms)
{
u16 i;
do
{
i= MAIN_Fosc/6000;
while(--i);
} while(--ms);
}
void sys_init()
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
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; //设置为准双向口
//====== USB 初始化 ======
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
}
void main()
{
sys_init();//系统初始化
usb_init();//USB CDC 接口配置
EA = 1; //打开总中断
while (1)
{
if(bUsbOutReady)
{
USB_SendData(UsbOutBuffer,64);//发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //接收应答(固定格式)
}
if (!P33)
{
delay_ms(10);
if (!P33)
{
while (!P33);
printf("HELLO World!\r\n");//使用printf函数重定向到USB输出数据
}
}
if (!P34)
{
delay_ms(10);
if (!P34)
{
while (!P34);
printf("温度%2.1f\r\n",15.6);//使用printf函数重定向到USB输出数据
}
}
if (!P35)
{
delay_ms(10);
if (!P35)
{
while (!P35);
printf("湿度%2.1f\r\n",55.3);//使用printf函数重定向到USB输出数据
}
}
}
}
这个功能6啊{:5_332:} 不错,学习了
页:
[1]