找回密码
 立即注册
查看: 98|回复: 3

Ai8G1K17使用数据手册的例子实现自定义ISP功能,刷入ISP程序后,下载用户代码无反应

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-08-02 13:48:04
已绑定手机

1

主题

1

回帖

19

积分

新手上路

积分
19
发表于 2025-8-2 13:48:04 | 显示全部楼层 |阅读模式
  1. ;------------------------------------------------
  2. ;/*定义常数*/
  3. UARTBAUD    EQU     0FEE0H                    ;定义串口波特率 (65536-11059200/4/9600)
  4. ENABLE_IAP EQU     80H
  5. ;------------------------------------------------
  6. ;/*定义特殊功能寄存器*/
  7. AUXR        DATA    08EH                    ;附件功能控制寄存器
  8. ;BRT         DATA    09CH                    ;波特率发生器
  9. WDT_CONTR   DATA    0C1H                    ;看门狗控制寄存器
  10. IAP_DATA    DATA    0C2H                    ;IAP数据寄存器
  11. IAP_ADDRH   DATA    0C3H                    ;IAP高地址寄存器
  12. IAP_ADDRL   DATA    0C4H                    ;IAP低地址寄存器
  13. IAP_CMD     DATA    0C5H                    ;IAP命令寄存器
  14. IAP_TRIG    DATA    0C6H                    ;IAP命令触发寄存器
  15. IAP_CONTR   DATA    0C7H                    ;IAP控制寄存器
  16. IAP_TPS     DATA    0F5H                    ;IAP等待时间控制器
  17. ;------------------------------------------------
  18. ;/*定义ISP模块使用的变量*/
  19. ISPCODE     EQU     03E00H                  ;ISP模块入口地址(1页),同时也是外部接口地址
  20. APENTRY     EQU     04000H                  ;应用程序入口地址数据(1页)
  21. ;------------------------------------------------
  22.             ORG     0000H
  23.             LJMP    ISP_ENTRY               ;系统复位入口
  24. RESET:
  25.             MOV     SCON,#50H               ;设置串口模式(8为可变,无校验位)
  26.             MOV     AUXR,#40H               ;定时器1为1T模式
  27.                         MOV     TMOD,#00H               ;定时器1工作于模式0(16位重装载)
  28.                         MOV     TH1,#HIGH UARTBAUD      ;设置重载值
  29.                         MOV     TH1,#LOW UARTBAUD
  30.             SETB    TR1
  31. NEXT1:
  32.             MOV     R0,#16
  33. NEXT2:
  34.             JNB     RI,$                    ;等待串口数据
  35.             CLR     RI
  36.             MOV     A,SBUF
  37.             CJNE    A,#7FH,NEXT1            ;判断是否为7F
  38.             DJNZ    R0,NEXT2
  39.             LJMP    ISP_DOWNLOAD            ;跳转到下载界面
  40. ;------------------------------------------------
  41. ;ISP功能模块
  42. ;包括上电自检模块和代码更新模块
  43. ;------------------------------------------------
  44.             ORG     ISPCODE
  45. ISP_DOWNLOAD:
  46.             CLR     A
  47.             MOV     PSW,A                   ;ISP模块使用第0组寄存器
  48.             MOV     IE,A                    ;关闭所有中断
  49.             CLR     RI                      ;清除串口接收标志
  50.             SETB    TI                      ;置串口发送标志
  51.             CLR     TR0
  52.             MOV     SP,#5FH                 ;设置堆栈指针
  53. ;------------------------------------------------
  54.             MOV     A,#5AH                  ;返回5A 55到PC,表示ISP擦除模块已准备就绪
  55.             LCALL   ISP_SENDUART
  56.             MOV     A,#055H
  57.             LCALL   ISP_SENDUART
  58.             LCALL   ISP_RECVACK             ;接收应答数据
  59.             MOV     IAP_ADDRL,#0            ;首先在第2页起始地址写 "LJMP ISP_ENTRY"指令
  60.             MOV     IAP_ADDRH,#02H
  61.             LCALL   ISP_ERASEIAP
  62.             MOV     A,#02H
  63.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  64.             MOV     A,#HIGH ISP_ENTRY
  65.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  66.             MOV     A,#LOW ISP_ENTRY
  67.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  68.             MOV     IAP_ADDRL,#0            ;用户代码地址从0开始
  69.             MOV     IAP_ADDRH,#0
  70.             LCALL   ISP_ERASEIAP
  71.             MOV     A,#02H
  72.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  73.             MOV     A,#HIGH ISP_ENTRY
  74.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  75.             MOV     A,#LOW ISP_ENTRY
  76.             LCALL   ISP_PROGRAMIAP          ;编程用户代码复位向量代码
  77.             MOV     IAP_ADDRL,#0            ;新代码缓冲区地址
  78.             MOV     IAP_ADDRH,#02H
  79.             MOV     R7,#31                 ;擦除15.5K字节
  80. ISP_ERASEAP:
  81.             LCALL   ISP_ERASEIAP
  82.             INC     IAP_ADDRH               ;目标地址+512
  83.             INC     IAP_ADDRH
  84.             DJNZ    R7,ISP_ERASEAP          ;判断是否擦除完成
  85.             MOV     IAP_ADDRL,#LOW APENTRY  ;用户代码复位入口页
  86.             MOV     IAP_ADDRH,#HIGH APENTRY
  87.             LCALL   ISP_ERASEIAP
  88.             MOV     A,#5AH                  ;返回5A A5到PC,表示ISP编程模块已准备就绪
  89.             LCALL   ISP_SENDUART
  90.             MOV     A,#0A5H
  91.             LCALL   ISP_SENDUART
  92.             LCALL   ISP_RECVACK             ;接收应答数据
  93.             
  94.             LCALL   ISP_RECVUART            ;接收长度高字节
  95.             MOV     R0,A
  96.             LCALL   ISP_RECVUART            ;接收长度低字节
  97.             MOV     R1,A
  98.             CLR     C                       ;将总长度-3
  99.             MOV     A,#03H
  100.             SUBB    A,R1
  101.             MOV     DPL,A
  102.             CLR     A
  103.             SUBB    A,R0
  104.             MOV     DPH,A                   ;总长度补码存入DPTR
  105.             
  106.             LCALL   ISP_RECVUART            ;映射用户代码复位入口代码到映射区
  107.             LCALL   ISP_PROGRAMIAP          ;0000
  108.             LCALL   ISP_RECVUART
  109.             LCALL   ISP_PROGRAMIAP          ;0001
  110.             LCALL   ISP_RECVUART
  111.             LCALL   ISP_PROGRAMIAP          ;0002
  112.             
  113.             MOV     IAP_ADDRL,#03H          ;用户代码起始地址
  114.             MOV     IAP_ADDRH,#00H
  115. ISP_PROGRAMNEXT:
  116.             LCALL   ISP_RECVUART            ;接收代码数据
  117.             LCALL   ISP_PROGRAMIAP          ;编程到用户代码区
  118.             INC     DPTR
  119.             MOV     A,DPL
  120.             ORL     A,DPH
  121.             JNZ     ISP_PROGRAMNEXT         ;长度检测
  122. ISP_SOFTRESET:
  123.             MOV     IAP_CONTR,#20H          ;软件复位系统
  124.             SJMP    $
  125. ;------------------------------------------------
  126. ISP_ENTRY:
  127.             MOV     WDT_CONTR,#17H          ;清看门狗
  128.             MOV     IAP_CONTR,#ENABLE_IAP   ;使能IAP功能
  129.                         MOV     IAP_TPS,#11             ;设置LAP等待时间参数
  130.             MOV     IAP_ADDRL,#LOW ISP_DOWNLOAD
  131.             MOV     IAP_ADDRH,#HIGH ISP_DOWNLOAD
  132.             MOV     IAP_DATA,#00H           ;测试数据1
  133.             MOV     IAP_CMD,#1              ;读命令
  134.             MOV     IAP_TRIG,#5AH           ;触发ISP命令
  135.             MOV     IAP_TRIG,#0A5H
  136.             MOV     A,IAP_DATA
  137.             CJNE    A,#0E4H,ISP_ENTRY                  ;测试是否可以读出数据
  138.             INC     IAP_ADDRL               ;测试地址EC01H
  139.             MOV     IAP_DATA,#45H           ;测试数据2
  140.             MOV     IAP_CMD,#1              ;读命令
  141.             MOV     IAP_TRIG,#5AH           ;触发ISP命令
  142.             MOV     IAP_TRIG,#0A5H
  143.             MOV     A,IAP_DATA
  144.             CJNE    A,#0F5H,ISP_ENTRY
  145.             MOV     SCON,#50H               ;设置串口模式(8为可变,无校验位)
  146.             MOV     AUXR,#40H               ;BRT工作于1T模式,启动BRT
  147.             MOV     TMOD,#00H
  148.                         MOV     TH1,#HIGH UARTBAUD
  149.                         MOV     TL1,#LOW UARTBAUD
  150.                         SETB    TR1
  151.             SETB    TR0
  152.             
  153.             LCALL   ISP_RECVUART            ;检测是否有串口数据
  154.             JC      GOTOAP
  155.             MOV     R0,#16
  156. ISP_CHECKNEXT:
  157.             LCALL   ISP_RECVUART            ;接收同步数据
  158.             JC      GOTOAP
  159.             CJNE    A,#7FH,GOTOAP           ;判断是否为7F
  160.             DJNZ    R0,ISP_CHECKNEXT
  161.             MOV     A,#5AH                  ;返回5A 69到PC,表示ISP模块已准备就绪
  162.             LCALL   ISP_SENDUART
  163.             MOV     A,#69H
  164.             LCALL   ISP_SENDUART
  165.             LCALL   ISP_RECVACK             ;接收应答数据
  166.             LJMP    ISP_DOWNLOAD            ;跳转到下载界面
  167. GOTOAP:
  168.             CLR     A                       ;将SFR恢复为复位值
  169.             MOV     TCON,A
  170.             MOV     TMOD,A
  171.             MOV     TL0,A
  172.             MOV     TH0,A
  173.                         MOV     TL1,A
  174.                         MOV     TH1,A
  175.             MOV     SCON,A
  176.             MOV     AUXR,A
  177.             LJMP    APENTRY                 ;正常运行用户程序
  178. ;------------------------------------------------
  179. ;/*接收来自于上位机的串口应答数据*/
  180. ISP_RECVACK:
  181.             LCALL   ISP_RECVUART
  182.             JC      GOTOAP
  183.             XRL     A,#7FH
  184.             JZ      ISP_RECVACK             ;跳过同步数据
  185.             CJNE    A,#25H,GOTOAP           ;应答数据1检测
  186.             LCALL   ISP_RECVUART
  187.             JC      GOTOAP
  188.             CJNE    A,#69H,GOTOAP
  189.             RET
  190. ;------------------------------------------------
  191. ;/*接收1字节串口数据*/
  192. ;/*出口参数: ACC (接收到的数据)*/
  193. ;/*出口参数: C (1:超时)*/
  194. ISP_RECVUART:
  195.             CLR     A
  196.             MOV     TL0,A                   ;初始化超时定时器
  197.             MOV     TH0,A
  198.             CLR     TF0
  199.             MOV     WDT_CONTR,#17H          ;清看门狗
  200. ISP_RECVWAIT:
  201.             JBC     TF0,ISP_RECVTIMEOUT     ;超时检测
  202.             JNB     RI,ISP_RECVWAIT         ;等待接收完成
  203.             MOV     A,SBUF                  ;读取串口数据
  204.             CLR     RI                      ;清除标志
  205.             CLR     C                       ;正确接收串口数据
  206.             RET
  207. ISP_RECVTIMEOUT:
  208.             SETB    C                       ;超时退出
  209.             RET
  210. ;------------------------------------------------
  211. ;/*发送1字节串口数据*/
  212. ;/*入口参数: ACC (待发送的数据)*/
  213. ISP_SENDUART:
  214.             MOV     WDT_CONTR,#17H          ;清看门狗
  215.             JNB     TI,ISP_SENDUART         ;等待前一个数据发送完成
  216.             CLR     TI                      ;清除标志
  217.             MOV     SBUF,A                  ;发送当前数据
  218.             RET
  219. ;------------------------------------------------
  220. ;/*擦除IAP扇区*/
  221. ISP_ERASEIAP:
  222.             MOV     WDT_CONTR,#17H          ;清看门狗
  223.             ;MOV     IAP_CONTR,#ENABLE_IAP   ;使能IAP功能
  224.             MOV     IAP_CMD,#3              ;擦除命令
  225.             MOV     IAP_TRIG,#5AH           ;触发ISP命令
  226.             MOV     IAP_TRIG,#0A5H
  227.                         NOP
  228.                         NOP
  229.                         NOP
  230.                         NOP
  231.             RET
  232. ;------------------------------------------------
  233. ;/*编程IAP字节*/
  234. ;/*入口参数: ACC (待编程的数据)*/
  235. ISP_PROGRAMIAP:
  236.             MOV     WDT_CONTR,#17H          ;清看门狗
  237.             ;MOV     IAP_CONTR,#ENABLE_IAP   ;使能IAP功能
  238.             MOV     IAP_CMD,#2              ;编程命令
  239.             MOV     IAP_DATA,A              ;将当前数据送IAP数据寄存器
  240.             MOV     IAP_TRIG,#5AH           ;触发ISP命令
  241.             MOV     IAP_TRIG,#0A5H
  242.                         NOP
  243.                         NOP
  244.                         NOP
  245.                         NOP
  246.             MOV     A,IAP_ADDRL             ;IAP地址+1
  247.             ADD     A,#01H
  248.             MOV     IAP_ADDRL,A
  249.             MOV     A,IAP_ADDRH
  250.             ADDC    A,#00H
  251.             MOV     IAP_ADDRH,A
  252.             RET
  253. ;------------------------------------------------
  254.             ORG     APENTRY
  255.             LJMP    RESET
  256. ;------------------------------------------------
  257.             END
复制代码
用户代码空间为0x0000~0x3dff,用户ISP区为0x3e00~0x3fff,复位入口映射区为0x4000~0x41ff,哪位兄弟做过,帮看看什么问题

ISP监控程序下载设置

ISP监控程序下载设置
回复

使用道具 举报 送花

3

主题

2076

回帖

1000

积分

等待验证会员

积分
1000
发表于 2025-8-2 13:53:00 | 显示全部楼层
根据您提供的代码片段及描述,STC8G1K17在实现自定义ISP功能时出现刷入ISP程序后下载用户代码无反应的问题。以下为对该问题的分析与建议:

首先,从代码结构来看,您已对部分IAP相关寄存器进行了定义,并设置了UARTBAUD值用于串口通信。但该代码尚未完整实现ISP功能的核心逻辑,例如IAP使能、地址设置、命令发送等关键步骤未被体现。

其次,ISP(In-System Programming)功能依赖于正确的IAP配置与触发流程。STC8G系列MCU支持通过串口进行ISP编程,但需确保以下几点:

1. IAP使能:需将IAPCONTR寄存器的IAPEN位置1,以启用IAP功能。
2. 命令与数据交互:IAPCMD寄存器用于指定操作类型(如读、写、擦除),IAPADDRH/IAPADDRL用于设定目标地址,IAPDATA用于传输数据。
3. 触发IAP操作:通过IAPTRIG寄存器发送触发信号,完成IAP操作。

此外,还需注意以下可能影响ISP功能正常运行的因素:
时钟配置:确保系统时钟稳定,波特率计算正确,避免因时钟不稳定导致通信失败。
电源与复位:ISP操作期间应保持稳定的供电,并确保MCU未处于复位状态。
代码逻辑完整性:当前代码仅定义了部分寄存器,缺少完整的ISP操作流程,可能导致无法正确执行烧录操作。

建议您补充完整的IAP操作流程,包括IAP使能、地址设置、数据写入、命令发送及触发等步骤,并验证波特率配置是否准确。同时,可参考STC官方提供的ISP示例代码,结合您的需求进行适配与调试。

综上所述,问题可能源于代码逻辑不完整或IAP配置不当。请检查并完善ISP功能实现,确保各寄存器配置正确,以实现用户代码的正常烧录。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-08-02 13:48:04
已绑定手机

1

主题

1

回帖

19

积分

新手上路

积分
19
发表于 2025-8-2 14:05:32 | 显示全部楼层
国芯人*** 发表于 2025-8-2 13:53
根据您提供的代码片段及描述,STC8G1K17在实现自定义ISP功能时出现刷入ISP程序后下载用户代码无反应的问题 ...

这是官方手册给的例子啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:155
  • 最近打卡:2025-08-11 11:49:33

766

主题

1万

回帖

1万

积分

管理员

积分
18648
发表于 2025-8-2 18:29:11 | 显示全部楼层
截图202508021829069609.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-11 13:19 , Processed in 0.110910 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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