找回密码
 立即注册
查看: 10799|回复: 66

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

  [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

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

实现原理:
      AI-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, 下载次数: 367

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2023-2-14 13:16:08 | 显示全部楼层
已测试 很顺畅
热线19952583534
www.STCAI.com
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2023-2-14 13:39:38 | 显示全部楼层
好,详细正确,大家直接使用
  • 打卡等级:以坛为家I
  • 打卡总天数:244
  • 最近打卡:2025-05-01 15:50:20

49

主题

129

回帖

1361

积分

金牌会员

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

3

主题

51

回帖

487

积分

中级会员

积分
487
发表于 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的芯片,开了串口就能不断电自动下载,很顺畅
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:373
  • 最近打卡:2025-04-30 11:37:36
已绑定手机

9

主题

211

回帖

2718

积分

超级版主

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

1.png

www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:72
  • 最近打卡:2024-09-16 17:20:55

1

主题

62

回帖

310

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-05-01 06:53:24

0

主题

12

回帖

787

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-05-07 00:09:51

0

主题

43

回帖

144

积分

注册会员

积分
144
发表于 2023-12-11 09:53:42 来自手机 | 显示全部楼层
👍
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:31 , Processed in 0.184035 second(s), 122 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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