找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5115|回复: 5
收起左侧

关于STC15W系列的片内扩展RAM的问题

[复制链接]
ID:162622 发表于 2017-2-9 19:41 | 显示全部楼层 |阅读模式
最近买了几片STC15W4K58S4芯片,今天在作片内扩展RAM验证发现一个不好理解的现象,在主函数外编一个写片内扩展RAM的函数,主函数调用不能向下运行,但把这个函数的代码复制到主程序中却能运行.先发问题程序
#include"stc15.h"
unsigned char xdata RAM[256];  //声明片内扩展RAM区数组
//*************************************************
void GPIO_config(void)
{
P5M0 = 0x00;  //设置P5.5为准双向口
P5M1 = 0x00;
}
//**********************************************
   void  delay_ms(unsigned char ms)
{
     unsigned int i;
  do{
       i = 12000000 / 13000;
    while(--i) ;  
      }while(--ms);
}
/******************************************************
***************    写数组函数***************************/
void Write_ram()
{  unsigned char i;        //  把这
   for(i=0;i<=255;i++)   // 部 分 代 码
   {                              //放在主函数
  RAM[i]=255-i;          //  中能运行
   }                          // 而写成一个函数调用不行是为什么
}
//*********************************************************
void main (void)
{
    unsigned char i,j;
     GPIO_config();
     P55=0;          //能执行到此
       Write_ram();   //执行到此不能住下运行
     P55=1;       //没能到此
     while(1)
                {
                  for(i=0;i<+255;i++)
                          {
                             j=RAM[i];
                             delay_ms(200);
                              delay_ms(200);
                              delay_ms(200);
                               delay_ms(200);
                               delay_ms(200);
                               P55=~P55;    //通过P55口的状态看程序的运行
                          }
                   }
}
*******************************************************************************************************************
下面是能运行的程序
********************************************************************************************************************
#include"stc15.h"
unsigned char xdata RAM[256];
void GPIO_config(void)
{
P5M0 = 0x00;  //设置P5.5为准双向口
P5M1 = 0x00;
}
   void  delay_ms(unsigned char ms)
{
     unsigned int i;
  do{
       i = 12000000 / 13000;
    while(--i) ;  
      }while(--ms);
}
/*********************************
void Write_ram()
{  unsigned char i;    //  把这
   for(i=0;i<=255;i++)   // 部 分 代 码
   {       //放在主函数
  RAM[i]=255-i;    //  中能运行
   }        // 而写成一个函数调用不行是为什么
}
**********************************************/
void main (void)
{  unsigned char i,j;
   GPIO_config();
   P55=0;
//  Write_ram();   //执行到此不能住下运行
    while(1)
     {
    for(i=0;i<+255;i++)
       {
       RAM[i]=255-i;     //这里写
       j=RAM[i];      //这里读
       delay_ms(200);
       delay_ms(200);
       delay_ms(200);
       delay_ms(200);
       delay_ms(200);
       P55=~P55;
        }
       }
}

回复

使用道具 举报

ID:123289 发表于 2017-2-12 08:12 | 显示全部楼层
51单片机的取指只能从程序存储区取,不能从XRAM区中取!
回复

使用道具 举报

ID:164349 发表于 2017-2-12 19:13 | 显示全部楼层
51单片机的取指只能从程序存储区取,不能从XRAM区中取
回复

使用道具 举报

ID:1039019 发表于 2022-7-10 09:54 | 显示全部楼层
无论 main() 还是 Write Ram()的程序代码,都是指令, 对扩展ram区  的 RAM[] 操作,为何,调用Write Ram()不好使? 是数据访问有什么冲突?
回复

使用道具 举报

ID:624769 发表于 2022-7-10 14:13 | 显示全部楼层
{  unsigned char i;    //  这个是  0~255
   for(i=0;i<=255;i++)   // 这个循环条件会永远满足
   {       //放在主函数
  RAM=255-i;    //  中能运行
   }        // 所以,你程序会死在这里出不去, 和 Xdata 没有任何关系
}

两个方案:
一: unsigned char i;  改成: unsigned short i;


二:
   for(i=0;i<255;i++)   // 这个循环少一次
   {      
  RAM=255-i;   
   }

  RAM=255-i;    // 出循环后补运行一次



两个方案,二选一。
回复

使用道具 举报

ID:47286 发表于 2022-7-10 14:41 来自手机 | 显示全部楼层
188610329 发表于 2022-7-10 14:13
{  unsigned char i;    //  这个是  0~255
   for(i=0;i

一语中的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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