找回密码
 立即注册
查看: 282|回复: 3

请问AI8051U 32bit模式,串口自动下载问题?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-2-18 15:59:37 | 显示全部楼层 |阅读模式
相同的程序,在8位下可以正常自动烧录,在32位下,不行,但是在32位下,串口的收发又是正常的,
程序都是抄官方的,ISP软件的设置,除了从8位改到32位,其他都没变,keil也是用c251新建的工程。
  1. //#define FOSC        40000000UL
  2. #define FOSC        33177600UL
  3. //#define FOSC        24000000UL
  4. //#define FOSC        11059200UL
  5. #define BRT         (65536 - FOSC / 115200 / 4)
  6. void UartInit()                //定时器1(模式0)做串口1波特率发生器
  7. {
  8.     SCON = 0x50;
  9.     TMOD = 0x00;
  10.     TL1 = BRT;
  11.     TH1 = BRT >> 8;
  12.     TR1 = 1;
  13.     AUXR = 0x40;
  14.     ES = 1;        //打开串口中断
  15.     EA = 1;        //打开总中断
  16. }
  17. void UartSend(unsigned char dat)        //发送一个字节
  18. {
  19.     SBUF = dat;
  20.         while(TI==0);
  21.         TI=0;
  22. }
  23. void CheckCustomCmd(unsigned char dat)                   //检测命令序列:"@STCISP#"
  24. {
  25.         unsigned char bStage;
  26.         
  27.     switch (bStage++)
  28.     {
  29.     default:
  30.         L_Check1st:
  31.     case 0:                                     //检测命令头
  32.         bStage = (dat == '@');
  33.         break;
  34.     case 1:
  35.         if (dat != 'S') goto L_Check1st;
  36.         break;
  37.     case 2:
  38.         if (dat != 'T') goto L_Check1st;
  39.         break;
  40.     case 3:
  41.         if (dat != 'C') goto L_Check1st;
  42.         break;
  43.     case 4:
  44.         if (dat != 'I') goto L_Check1st;
  45.         break;
  46.     case 5:
  47.         if (dat != 'S') goto L_Check1st;
  48.         break;
  49.     case 6:
  50.         if (dat != 'P') goto L_Check1st;
  51.         break;
  52.     case 7:
  53.         if (dat != '#') goto L_Check1st;
  54. //        delay(5);                           //检测到正确的命令序列后复位到系统区
  55.         IAP_CONTR = 0x60;                       //复位到系统区
  56.         break;
  57.     }
  58. }
  59. void UartIsr() interrupt 4        //串口1中断函数
  60. {
  61.         unsigned char i=0;
  62.     if (RI)        //接收
  63.     {
  64.         RI = 0;
  65.         CheckCustomCmd(SBUF);        //检测串口为指定命令函数
  66.     }
  67.         
  68. //    if (TI)
  69. //    {
  70. //        TI = 0;
  71. //    }        
  72.         
  73. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-18 18:52:12 | 显示全部楼层
任何情况下,只要CPU还能正常工作,IAP_CONTR=0x60都能软复位到ISP区,先把IAP_CONTR=0x60替换为点亮一个LED,观察LED有无变化,再修改程序排查问题
串口收发框架可以看看我的程序:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-01 18:31:16

5

主题

23

回帖

1161

积分

金牌会员

积分
1161
发表于 2025-2-18 21:17:54 | 显示全部楼层
Debu*** 发表于 2025-2-18 18:52
任何情况下,只要CPU还能正常工作,IAP_CONTR=0x60都能软复位到ISP区,先把IAP_CONTR=0x60替换为点亮一个LE ...

你好 我好像找到问题了,这个发送字节的函数没问题,但是发送字符串的函数发出来的是乱码,请问我应该怎么改?,AI8051 32模式 33.1776MHz  波特率115200,
可奇怪 相同的函数 在8位就没问题

  1. void UartSend(unsigned char dat)        //单片机发送一个字节
  2. {
  3.     SBUF = dat;
  4.         while(TI==0);
  5.         TI=0;
  6. }
  7. void UartSendStr(unsigned char *p)//单片机发送字符串
  8. {
  9.     while (*p)
  10.     {
  11.         UartSend(*p++);
  12.     }
  13. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2025-05-01 13:11:43

22

主题

283

回帖

901

积分

高级会员

积分
901
发表于 2025-2-18 23:14:49 来自手机 | 显示全部楼层
mtt661 发表于 2025-2-18 21:17
你好 我好像找到问题了,这个发送字节的函数没问题,但是发送字符串的函数发出来的是乱码,请问我应该怎 ...

这里试一下
Screenshot_2025-02-18-23-14-00-286_cn.wps.moffice_eng.jpg
REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:21 , Processed in 0.108315 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表