国学芯用 发表于 2026-6-30 14:06:35

35-板载焊接的外部扩展32K xdata测试程序,AI8051U实验箱演示程序

35-板载焊接的外部扩展32K xdata测试程序,AI8051U实验箱演示程序

主程序main.C代码如下(汇编版本在附件中):

/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

/*************功能说明    **************



本例程基于AI8051U为主控芯片的实验箱进行编写测试。

使用Keil C51编译器,为了达到比较高的效率,一般建议选择"Small"模式。

当编译器出现 "error C249: 'DATA': SEGMENT TOO LARGE" 错误时,则需要手动将部分比较大的数组通过"xdata" 强制分配到 XDATA 区域(例如: char xdata buffer ;)

测试外挂的32K xdata程序。
测试方式:
1: 写入0x55, 并读出判断是否全部是0x55.
2: 写入0xaa, 并读出判断是否全部是0xaa.
3: 写入32768字节的汉字字库(类似于随机数据), 并读出比较.

通过串口2发送单个字符x或X, 开始测试, 并返回相关的测试结果.

串口设置115200bps, 8, N, 1. 切换到P4.6 P4.7.

下载时, 选择时钟 22.1184MHz (用户可自行修改频率).

******************************************/

#include "..\comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"
#include "Uart2.h"


#define   ExternalRAM_enable()      AUXR |=2      //允许外部XRAM,禁止使用内部扩展RAM
#define   InternalRAM_enable()      AUXR &= ~2      //禁止外部XRAM,允许使用内部扩展RAM


extern unsigned char code hz[];

/*************本地常量声明    **************/

#define   XDATA_LENTH   32768   //xdata长度
#define   HZK_LENTH       32768   //字库长度

#define   BUS_SPEED_1T()BUS_SPEED = 0
#define   BUS_SPEED_2T()BUS_SPEED = 1
#define   BUS_SPEED_4T()BUS_SPEED = 2
#define   BUS_SPEED_8T()BUS_SPEED = 3


/*************本地变量声明    **************/


void    delay_ms(u8 ms);
u8      TestXRAM(void);
void    TxErrorAddress(void);
void    Xdata_Test(void);

void    delay_ms(u8 ms);
void    RX2_Check(void);
void    PrintString2(u8 *puts);
void    UART2_TxByte(u8 dat);


/***************** 主函数 *****************************/
void main(void)
{
    WTST = 0;
    P_SW2 |= 0x80;//扩展寄存器(XFR)访问使能
    CKCON = 0;
    RSTFLAG |= 0x01;
//    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P1M1 = 0x30;   P1M0 = 0x30;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
//    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
//    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
//    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x30;   P1M0 = 0x00;   //设置为准双向口,P1.4,P1.5设置高阻输入
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      P0BP = 0x00;    //设置硬件自动控制P0口模式(默认由P0M1/P0M0控制)

    delay_ms(10);
    UART2_config();
    EA = 1;   //全局中断允许
    P41 = 0;    //扩展SRAM使能
    P27 = 0;    //最高地址位置零

    printf("AI8051U xdata test programme!\n"); //UART2发送一个字符串
    printf("send x or X start test.\n");

    BUS_SPEED_2T(); //1T2T4T8T    3V@22MHZ用1T会访问错误
    BUS_SPEED |= 0x40;      //选择 P3.7为RD,P3.6为WR
    ExternalRAM_enable();   //允许外部XDATA
//InternalRAM_enable();   //允许内部XDATA

    while (1)
    {
      delay_ms(1);
      if(RX2_Cnt > 0)   //超时计数
      {
            if(--RX2_Cnt == 0)//串口通讯结束
            {
                RX2_Cnt = 0;
                                                                Xdata_Test();   //单字节命令
            }
      }
    }
}

//========================================================================
// 函数: void delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}


/*************测试xdata函数 *****************/
u8TestXRAM(void)
{
    u16 ptc;
    u8xdata *ptx;
    u16 i,j;

    for(ptx=0; ptx<XDATA_LENTH; ptx++)*ptx = 0x55;    //测试是否有位短路
    for(ptx=0; ptx<XDATA_LENTH; ptx++)if(*ptx != 0x55)    return 1;   //测试0x55错误

    for(ptx=0; ptx<XDATA_LENTH; ptx++)*ptx = 0xaa;    //测试是否有位短路
    for(ptx=0; ptx<XDATA_LENTH; ptx++)if(*ptx != 0xaa)    return 2;   //测试0xaa错误

    i = 0;
    for(ptx=0; ptx<XDATA_LENTH; ptx++)
    {
      *ptx = (u8)(i >> 8);
      ptx++;
      *ptx = (u8)i;
      i++;
    }
    i = 0;
    for(ptx=0; ptx<XDATA_LENTH; ptx++)
    {
      j = *ptx;
      ptx++;
      j = (j << 8) + *ptx;
      if(i != j)return 3;   //写连续数字错误
      i++;
    }

    ptx = 0;
    for(ptc=0; ptc<HZK_LENTH; ptc++)    {*ptx = hz;    ptx++;}
    ptx = 0;
    for(ptc=0; ptc<HZK_LENTH; ptc++)
    {
      if(*ptx != hz) return 4;   //写字库错误
      ptx++;
    }

    return 0;
}


/*************发送错误地址函数 *****************/
void TxErrorAddress(void)
{
    u16 i;
    i = 0x00fd;
    PrintString2("error addr = ");
    if(i >= 10000)UART2_TxByte(i/10000+'0'),i %= 10000;
    UART2_TxByte(i/1000+'0'),   i %= 1000;
    UART2_TxByte(i/100+'0'),    i %= 100;
    UART2_TxByte(i/10+'0');
    UART2_TxByte(i%10+'0');
    UART2_TxByte(0x0d);
    UART2_TxByte(0x0a);
}

/*************xdata测试返回信息函数 *****************/
void Xdata_Test(void)
{
    u8i;
    if((RX2_Buffer == 'x') || (RX2_Buffer == 'X'))
    {
      PrintString2("Testing xdata, please wait......\n");
      i = TestXRAM();
             if(i == 0) PrintString2("test pass!\n");
      else if(i == 1) PrintString2("test xdata write 0x55 fail!\n"), TxErrorAddress();
      else if(i == 2) PrintString2("test xdata write 0xaa roor!\n"), TxErrorAddress();
      else if(i == 3) PrintString2("Test continuous write error!\n"), TxErrorAddress();
      else if(i == 4) PrintString2("Test writing to font library error!\n"), TxErrorAddress();
    }
}




页: [1]
查看完整版本: 35-板载焊接的外部扩展32K xdata测试程序,AI8051U实验箱演示程序