dumon 发表于 2024-2-20 22:09:25

跟冲哥学习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

dumon 发表于 2024-2-21 13:53:14

更新:不停电下载之使用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下载”
“每次下载前都先发送自定义命令”
即可在下次写入单片机程序时无需手动断电,可直接按“下载/编程”刷写程序。

peterwangjp 发表于 2024-2-29 19:36:47

我每次下载程序时,串口会从CDC模拟出来的变成USB writer1
然后再重新下载就可以了,我不知道这种操作是否是对的

神农鼎 发表于 2024-2-29 21:23:51

1,下载走的是 USB-HID
2,下载成功立即复位到用户程序区,
      跑的是你烧录入用户程序区的 USB-CDC程序

hapyou 发表于 2024-3-2 23:18:45

感谢啊!果然可以了

xiangzichen 发表于 2024-3-3 00:34:20

感觉STC越来越好玩了.

dumon 发表于 2024-3-7 18:36:49

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输出数据
                        }
      }
    }
}

冷月烟 发表于 2024-3-11 15:56:20

这个功能6啊{:5_332:}

xxxevery 发表于 2024-3-12 09:30:07

不错,学习了
页: [1]
查看完整版本: 跟冲哥学习STC单片机心得之不停电下载USB-HID