相同的程序,在8位下可以正常自动烧录,在32位下,不行,但是在32位下,串口的收发又是正常的,
程序都是抄官方的 ,ISP软件的设置,除了从8位改到32位,其他都没变,keil也是用c251新建的工程。
- //#define FOSC 40000000UL
- #define FOSC 33177600UL
- //#define FOSC 24000000UL
- //#define FOSC 11059200UL
- #define BRT (65536 - FOSC / 115200 / 4)
-
-
- void UartInit() //定时器1(模式0)做串口1波特率发生器
- {
- SCON = 0x50;
- TMOD = 0x00;
- TL1 = BRT;
- TH1 = BRT >> 8;
- TR1 = 1;
- AUXR = 0x40;
- ES = 1; //打开串口中断
- EA = 1; //打开总中断
-
- }
- void UartSend(unsigned char dat) //发送一个字节
- {
-
- SBUF = dat;
- while(TI==0);
- TI=0;
- }
-
- void CheckCustomCmd(unsigned char dat) //检测命令序列:"@STCISP#"
- {
- unsigned char bStage;
-
- switch (bStage++)
- {
- default:
- L_Check1st:
- case 0: //检测命令头
- bStage = (dat == '@');
- break;
- case 1:
- if (dat != 'S') goto L_Check1st;
- break;
- case 2:
- if (dat != 'T') goto L_Check1st;
- break;
- case 3:
- if (dat != 'C') goto L_Check1st;
- break;
- case 4:
- if (dat != 'I') goto L_Check1st;
- break;
- case 5:
- if (dat != 'S') goto L_Check1st;
- break;
- case 6:
- if (dat != 'P') goto L_Check1st;
- break;
- case 7:
- if (dat != '#') goto L_Check1st;
- // delay(5); //检测到正确的命令序列后复位到系统区
- IAP_CONTR = 0x60; //复位到系统区
- break;
- }
- }
-
- void UartIsr() interrupt 4 //串口1中断函数
- {
-
- unsigned char i=0;
- if (RI) //接收
- {
- RI = 0;
- CheckCustomCmd(SBUF); //检测串口为指定命令函数
-
- }
-
- // if (TI)
- // {
- // TI = 0;
-
- // }
-
- }
复制代码
|