小坤 发表于 2025-3-12 22:03:12

简简单单测试用户系统区与用户程序的切换

    简简单单测试用户系统区与用户程序的切换,为后续的IAP升级做准备。串口每收到一个字节数据进行一次切换。#include "..\comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc      22118400L   //定义主时钟(精确计算115200波特率)

//==========================================================================

#define Baudrate1   (65536 - MAIN_Fosc / 115200 / 4)

#define UART1_BUF_LENGTH    128

//==========================================================================


//#defineSys_code
#defineUser_code

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


/*************IO口定义    **************/

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

u8TX1_Cnt;    //发送计数
u8RX1_Cnt;    //接收计数
bit B_TX1_Busy; //发送忙标志

u8RX1_Buffer; //接收缓冲

/*************本地函数声明    **************/

void UART1_config(u8 brt);   // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void PrintString1(u8 *puts);

/****************外部函数声明和外部变量声明 *****************/


/******************** 主函数 **************************/
void main(void)
{
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    UART1_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    EA = 1;             //允许全局中断

#ifdefSys_code
    PrintString1("程序运行再用户系统区!\r\n");//UART1发送一个字符串
#else               
       PrintString1("程序运行在工作区!\r\n");//UART1发送一个字符串
#endif       

    while (1)
    {
               
      if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))   //收到数据, 发送空闲
      {
#ifdefSys_code
                        IAP_CONTR = 0X20;
#else                       
                       IAP_CONTR = 0X28;
#endif
            SBUF = RX1_Buffer;
            B_TX1_Busy = 1;
            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
      }
    }
}

小坤 发表于 2025-3-12 22:06:53

其实之前用8H8K64U已经完成了4G物联网的远程升级。使用8H8K64U需要进行中断的偏移操作,这次主要是验证下AI8051的用户系统区这个功能好不好使用。

ercircle 发表于 2025-3-12 22:14:09

大道至简{:4_250:}

xxkj2010 发表于 2025-3-13 08:31:48

看代码,好像每次都执行IAP_CONTR = 0X28;是不是呢?请赐教

小坤 发表于 2025-3-13 08:33:10

xxkj2010 发表于 2025-3-13 08:31
看代码,好像每次都执行IAP_CONTR = 0X28;是不是呢?请赐教
生成了两次HEX。

小坤 发表于 2025-3-13 08:34:16

wnagming 发表于 2025-3-13 07:24
不明白,这不是宏定义吗?怎么切换的呢?

生成了两次的HEX文件,下载的

xxkj2010 发表于 2025-3-13 08:40:33

小坤 发表于 2025-3-13 08:34
生成了两次的HEX文件,下载的

这两个HEX文件分别下载到用户系统区和用户程序区?

小坤 发表于 2025-3-13 08:41:52

xxkj2010 发表于 2025-3-13 08:40
这两个HEX文件分别下载到用户系统区和用户程序区?

EN

xxkj2010 发表于 2025-3-13 08:43:58

挺不错的,手头有8051,以后找个时间玩玩
页: [1]
查看完整版本: 简简单单测试用户系统区与用户程序的切换