找回密码
 立即注册
查看: 89|回复: 4

AI8051U 32模式卡定时器中断 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 2025-4-12 13:59:09 | 显示全部楼层 |阅读模式
代码如下:

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

   delayms(3000);
        

    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_Init();        //115200bps@40MHz
        Timer0_Init();                //10毫秒@40.000MHz

        EA = 1 ;        
    P5M0 |= 0x01; P5M1 &= ~0x01;

        printf("\n开机");

    while(1)
    {
              printf("\n1");
                delayms(100);
                P50 = !P50;

    }
}

//----------------------------------------------

void Timer0_Isr(void) interrupt 1
{
        ET0 = 0;                                //使能定时器0中断
        TF0 = 0;                                //清除TF0标志
        sys_tick ++ ;
        //printf("\nsys_tick = %bu",sys_tick);
        ET0 = 1;                                //使能定时器0中断        
}
//----------------------------------------------------
void Uart1_Isr(void) interrupt 4
{
        if (TI)                                //检测串口1发送中断
        {
                TI = 0;                        //清除串口1发送中断请求位
        }
        if (RI)                                //检测串口1接收中断
        {
                RI = 0;                        //清除串口1接收中断请求位
        }
}

使用AI8051U 32位模式,设置了定时器T0 10mS中断一次。初始化后开启定时器中断和全局中断,出现主程序不能正常工作,while(1)里的printf("\n1");不能输出,P50不能翻转,
但是在 Timer0_Isr(void) interrupt 1  里的printf("\nsys_tick = %bu",sys_tick)可以正常打印;
关闭全局中断后while(1)里才能正常工作。




AI8051U32BIT.rar

131.63 KB, 下载次数: 1

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-12 14:03:00 | 显示全部楼层
以下是对该代码的专业分析及优化建议:

代码分析

该代码主要实现了对单片机AI8051U的初始化配置,包括指令延时、扩展寄存器访问、端口模式设置、串口初始化、定时器初始化以及中断使能等功能。整体逻辑清晰,但在一些细节上存在优化空间。

1. 指令延时与访问速度优化  
   代码通过WTST = 0将指令延时设置为最快,同时通过CKCON = 0提高了XRAM的访问速度。这种配置适用于对实时性要求较高的场景,但需注意在低功耗模式下可能需要调整。

2. 端口模式设置  
   代码将所有端口(P0-P7)设置为准双向口(PxM1 = 0x00; PxM0 = 0x00)。这种配置适合大多数通用I/O应用,但如果某些端口仅用于输入或输出,可以考虑单独配置以提高效率。

3. 串口初始化  
   Uart1Init()函数用于初始化串口,波特率为115200bps@40MHz。需确保该函数内部已正确配置相关寄存器(如SCON、PCON等)以及波特率生成器。

4. 定时器初始化  
   Timer0Init()函数用于初始化定时器0,定时周期为10毫秒@40.000MHz。需确保该函数已正确配置TMOD、TH0、TL0等寄存器,并启用了定时器中断。

5. 中断使能  
   通过EA = 1开启了全局中断。确保在定时器中断服务函数中已正确处理中断标志位,以避免重复触发。

6. 调试信息输出  
   代码通过printf输出调试信息(如“开机”和“1”)。需确保串口已正确初始化,并且printf函数已重定向到串口输出。

优化建议

1. 端口模式配置优化  
   如果某些端口仅用于输入或输出,可以单独配置其模式。例如,若P5.0仅用于输出,可以优化如下:  
  
  1. c
  2.    P5M0 |= 0x01;  // 设置为推挽输出
  3.    P5M1 &= ~0x01; // 清除输入模式
复制代码

2. 定时器初始化函数检查  
   确保Timer0Init()函数已正确配置定时器0,并启用了中断。例如:  
  
  1. c
  2.    void Timer0Init(void)
  3.    {
  4.        TMOD &= 0xF0; // 清除定时器0模式位
  5.        TMOD |= 0x01; // 设置为模式1(16位定时器)
  6.        TH0 = 0xFC;   // 定时器初值高位
  7.        TL0 = 0x18;   // 定时器初值低位
  8.        TR0 = 1;      // 启动定时器0
  9.        ET0 = 1;      // 使能定时器0中断
  10.    }
复制代码

3. 中断服务函数实现  
   确保已实现定时器0的中断服务函数,并在其中清除中断标志位。例如:  
  
  1. c
  2.    void Timer0ISR(void) interrupt 1
  3.    {
  4.        TH0 = 0xFC; // 重装定时器初值
  5.        TL0 = 0x18;
  6.        // 添加定时器中断处理逻辑
  7.    }
复制代码

4. 调试信息优化  
   如果调试信息较多,可以考虑使用条件编译或日志级别控制,以减少对程序性能的影响。例如:  
  
  1. c
  2.    #define DEBUG 1
  3.    #if DEBUG
  4.        printf("\n开机");
  5.    #endif
复制代码

总结

该代码整体结构合理,适合AI8051U单片机的基本应用场景。通过对端口模式、定时器初始化和中断服务函数的优化,可以进一步提升代码的效率和可靠性。建议在实际应用中根据具体需求进一步调整和测试。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 2025-4-12 14:39:10 | 显示全部楼层
在8位模式下无此问题,在32位模式下才有此问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2025-4-12 14:58:08 | 显示全部楼层
中断和UartPutc同时在操作TI噢,检查下

可以参考实验箱串口例程或者使用AiCube生成新工程
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 2025-4-12 16:17:16 | 显示全部楼层
erci*** 发表于 2025-4-12 14:58
中断和UartPutc同时在操作TI噢,检查下

可以参考实验箱串口例程或者使用AiCube生成新工程

确实如你所说,去掉串口中断关于TX标志的代码,解决
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 11:10 , Processed in 0.120102 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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