Ai8G1K17使用数据手册的例子实现自定义ISP功能,刷入ISP程序后,下载用户代码无反应
;------------------------------------------------
;/*定义常数*/
UARTBAUD EQU 0FEE0H ;定义串口波特率 (65536-11059200/4/9600)
ENABLE_IAP EQU 80H
;------------------------------------------------
;/*定义特殊功能寄存器*/
AUXR DATA 08EH ;附件功能控制寄存器
;BRT DATA 09CH ;波特率发生器
WDT_CONTR DATA 0C1H ;看门狗控制寄存器
IAP_DATA DATA 0C2H ;IAP数据寄存器
IAP_ADDRH DATA 0C3H ;IAP高地址寄存器
IAP_ADDRL DATA 0C4H ;IAP低地址寄存器
IAP_CMD DATA 0C5H ;IAP命令寄存器
IAP_TRIG DATA 0C6H ;IAP命令触发寄存器
IAP_CONTR DATA 0C7H ;IAP控制寄存器
IAP_TPS DATA 0F5H ;IAP等待时间控制器
;------------------------------------------------
;/*定义ISP模块使用的变量*/
ISPCODE EQU 03E00H ;ISP模块入口地址(1页),同时也是外部接口地址
APENTRY EQU 04000H ;应用程序入口地址数据(1页)
;------------------------------------------------
ORG 0000H
LJMP ISP_ENTRY ;系统复位入口
RESET:
MOV SCON,#50H ;设置串口模式(8为可变,无校验位)
MOV AUXR,#40H ;定时器1为1T模式
MOV TMOD,#00H ;定时器1工作于模式0(16位重装载)
MOV TH1,#HIGH UARTBAUD ;设置重载值
MOV TH1,#LOW UARTBAUD
SETB TR1
NEXT1:
MOV R0,#16
NEXT2:
JNB RI,$ ;等待串口数据
CLR RI
MOV A,SBUF
CJNE A,#7FH,NEXT1 ;判断是否为7F
DJNZ R0,NEXT2
LJMP ISP_DOWNLOAD ;跳转到下载界面
;------------------------------------------------
;ISP功能模块
;包括上电自检模块和代码更新模块
;------------------------------------------------
ORG ISPCODE
ISP_DOWNLOAD:
CLR A
MOV PSW,A ;ISP模块使用第0组寄存器
MOV IE,A ;关闭所有中断
CLR RI ;清除串口接收标志
SETB TI ;置串口发送标志
CLR TR0
MOV SP,#5FH ;设置堆栈指针
;------------------------------------------------
MOV A,#5AH ;返回5A 55到PC,表示ISP擦除模块已准备就绪
LCALL ISP_SENDUART
MOV A,#055H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收应答数据
MOV IAP_ADDRL,#0 ;首先在第2页起始地址写 "LJMP ISP_ENTRY"指令
MOV IAP_ADDRH,#02H
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV IAP_ADDRL,#0 ;用户代码地址从0开始
MOV IAP_ADDRH,#0
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;编程用户代码复位向量代码
MOV IAP_ADDRL,#0 ;新代码缓冲区地址
MOV IAP_ADDRH,#02H
MOV R7,#31 ;擦除15.5K字节
ISP_ERASEAP:
LCALL ISP_ERASEIAP
INC IAP_ADDRH ;目标地址+512
INC IAP_ADDRH
DJNZ R7,ISP_ERASEAP ;判断是否擦除完成
MOV IAP_ADDRL,#LOW APENTRY;用户代码复位入口页
MOV IAP_ADDRH,#HIGH APENTRY
LCALL ISP_ERASEIAP
MOV A,#5AH ;返回5A A5到PC,表示ISP编程模块已准备就绪
LCALL ISP_SENDUART
MOV A,#0A5H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收应答数据
LCALL ISP_RECVUART ;接收长度高字节
MOV R0,A
LCALL ISP_RECVUART ;接收长度低字节
MOV R1,A
CLR C ;将总长度-3
MOV A,#03H
SUBB A,R1
MOV DPL,A
CLR A
SUBB A,R0
MOV DPH,A ;总长度补码存入DPTR
LCALL ISP_RECVUART ;映射用户代码复位入口代码到映射区
LCALL ISP_PROGRAMIAP ;0000
LCALL ISP_RECVUART
LCALL ISP_PROGRAMIAP ;0001
LCALL ISP_RECVUART
LCALL ISP_PROGRAMIAP ;0002
MOV IAP_ADDRL,#03H ;用户代码起始地址
MOV IAP_ADDRH,#00H
ISP_PROGRAMNEXT:
LCALL ISP_RECVUART ;接收代码数据
LCALL ISP_PROGRAMIAP ;编程到用户代码区
INC DPTR
MOV A,DPL
ORL A,DPH
JNZ ISP_PROGRAMNEXT ;长度检测
ISP_SOFTRESET:
MOV IAP_CONTR,#20H ;软件复位系统
SJMP $
;------------------------------------------------
ISP_ENTRY:
MOV WDT_CONTR,#17H ;清看门狗
MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_TPS,#11 ;设置LAP等待时间参数
MOV IAP_ADDRL,#LOW ISP_DOWNLOAD
MOV IAP_ADDRH,#HIGH ISP_DOWNLOAD
MOV IAP_DATA,#00H ;测试数据1
MOV IAP_CMD,#1 ;读命令
MOV IAP_TRIG,#5AH ;触发ISP命令
MOV IAP_TRIG,#0A5H
MOV A,IAP_DATA
CJNE A,#0E4H,ISP_ENTRY ;测试是否可以读出数据
INC IAP_ADDRL ;测试地址EC01H
MOV IAP_DATA,#45H ;测试数据2
MOV IAP_CMD,#1 ;读命令
MOV IAP_TRIG,#5AH ;触发ISP命令
MOV IAP_TRIG,#0A5H
MOV A,IAP_DATA
CJNE A,#0F5H,ISP_ENTRY
MOV SCON,#50H ;设置串口模式(8为可变,无校验位)
MOV AUXR,#40H ;BRT工作于1T模式,启动BRT
MOV TMOD,#00H
MOV TH1,#HIGH UARTBAUD
MOV TL1,#LOW UARTBAUD
SETB TR1
SETB TR0
LCALL ISP_RECVUART ;检测是否有串口数据
JC GOTOAP
MOV R0,#16
ISP_CHECKNEXT:
LCALL ISP_RECVUART ;接收同步数据
JC GOTOAP
CJNE A,#7FH,GOTOAP ;判断是否为7F
DJNZ R0,ISP_CHECKNEXT
MOV A,#5AH ;返回5A 69到PC,表示ISP模块已准备就绪
LCALL ISP_SENDUART
MOV A,#69H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收应答数据
LJMP ISP_DOWNLOAD ;跳转到下载界面
GOTOAP:
CLR A ;将SFR恢复为复位值
MOV TCON,A
MOV TMOD,A
MOV TL0,A
MOV TH0,A
MOV TL1,A
MOV TH1,A
MOV SCON,A
MOV AUXR,A
LJMP APENTRY ;正常运行用户程序
;------------------------------------------------
;/*接收来自于上位机的串口应答数据*/
ISP_RECVACK:
LCALL ISP_RECVUART
JC GOTOAP
XRL A,#7FH
JZ ISP_RECVACK ;跳过同步数据
CJNE A,#25H,GOTOAP ;应答数据1检测
LCALL ISP_RECVUART
JC GOTOAP
CJNE A,#69H,GOTOAP
RET
;------------------------------------------------
;/*接收1字节串口数据*/
;/*出口参数: ACC (接收到的数据)*/
;/*出口参数: C (1:超时)*/
ISP_RECVUART:
CLR A
MOV TL0,A ;初始化超时定时器
MOV TH0,A
CLR TF0
MOV WDT_CONTR,#17H ;清看门狗
ISP_RECVWAIT:
JBC TF0,ISP_RECVTIMEOUT ;超时检测
JNB RI,ISP_RECVWAIT ;等待接收完成
MOV A,SBUF ;读取串口数据
CLR RI ;清除标志
CLR C ;正确接收串口数据
RET
ISP_RECVTIMEOUT:
SETB C ;超时退出
RET
;------------------------------------------------
;/*发送1字节串口数据*/
;/*入口参数: ACC (待发送的数据)*/
ISP_SENDUART:
MOV WDT_CONTR,#17H ;清看门狗
JNB TI,ISP_SENDUART ;等待前一个数据发送完成
CLR TI ;清除标志
MOV SBUF,A ;发送当前数据
RET
;------------------------------------------------
;/*擦除IAP扇区*/
ISP_ERASEIAP:
MOV WDT_CONTR,#17H ;清看门狗
;MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_CMD,#3 ;擦除命令
MOV IAP_TRIG,#5AH ;触发ISP命令
MOV IAP_TRIG,#0A5H
NOP
NOP
NOP
NOP
RET
;------------------------------------------------
;/*编程IAP字节*/
;/*入口参数: ACC (待编程的数据)*/
ISP_PROGRAMIAP:
MOV WDT_CONTR,#17H ;清看门狗
;MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_CMD,#2 ;编程命令
MOV IAP_DATA,A ;将当前数据送IAP数据寄存器
MOV IAP_TRIG,#5AH ;触发ISP命令
MOV IAP_TRIG,#0A5H
NOP
NOP
NOP
NOP
MOV A,IAP_ADDRL ;IAP地址+1
ADD A,#01H
MOV IAP_ADDRL,A
MOV A,IAP_ADDRH
ADDC A,#00H
MOV IAP_ADDRH,A
RET
;------------------------------------------------
ORG APENTRY
LJMP RESET
;------------------------------------------------
END
用户代码空间为0x0000~0x3dff,用户ISP区为0x3e00~0x3fff,复位入口映射区为0x4000~0x41ff,哪位兄弟做过,帮看看什么问题
根据您提供的代码片段及描述,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功能实现,确保各寄存器配置正确,以实现用户代码的正常烧录。
[本文内容由国芯人工智能辅助生成,仅供参考] 国芯人工智能 发表于 2025-8-2 13:53
根据您提供的代码片段及描述,STC8G1K17在实现自定义ISP功能时出现刷入ISP程序后下载用户代码无反应的问题 ...
这是官方手册给的例子啊
页:
[1]