找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2221|回复: 6
收起左侧

关于STC单片机串口下载代码长度的问题

[复制链接]
ID:87042 发表于 2019-10-23 08:50 | 显示全部楼层 |阅读模式
写了一个数码管显示的程序,用STC串口下载程序,第一次下载的代码长度为2C53H,稍作修改后,第二次下载的代码长度为2BEBH<2C53H,出现部分数码管位不能显示的情况,猜测可能出现代码储存覆盖情况,有同行遇到过这种情况的吗?怎么处理呢?
回复

使用道具 举报

ID:235200 发表于 2019-10-23 11:13 | 显示全部楼层
不会出现这种情况,应该还是程序修改后的问题
回复

使用道具 举报

ID:213173 发表于 2019-10-23 11:17 | 显示全部楼层
不是代码超长问题,如果代码超长STC-ISP会提示 “文件大小超出范围,超出部分已被自动截取” 。把你的MCU型号和代码贴上来帮你看看。
回复

使用道具 举报

ID:411550 发表于 2019-10-23 14:02 | 显示全部楼层
应该不会是代码超长的问题,可以再检查一下修改后的代码,或者贴上来帮你看看
回复

使用道具 举报

ID:87042 发表于 2019-10-23 14:47 | 显示全部楼层
wulin 发表于 2019-10-23 11:17
不是代码超长问题,如果代码超长STC-ISP会提示 “文件大小超出范围,超出部分已被自动截取” 。把你的MCU型 ...

两个程序文件A和B,A的代码长度>B的代码长度,只要烧录过A的板子,A的程序都能使数码管正常显示,但再烧录B,B就不能数码管正常显示了;但如果没有烧录过A的板子,B的程序都能使数码管正常显示。下面是对STC90C58RD+的EEPROM程序,看看有没有可能哪一步导致了这种情况
回复

使用道具 举报

ID:87042 发表于 2019-10-23 14:48 | 显示全部楼层


  1. #include "eeprom.h"
  2. /*
  3. stc90c58rd+
  4. 29K
  5. 58扇区
  6. 0x8000 - 0xF3FF
  7. 0x200/扇区(512Byte)
  8. */


  9. /*Define ISP/IAP/EEPROM command*/
  10. #define CMD_IDLE    0               //Stand-By
  11. #define CMD_READ    1               //unsigned char-Read
  12. #define CMD_PROGRAM 2               //unsigned char-Program
  13. #define CMD_ERASE   3               //Sector-Erase

  14. #define ENABLE_IAP 0x80           //if SYSCLK<40MHz

  15. void IapIdle();
  16. unsigned char IapReadByte(unsigned int addr);
  17. void IapProgramByte(unsigned int addr, unsigned char dat);
  18. void IapEraseSector(unsigned int addr);

  19. /********************************************************
  20. 函数功能: 禁用ISP / IAP / eepm功能
  21. 输入参数:
  22. 输出参数:
  23. 说    明:
  24. *********************************************************/
  25. void IapIdle()
  26. {
  27.     ISP_CONTR = 0;                 
  28.     ISP_CMD = 0;                    
  29.     ISP_TRIG = 0;                  
  30.     ISP_ADDRH = 0x80;               
  31.     ISP_ADDRL = 0;                 
  32. }

  33. /********************************************************
  34. 函数功能: 从ISP / IAP / eepm区域读一个字节
  35. 输入参数:
  36. 输出参数:
  37. 说    明:
  38. *********************************************************/
  39. unsigned char IapReadByte(unsigned int addr)
  40. {
  41.     unsigned char dat;                     

  42.     ISP_CONTR = ENABLE_IAP;  
  43.     ISP_CMD = 0xF8;      
  44.     ISP_CMD = CMD_READ;            
  45.     ISP_ADDRL = addr;              
  46.     ISP_ADDRH = addr >> 8;               
  47.     ISP_TRIG = 0x46;               
  48.     ISP_TRIG = 0xb9;         
  49.     _nop_();                        
  50.     dat = ISP_DATA;                 
  51.     IapIdle();                    

  52.     return dat;   
  53.        
  54. }
  55. /*
  56. void IAPReadNByte(unsigned int Add,unsigned char *pDat,unsigned char n)
  57. {
  58.         while(n--)
  59.         {
  60.                 *pDat++ = IapReadByte(Add++);
  61.         }
  62. }
  63. */
  64. /********************************************************
  65. 函数功能: 向EEPROM写入1unsigned char数据
  66. 输入参数:
  67. 输出参数:
  68. 说    明:
  69. *********************************************************/
  70. void IapProgramByte(unsigned int addr, unsigned char dat)
  71. {
  72.     ISP_CONTR = ENABLE_IAP;  
  73.     ISP_CMD = 0xF8;      
  74.     ISP_CMD = CMD_PROGRAM;         
  75.     ISP_ADDRL = addr;              
  76.     ISP_ADDRH = addr >> 8;         
  77.     ISP_DATA = dat;               
  78.     ISP_TRIG = 0x46;               
  79.     ISP_TRIG = 0xb9;               
  80.     _nop_();_nop_();_nop_();                       
  81.     IapIdle();
  82. }

  83. /********************************************************
  84. 函数功能: 擦除一个扇区数据
  85. 输入参数:
  86. 输出参数:
  87. 说    明:
  88. *********************************************************/
  89. void IapEraseSector(unsigned int addr)
  90. {
  91.     ISP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  92.     ISP_CMD = 0xF8;
  93.     ISP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
  94.     ISP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  95.     ISP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high            
  96.     ISP_TRIG = 0x46;               
  97.     ISP_TRIG = 0xb9;  
  98.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  99.     IapIdle();
  100. }
复制代码
回复

使用道具 举报

ID:213173 发表于 2019-10-23 18:07 | 显示全部楼层

STC90C58RD+的用户程序区最大可以保存32712字节,你的程序才11347字节,不可能超出。可能问题出在EEPROM存储区。建议下载时勾选“下次下载用户程序时擦除用户EEPRO区”试试。
无标题.jpg

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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