请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 3950|回复: 35

用户自定义命令实现ISP不停电下载-串口命令模式-STC8H

[复制链接]
  • TA的每日心情
    开心
    2024-1-4 08:56
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    16

    主题

    702

    回帖

    2460

    积分

    超级版主

    积分
    2460
    发表于 2023-2-13 22:54:19 | 显示全部楼层 |阅读模式
    本帖目的:
          实现用户自定义串口命令实现不停电自动ISP下载的功能

    实现原理:
          STC-ISP下载软件检测到用户代码发生改变时,会首先通过串口发送一串用户自定义的命令序列,然后立即进入ISP下载开始发送握手命令7F
          用户程序在运行用户代码过程中需要实时监控串口命令是否是正确的用户自定义命令序列,如果正确则通过触发软复位使单片机复位到系统ISP,即可实现不停电下载

    参考代码:
    1. #include "stc8h.h"
    2. #include "stdio.h"
    3. #include "intrins.h"
    4. #define FOSC        11059200UL                  //定义工作频率
    5. #define BAUD        (65536 - FOSC/4/115200)     //定义串口波特率重装值
    6. //#define BRT_T1                                //使用定时器1当作串口波特率发生器
    7. #define BRT_T2                                  //使用定时器2当作串口波特率发生器
    8. typedef bit BOOL;
    9. typedef unsigned char BYTE;
    10. BOOL fBusy;                                     //串口发送忙标志
    11. BYTE bStage;                                    //用户自定义命令检测阶段
    12. void delay_ms(int n);
    13. void CheckCustomCmd(BYTE dat);
    14. void main()
    15. {
    16.     P0M0 = 0; P0M1 = 0;                         //端口模式初始化
    17.     P1M0 = 0; P1M1 = 0;
    18.     P2M0 = 0; P2M1 = 0;
    19.     P3M0 = 0; P3M1 = 0;
    20.     P4M0 = 0; P4M1 = 0;
    21.     P5M0 = 0; P5M1 = 0;
    22.    
    23. #if defined BRT_T1
    24.     AUXR = 0x40;                                //使用定时器1作为串口波特率发生器
    25.     TMOD = 0x00;
    26.     TL1 = BAUD;
    27.     TH1 = BAUD >> 8;
    28.     TR1 = 1;
    29. #elif defined BRT_T2
    30.     T2L = BAUD;                                 //使用定时器2作为串口波特率发生器
    31.     T2H = BAUD >> 8;
    32.     AUXR = 0x15;
    33. #else
    34.     #error "Baudrate generator select error !"
    35. #endif
    36.     SCON = 0x50;
    37.     ES = 1;
    38.     EA = 1;
    39.     fBusy = 0;                                  //初始化用户变量
    40.     bStage = 0;
    41.    
    42.     printf("STC8H系列串口自定义测试程序 !");
    43.    
    44.     while (1);
    45. }
    46. void uart_isr() interrupt 4
    47. {
    48.     if (TI)
    49.     {
    50.         TI = 0;
    51.         fBusy = 0;
    52.     }
    53.    
    54.     if (RI)
    55.     {
    56.         RI = 0;
    57.         CheckCustomCmd(SBUF);                   //检测命令序列
    58.     }
    59. }
    60. char putchar(char dat)                          //重定义putchar系统函数
    61. {
    62.     while (fBusy);
    63.     fBusy = 1;
    64.     SBUF = dat;
    65.    
    66.     return dat;
    67. }
    68. void CheckCustomCmd(BYTE dat)                   //检测命令序列:"@STCISP#"
    69. {
    70.     switch (bStage++)
    71.     {
    72.     default:
    73. L_Check1st:
    74.     case 0:                                     //检测命令头
    75.         bStage = (dat == '@');
    76.         break;
    77.     case 1:
    78.         if (dat != 'S') goto L_Check1st;
    79.         break;
    80.     case 2:
    81.         if (dat != 'T') goto L_Check1st;
    82.         break;
    83.     case 3:
    84.         if (dat != 'C') goto L_Check1st;
    85.         break;
    86.     case 4:
    87.         if (dat != 'I') goto L_Check1st;
    88.         break;
    89.     case 5:
    90.         if (dat != 'S') goto L_Check1st;
    91.         break;
    92.     case 6:
    93.         if (dat != 'P') goto L_Check1st;
    94.         break;
    95.     case 7:
    96.         if (dat != '#') goto L_Check1st;
    97.         delay_ms(10);                           //检测到正确的命令序列后复位到系统区,此处的延时可省去
    98.         IAP_CONTR = 0x60;                       //复位到系统区
    99.         break;
    100.     }
    101. }
    102. void delay_ms(int n)                            //毫秒延时子程序
    103. {
    104.     int i;
    105.    
    106.     while (n--)
    107.     {
    108.         i = 1000;
    109.         while (i--);
    110.     }
    111. }
    复制代码

    软件设置:
    用户自定义ISP下载 —— 串口命令-1.png
    下软件进行如上图所示的下列步骤:
    1、选择正确的单片机型号
    2、选择正确的串口号
    3、打开目标HEX文件(建议首先直接使用本贴的范例,不要修改)
    4、选择“收到用户命令后复位到系统监控程序区”属性页
    5、根据用户代码对串口的波特率、校验位进行设置
    6、设置用户自定义命令(本范例使用的是默认命令“@STCISP#”)
    7、勾选每次下载前都先发自定义命令
    8、勾选“每次下载前都重装目标文件”选项和“目标文件发送变化时自动发送下载命令”选项
    完成上面步骤后,下次只要重新编译项目并生成行的目标HEX,下载软件就可实现不停电自动下载了

    注意:第一次必须使用串口进行正常下载,因为第一次下载时自定义命令还无效



    custom-com-isp.rar

    12.23 KB, 下载次数: 124

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 78 天

    [LV.6]常住居民II

    69

    主题

    509

    回帖

    1738

    积分

    超级版主

    积分
    1738
    QQ
    发表于 2023-2-14 13:16:08 | 显示全部楼层
    已测试 很顺畅
    热线19952583534
    www.STCAI.com

    该用户从未签到

    538

    主题

    8732

    回帖

    1万

    积分

    管理员

    积分
    14189
    发表于 2023-2-14 13:39:38 | 显示全部楼层
    好,详细正确,大家直接使用
  • TA的每日心情
    开心
    前天 13:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    31

    主题

    79

    回帖

    639

    积分

    高级会员

    积分
    639
    发表于 2023-2-18 23:31:29 | 显示全部楼层
    通常调试程序的步骤是,编译完程序,无错误、无警告。点击Keil中的仿真按钮开始仿真(其它工作之前都已经做好)。想要修改程序,总是再点击Keil的调试按钮,停止调试并回到代码编辑模式。这时程序完全都停止了。整个程序都不运行,监控代码有何用?再者,要进行调试P3.0和P3.1被占用。ISP都是从这两个引脚通讯写入,怎么能实现串口通讯的不停电自动下载?

    该用户从未签到

    3

    主题

    51

    回帖

    473

    积分

    中级会员

    积分
    473
    发表于 2023-4-28 20:56:50 | 显示全部楼层
    楼主给出的只是进入不停电下载的办法,并不是要占用主串口的意思。
    其实在任何一个芯片的代码中只要打开了串口,或者USB CDC/USB HID,在接收数据处理的程序中加入下列代码:

    定义一个字符串:
    char *USER_STCISPCMD = "@STCISP#";                      //不停电自动ISP下载命令,这个命i令可以随意设置,喜欢就行
    1。无USB的串口:
                            // 判别是不是下载命令。strncmp对比较的两个字符串前后无所谓,不影响判别结果
                            if(!strncmp(Rx_Buffer,USER_STCISPCMD,strlen(USER_STCISPCMD)))
                            {
                                    IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行
                            }
    2。USB CDC/HID
                            if(!strncmp(Rx_Buffer,USER_STCISPCMD,strlen(USER_STCISPCMD)))
                            {
                                    USBCON = 0x00;      //清除USB设置
                                    USBCLK = 0x00;
                                    IRC48MCR = 0x00;
                                    DelaymS(10);             // 此处等待10mS
                                    IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行
                                    while (1);
                            }
    这并不影响主程序的运行与DEBUG
    普通串口或带USB的CDC如楼主所述做ISP软件设置,HID勾选右侧的HID,
    最关键是必须要勾选最后一条:“每次下载前都先发送自定义命令”
    这样,只要是STC的芯片,开了串口就能不断电自动下载,很顺畅
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 92 天

    [LV.6]常住居民II

    3

    主题

    85

    回帖

    1313

    积分

    超级版主

    积分
    1313
    发表于 2023-5-29 16:19:20 | 显示全部楼层
    最新的下载软件截图

    1.png

    www.STCAI.com
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 51 天

    [LV.5]常住居民I

    8

    主题

    153

    回帖

    590

    积分

    高级会员

    热心市民

    积分
    590
    发表于 2023-6-28 15:32:29 | 显示全部楼层
    对于使用CH340之类接口的系统板,目前STC-ISP提供的自定义命令接口的最大波特率为115200,这个波特率可否增加更高的档位或者支持用户自行编辑
    睁开眼睛做场梦,我是DIYer晓飛飛
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 122 天

    [LV.7]常住居民III

    13

    主题

    244

    回帖

    699

    积分

    高级会员

    积分
    699
    发表于 2023-11-26 14:53:32 | 显示全部楼层
    好资料,学习并收藏了,谢谢分享!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    前天 10:58
  • 签到天数: 54 天

    [LV.5]常住居民I

    1

    主题

    62

    回帖

    238

    积分

    中级会员

    积分
    238
    发表于 2023-11-26 17:51:54 | 显示全部楼层
    好办法,学习了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-2 06:42
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    0

    主题

    11

    回帖

    146

    积分

    注册会员

    积分
    146
    发表于 2023-12-3 11:52:37 | 显示全部楼层
    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-3-29 15:32 , Processed in 0.074727 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表