简简单单测试用户系统区与用户程序的切换,为后续的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
-
- //==========================================================================
-
-
- //#define Sys_code
- #define User_code
-
- /************* 本地常量声明 **************/
-
-
- /************* IO口定义 **************/
-
- /************* 本地变量声明 **************/
-
- u8 TX1_Cnt; //发送计数
- u8 RX1_Cnt; //接收计数
- bit B_TX1_Busy; //发送忙标志
-
- u8 RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
-
- /************* 本地函数声明 **************/
-
- 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; //允许全局中断
-
- #ifdef Sys_code
- PrintString1("程序运行再用户系统区!\r\n"); //UART1发送一个字符串
- #else
- PrintString1("程序运行在工作区!\r\n"); //UART1发送一个字符串
- #endif
-
- while (1)
- {
-
- if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
- {
- #ifdef Sys_code
- IAP_CONTR = 0X20;
- #else
- IAP_CONTR = 0X28;
- #endif
- SBUF = RX1_Buffer[TX1_Cnt];
- B_TX1_Busy = 1;
- if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;
- }
- }
- }
复制代码
|