请问AI8051U 32bit模式,串口自动下载问题?
相同的程序,在8位下可以正常自动烧录,在32位下,不行,但是在32位下,串口的收发又是正常的,程序都是抄官方的{:ciya:},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;
// }
}
任何情况下,只要CPU还能正常工作,IAP_CONTR=0x60都能软复位到ISP区,先把IAP_CONTR=0x60替换为点亮一个LED,观察LED有无变化,再修改程序排查问题
串口收发框架可以看看我的程序:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
DebugLab 发表于 2025-2-18 18:52
任何情况下,只要CPU还能正常工作,IAP_CONTR=0x60都能软复位到ISP区,先把IAP_CONTR=0x60替换为点亮一个LE ...
你好 我好像找到问题了,这个发送字节的函数没问题,但是发送字符串的函数发出来的是乱码,请问我应该怎么改?,AI8051 32模式 33.1776MHz波特率115200,
可奇怪 相同的函数 在8位就没问题
void UartSend(unsigned char dat) //单片机发送一个字节
{
SBUF = dat;
while(TI==0);
TI=0;
}
void UartSendStr(unsigned char *p)//单片机发送字符串
{
while (*p)
{
UartSend(*p++);
}
}
mtt661 发表于 2025-2-18 21:17
你好 我好像找到问题了,这个发送字节的函数没问题,但是发送字符串的函数发出来的是乱码,请问我应该怎 ...
这里试一下
页:
[1]