找回密码
 立即注册
查看: 189|回复: 11

请教大佬AI8G1K08的debug问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-05-20 19:31:26
已绑定手机

15

主题

27

回帖

135

积分

注册会员

积分
135
发表于 2025-5-12 17:16:33 | 显示全部楼层 |阅读模式
我使用的是AI8G1K08的51单片机,用的是USB-Link1D进行的Debug,出现的问题是在Debug途中
下图是我的原理图和仿真器Link1D的接线情况:


(由于通过R10后的电压为2.5V能够供给工作电压,所以就没有接S-VCC电源线,只连接了Link1D和单片机的S-P3.0,S-P3.1,GND)




问题一:  首先点击debug按钮,到达debug界面后,temp_byte这个数组和sc他们两个的值并不是初始化的值
下图是我初始化的配置和出现问题的现象:

点击debug后,temp_byte这个数组和sc并不是初始值0



问题二:单步运行后,将temp_byte这个数组和sc赋值为0,如下图:

但是只要运行Timer0_Init();这个定时器0初始化函数,temp_byte数组和sc就会被赋为奇怪的值,如下图



您看这种情况是硬件的问题,还是程序的问题,或者是接线的问题呀?

回复

使用道具 举报 送花

3

主题

918

回帖

547

积分

等待验证会员

积分
547
发表于 2025-5-12 17:23:00 | 显示全部楼层
针对您在使用STC8G1K08调试过程中遇到的问题,结合提供的原理图和调试现象,现从硬件连接、代码逻辑和调试配置三个方面进行系统性分析并提供解决方案:

问题一:变量未显示初始化值
1. 电源配置隐患
现象关联性:尽管您提到通过R10分压后测得2.5V电压,但STC8G系列芯片正常工作要求电压范围为2.4V-5.5V(典型值为3.3V-5V)。若实际供电电压接近下限,可能引发以下问题:
芯片内核电压不稳定,导致SRAM初始化异常
调试器与芯片通信时序紊乱,影响初始内存状态同步
建议验证:
直接测量芯片VCC引脚电压(非分压点),确认是否≥2.7V
临时短接S-VCC与目标板VCC,观察变量初始化是否正常

2. 变量初始化机制
代码层验证:
检查全局变量是否通过data或xdata修饰符明确定义存储区域
  1. c
  2.   volatile uint8t tempbyte[8] @ 0x30;  // 强制指定data区地址
  3.   volatile uint8t sc @ 0x40;
复制代码
确认初始化代码是否在main()之前执行(检查STARTUP.A51文件)
添加硬件复位后的内存清零代码:
  1. c
  2.   void main() {
  3.       #ifdef DEBUG
  4.       memset(tempbyte, 0, sizeof(tempbyte));  // 强制初始化
  5.       sc = 0;
  6.       #endif
  7.       // ...后续代码
  8.   }
复制代码

3. 调试器配置优化
关键设置检查:
在Keil工程Options → Debug标签下:
确认"Load Application at Startup"已勾选
设置"Initialization File"指向正确的RAM初始化脚本
修改调试初始化脚本(.ini文件):
  1. SIGNAL void OnReset (void) {
  2.     WDWORD(0x40004000, 0x00000000);  // 清除调试状态寄存器
  3.     runPC(reset);
  4.   }
复制代码

问题二:单步运行时变量异常修改
1. 内存访问冲突分析
堆栈溢出检测:
在STARTUP.A51中扩大堆栈空间:
  1. ?STACK SEGMENT IDATA
  2.   RSEG  ?STACK
  3.   DS  80H  // 默认40H可能不足
复制代码
通过MAP文件检查变量地址分配:
  1. tempbyte   00000030H   DATA    8
  2.   sc          00000040H   DATA
复制代码
  确保与堆栈区(默认结束于0xFF)无重叠

2. 时序敏感性验证
插入调试屏障:
  1. c
  2.   asm {
  3.     NOP  // 插入硬件级同步点
  4.     NOP
  5.   }
复制代码
启用内存写保护:
  1. c
  2.   PSW2 |= 0x80;  // 开启扩展寄存器访问
  3.   WDTCONTR = 0x34;  // 启用看门狗监测异常
复制代码

3. 信号完整性排查
硬件改进措施:
在P3.0/P3.1增加22Ω串联电阻匹配阻抗
调试线缆长度控制在15cm以内
在VCC与GND间并联10μF+100nF电容

综合优化建议
1. 供电架构改进:
  
  1. plaintext
  2.    USB-Link1D S-VCC → 10Ω电阻 → 磁珠 → 目标板VCC
  3.                        │
  4.                        └─ 47μF钽电容
复制代码

2. 调试模式增强配置:
  
  1. c
  2.    void DebugInit() {
  3.        PCON &= 0x7F;    // 禁用低功耗模式
  4.        P3M0 &= ~0x03;   // P3.0/P3.1设为准双向模式
  5.        CLKDIV = 0x00;  // 时钟不分频
  6.    }
复制代码

3. 工程配置验证清单:
[ ] 芯片型号选择STC8G1K08-36I-SOP16
[ ] 调试频率设置为≤12MHz
[ ] 勾选"Erase EEPROM with Code"

建议通过以下顺序进行问题隔离:
1. 使用最小系统板(仅MCU+晶振+电源)复现问题
2. 对比测试官方示例工程的调试行为
3. 在变量地址处设置硬件数据断点:
  
  1. BSET 0x30,8  // 监控tempbyte数组写操作
复制代码

若上述措施仍未解决问题,建议提供以下补充信息:
完整的启动代码(STARTUP.A51)
编译生成的.M51地址映射文件
实际供电波形示波器截图(时基200ms/div)

此类问题通常由电源完整性、存储区冲突或调试时序失配共同导致,需通过系统化测试逐步定位。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-06-01 00:43:33
已绑定手机

79

主题

5024

回帖

8864

积分

超级版主

DebugLab

积分
8864
发表于 2025-5-12 17:46:05 | 显示全部楼层
不要在数据线上取电给VCC,除非有二极管、DC-DC、电荷泵等防倒灌和稳压电路,确保信号为低电平时不会影响供电,且高电平要强推挽以提供工作电流
数据异常问题:
https://www.stcaimcu.com/thread-16535-1-1.html
包含startup.a51时,默认会初始化data(也是idata的低128字节)为0,xdata不操作为上电随机数;不包含startup.a51时,data和xdata为上电随机数
程序只能在函数内执行,全局变量禁止在声明时赋值,赋值的语句必须在函数内,函数外的非声明语句无效
数组可以在初始化时用memset函数全部清零(或其他初始化值)
养成好习惯,函数内的局部变量也不要声明时赋值,而且必须在函数开头声明
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-05-20 19:31:26
已绑定手机

15

主题

27

回帖

135

积分

注册会员

积分
135
发表于 2025-5-13 14:22:06 | 显示全部楼层
Debu*** 发表于 2025-5-12 17:46
不要在数据线上取电给VCC,除非有二极管、DC-DC、电荷泵等防倒灌和稳压电路,确保信号为低电平时不会影响供 ...

您好,问题还是没有解决

我按照您说的进行了改正,不通过Link1D的数据线供电了是另外接电源供电,并且变量是在主函数中声明的初始值。
如下图:
截图202505131358207596.jpg
但是在一打开debug界面时,显示的temp_byte[]数组和sc的值,依旧是非常大的值。如下图
截图202505131401111201.jpg


单步执行代码,temp_byte[]数组和sc的值在运行到特定行赋值是正常的
但是只要整体运行,temp_byte[]数组和sc的值就不会被赋值:
截图202505131404293979.jpg
截图202505131406371279.jpg
截图202505131407183540.jpg



整体运行点击run,但是temp_byte[]数组和sc的值依然不会被赋值
截图202505131408455909.jpg
截图202505131409269092.jpg


您看是什么问题导致的呀?我把程序附带在这里面了,您要是可以帮我debug一下看看是不是我的代码问题,万分感谢!!
单片机型号是STC8G1K08,用的仿真器是USB-Link1D

截图202505131404228073.jpg

5.10解码程序P1.0收-定时器新.zip

387.69 KB, 下载次数: 1

点评

仿真仅供参考,具体以实际运行为准 仿真(就算是硬件仿真)存在诸多限制 请阅读新手必读: https://www.stcaimcu.com/thread-16535-1-1.html 仿真程序占用P3.0/P3.1口,但不占用串口1,用户程序可以将串口1切换到其  详情 回复 发表于 2025-5-13 15:51
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-06-01 10:43:50
已绑定手机

62

主题

1674

回帖

3782

积分

荣誉版主

无情的代码机器

积分
3782
发表于 2025-5-13 15:12:38 | 显示全部楼层

在8H开天斧开发板上USB和串口仿真都无法复现~,有没有别的型号可以对比测试下~
截图202505131511577330.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-05-20 19:31:26
已绑定手机

15

主题

27

回帖

135

积分

注册会员

积分
135
发表于 2025-5-13 15:41:39 | 显示全部楼层
erci*** 发表于 2025-5-13 15:12
在8H开天斧开发板上USB和串口仿真都无法复现~,有没有别的型号可以对比测试下~

...


您debug我这个代码,也是单步能赋值,但是run的话不能赋值嘛?



您按您的经验看这是什么原因导致的呀,是代码的问题,还是硬件的问题呀?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-06-01 00:43:33
已绑定手机

79

主题

5024

回帖

8864

积分

超级版主

DebugLab

积分
8864
发表于 2025-5-13 15:51:02 | 显示全部楼层
平*** 发表于 2025-5-13 14:22
您好,问题还是没有解决

我按照您说的进行了改正,不通过Link1D的数据线供电了是另外接电源供电,并且变 ...

仿真仅供参考,具体以实际运行为准
仿真(就算是硬件仿真)存在诸多限制
请阅读新手必读:
https://www.stcaimcu.com/thread-16535-1-1.html
仿真程序占用P3.0/P3.1口,但不占用串口1,用户程序可以将串口1切换到其它IO使用
仿真监控程序占用内部扩展RAM(XDATA)的最后768字节,程序使用XDATA+768字节不能大于芯片XDATA的上限
不能仿真时钟/复位相关的功能,例如程序里面不能修改系统时钟频率,不能开启看门狗,不能进入休眠/空闲模式
仿真通过P3.0/P3.1口与 KEIL 驱动进行通信,如P3.0/P3.1口数据受到干扰可能会导致仿真异常(如接触不良、P30/P31接了其他电路等)
单步仿真DPTR只能使用USB Link1D通过SWD仿真
使用USB或UART仿真,当停止运行用户代码时,定时器0~4会全部停止,此时和定时器相关的硬件都会停止,包括串口时钟、定时器中断、定时器时钟输出等
芯片的时钟不能在仿真时(Keil中)修改,只能在烧录时通过硬件选项设置
USB或UART仿真时,全速运行不能实时更新变量的值,因为USB或UART仿真是软件完成的,全速运行时CPU完全在执行用户程序,无法同时运行仿真程序,如此时运行仿真程序,就会影响用户程序的全速运行,所以不支持在全速运行时实时更新变量的值
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-06-01 10:43:50
已绑定手机

62

主题

1674

回帖

3782

积分

荣誉版主

无情的代码机器

积分
3782
发表于 2025-5-13 15:53:43 | 显示全部楼层
run 到端点是可以观察到赋值的。
全速run不进端点无法动态刷新的,这个是已知的。
截图202505131552098063.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-05-20 19:31:26
已绑定手机

15

主题

27

回帖

135

积分

注册会员

积分
135
发表于 2025-5-13 17:10:54 | 显示全部楼层
Debu*** 发表于 2025-5-13 15:51
仿真仅供参考,具体以实际运行为准
仿真(就算是硬件仿真)存在诸多限制
请阅读新手必读:

您好,我的keil编译之后显示下图:
截图202505131708372397.jpg
截图202505131709446493.jpg
我看您说仿真监控程序占用内部扩展RAM(XDATA)的最后768字节,程序使用XDATA+768字节不能大于芯片XDATA的上限
我这个程序是不是因为占用的Xdata过大,所以导致的错误呀?
应该怎么改进呀

点评

是的,755+768大于1024 小工程我都不仿真(那么简单一看就知道怎么回事了,代码写完,人脑都仿真完了),写完直接正式运行 疑难杂症或大工程才可能使用一下仿真功能(还有学生学习) 写完代码,想看什么数据用printf  详情 回复 发表于 2025-5-13 17:40
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-05-20 19:31:26
已绑定手机

15

主题

27

回帖

135

积分

注册会员

积分
135
发表于 2025-5-13 17:11:29 | 显示全部楼层
erci*** 发表于 2025-5-13 15:53
run 到端点是可以观察到赋值的。
全速run不进端点无法动态刷新的,这个是已知的。
...

您好,我的keil编译之后显示下图:
截图202505131713478978.jpg
截图202505131713271939.jpg
我看说仿真监控程序占用内部扩展RAM(XDATA)的最后768字节,程序使用XDATA+768字节不能大于芯片XDATA的上限
我这个程序是不是因为占用的Xdata过大,所以导致的错误呀?
应该怎么改进呀大佬


点评

我没这个型号,您可以自己新建个工程对比下就知道了。 可以论坛积分兑换个内存大的开发板仿真调试代码,调完目标芯片烧录就行。  详情 回复 发表于 2025-5-13 17:23
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-1 20:22 , Processed in 0.158202 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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