ercircle 发表于 2025-7-14 08:56:15

专业理工男 发表于 2025-7-14 00:24
找到这个的问题了,
程序里不应该加下图的那句等待,DMA的特长应该是可以独立于CPU进行数据搬运,
多加了 ...
DMA正常用是不加这个等待的,
或者说加在函数上面,以防上一次还没传输完第二次调用,
我上面测的是刷一次全屏看传输用时。

神农鼎 发表于 2025-7-14 10:11:31

本学期,我们在 深圳大学 教学用的实验程序,
已进化到直接是,实战 无堵塞/完善优雅的 实战框架
不只是演示功能,而是潜移默化的在引导如何实战

深圳国芯人工智能有限公司-工具软件


#include <AI8051U.H>                        //包含AI8051U的头文件

#include "intrins.h"                        //使用_nop_()函数所必须要包含的头文件,
                                                                //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                                                //会导致编译器找不到这个而函数而报错。


unsigned char int0_flag = 0;      //定义1个位变量,INT0事件位变量标志,记录INT0已产生中断
// 供主循环查询INT0是否已产生中断,在主循环中处理INT0的中断事件任务,不堵塞其他中断
unsigned char int1_flag = 0;      //定义1个位变量,INT1事件位变量标志,记录INT1已产生中断
// 供主循环查询INT1是否已产生中断,在主循环中处理INT1的中断事件任务,不堵塞其他中断
unsigned char int2_flag = 0;      //定义1个位变量,INT2事件位变量标志,记录INT2已产生中断
// 供主循环查询INT2是否已产生中断,在主循环中处理INT2的中断事件任务,不堵塞其他中断
unsigned char int3_flag = 0;      //定义1个位变量,INT3事件位变量标志,记录INT3已产生中断
// 供主循环查询INT3是否已产生中断,在主循环中处理INT3的中断事件任务,不堵塞其他中断

unsigned char t0_flag = 0;                //定义1个位变量,T0事件位变量标志,记录定时器0已产生中断
// 供主循环查询定时器0是否已产生中断,在主循环中处理定时器0的中断事件任务,不堵塞其他中断
unsigned char t1_flag = 0;                //定义1个位变量,T1事件位变量标志,记录定时器1已产生中断
// 供主循环查询定时器1是否已产生中断,在主循环中处理定时器1的中断事件任务,不堵塞其他中断
unsigned char t3_flag = 0;                //定义1个位变量,T3事件位变量标志,记录定时器3已产生中断
// 供主循环查询定时器3是否已产生中断,在主循环中处理定时器3的中断事件任务,不堵塞其他中断
unsigned char t4_flag = 0;                //定义1个位变量,T4事件位变量标志,记录定时器4已产生中断
// 供主循环查询定时器4是否已产生中断,在主循环中处理定时器4的中断事件任务,不堵塞其他中断

unsigned char uart1_txflag = 0;      //定义1个位变量,UART1事件位变量标志,记录UART1已产生发送中断
// 供主循环查询UART1是否已产生发送中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart1_rxflag = 0;      //定义1个位变量,UART1事件位变量标志,记录UART1已产生接收中断
// 供主循环查询UART1是否已产生接收中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart2_txflag = 0;      //定义1个位变量,UART2事件位变量标志,记录UART2已产生发送中断
// 供主循环查询UART2是否已产生发送中断,在主循环中处理UART2的中断事件任务,不堵塞其他中断
unsigned char uart2_rxflag = 0;      //定义1个位变量,UART2事件位变量标志,记录UART2已产生接收中断
// 供主循环查询UART2是否已产生接收中断,在主循环中处理UART2的中断事件任务,不堵塞其他中断
unsigned char uart3_txflag = 0;      //定义1个位变量,UART3事件位变量标志,记录UART3已产生发送中断
// 供主循环查询UART3是否已产生发送中断,在主循环中处理UART3的中断事件任务,不堵塞其他中断
unsigned char uart3_rxflag = 0;      //定义1个位变量,UART3事件位变量标志,记录UART3已产生接收中断
// 供主循环查询UART3是否已产生接收中断,在主循环中处理UART3的中断事件任务,不堵塞其他中断
unsigned char uart4_txflag = 0;      //定义1个位变量,UART4事件位变量标志,记录UART4已产生发送中断
// 供主循环查询UART4是否已产生发送中断,在主循环中处理UART1的中断事件任务,不堵塞其他中断
unsigned char uart4_rxflag = 0;      //定义1个位变量,UART4事件位变量标志,记录UART4已产生接收中断
// 供主循环查询UART4是否已产生接收中断,在主循环中处理UART4的中断事件任务,不堵塞其他中断

void Timer0_Init(void)                        //定时器0初始化,2秒@40.000MHz
{
      TM0PS = 0x65;                              //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                              //定时器时钟12T模式
      TMOD &= 0xF0;                              //设置定时器模式
      TL0 = 0xB1;                                        //设置定时初始值
      TH0 = 0x00;                                        //设置定时初始值
      TF0 = 0;                                        //清除TF0标志
      TR0 = 1;                                        //定时器0开始计时
      ET0 = 1;                                        //使能定时器0中断
}

void Timer1_Init(void)                        //定时器1初始化,500毫秒@40.000MHz
{
      TM1PS = 0x19;                              //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0xBF;                              //定时器时钟12T模式
      TMOD &= 0x0F;                              //设置定时器模式
      TL1 = 0x99;                                        //设置定时初始值
      TH1 = 0x05;                                        //设置定时初始值
      TF1 = 0;                                        //清除TF1标志
      TR1 = 1;                                        //定时器1开始计时
      ET1 = 1;                                        //使能定时器1中断
}

void Timer3_Init(void)                  //100毫秒@40.000MHz
{
      TM3PS = 0x3D;                            //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      T4T3M |= 0x02;                            //定时器时钟1T模式
      T3L = 0xFC;                                    //设置定时初始值
      T3H = 0x03;                                    //设置定时初始值
      T4T3M |= 0x08;                            //定时器3开始计时
      IE2 |= 0x20;                            //使能定时器3中断
}

void Timer4_Init(void)                  //200毫秒@40.000MHz
{
      TM4PS = 0x7A;                            //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      T4T3M |= 0x20;                            //定时器时钟1T模式
      T4L = 0xEF;                                    //设置定时初始值
      T4H = 0x01;                                    //设置定时初始值
      T4T3M |= 0x80;                            //定时器4开始计时
      IE2 |= 0x40;                            //使能定时器4中断
}

void Uart1_Init(void)                        //115200bps@40.000MHz
{
      SCON = 0x50;                              //8位数据,可变波特率
      AUXR |= 0x01;                              //串口1选择定时器2为波特率发生器
      AUXR |= 0x04;                              //定时器时钟1T模式
      T2L = 0xA9;                                        //设置定时初始值
      T2H = 0xFF;                                        //设置定时初始值
      AUXR |= 0x10;                              //定时器2开始计时
      ES = 1;                                                //使能串口1中断
}

void Uart2_Init(void)                        //115200bps@40.000MHz
{
      S2CON = 0x50;                              //8位数据,可变波特率
      AUXR |= 0x04;                              //定时器时钟1T模式
      T2L = 0xA9;                                        //设置定时初始值
      T2H = 0xFF;                                        //设置定时初始值
      AUXR |= 0x10;                              //定时器2开始计时
      IE2 |= 0x01;                              //使能串口2中断
}

void Uart3_Init(void)                        //115200bps@40.000MHz
{
      S3CON = 0x10;                              //8位数据,可变波特率
      S3CON &= 0xBF;                              //串口3选择定时器2为波特率发生器
      AUXR |= 0x04;                              //定时器时钟1T模式
      T2L = 0xA9;                                        //设置定时初始值
      T2H = 0xFF;                                        //设置定时初始值
      AUXR |= 0x10;                              //定时器2开始计时
      IE2 |= 0x08;                              //使能串口3中断
}

void Uart4_Init(void)                        //115200bps@40.000MHz
{
      S4CON = 0x10;                              //8位数据,可变波特率
      S4CON &= 0xBF;                              //串口4选择定时器2为波特率发生器
      AUXR |= 0x04;                              //定时器时钟1T模式
      T2L = 0xA9;                                        //设置定时初始值
      T2H = 0xFF;                                        //设置定时初始值
      AUXR |= 0x10;                              //定时器2开始计时
      IE2 |= 0x10;                              //使能串口4中断
}

void main (void)
{
      EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR
      WTST = 0;                                        //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行
      CKCON = 0;                                        //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间

      P0M0 = 0x00; P0M1 = 0x00;         //设置 P0 口为准双向口模式
      P1M0 = 0x00; P1M1 = 0x00;         //设置 P1 口为准双向口模式
      P2M0 = 0x00; P2M1 = 0x00;         //设置 P2 口为准双向口模式
      P3M0 = 0x00; P3M1 = 0x00;      //设置 P3 口为准双向口模式
      P3M0 = 0x00; P3M1 = 0x0c;         //P32、P33设置为高阻输入(需要同步开启上拉电阻)
      P4M0 = 0x00; P4M1 = 0x00;         //设置 P4 口为准双向口模式
      P5M0 = 0x00; P5M1 = 0x00;         //设置 P5 口为准双向口模式
      P6M0 = 0x00; P6M1 = 0x00;         //设置 P6 口为准双向口模式
      P7M0 = 0x00; P7M1 = 0x00;         //设置 P7 口为准双向口模式
      
      P3PU = 0x0c;                                 //P32、P33打开上拉电阻

      int0_flag = 0;                            //初始化用户标志位
      int1_flag = 0;                            //初始化用户标志位
      int2_flag = 0;                            //初始化用户标志位
      int3_flag = 0;                            //初始化用户标志位
   
      t0_flag = 0;                            //初始化用户标志位
      t1_flag = 0;                            //初始化用户标志位
      t3_flag = 0;                            //初始化用户标志位
      t4_flag = 0;                            //初始化用户标志位
   
      uart1_txflag = 0;                        //初始化用户标志位
      uart1_rxflag = 0;                        //初始化用户标志位
      uart2_txflag = 0;                        //初始化用户标志位
      uart2_rxflag = 0;                        //初始化用户标志位
      uart3_txflag = 0;                        //初始化用户标志位
      uart3_rxflag = 0;                        //初始化用户标志位
      uart4_txflag = 0;                        //初始化用户标志位
      uart4_rxflag = 0;                        //初始化用户标志位

      IT0 = 0;                                       //使能 INT0 上升沿和下降沿中断
      //      IT0 = 1;                                 //使能 INT0 下降沿中断
      EX0 = 1;                                       //使能 INT0 中断
      IE0 = 0;                                        //清INT0中断标志

      //      IT1 = 0;                                 //使能 INT1 上升沿和下降沿中断
      IT1 = 1;                                       //使能 INT1 下降沿中断
      EX1 = 1;                                       //使能 INT1 中断
      IE1 = 0;                                        //清INT1中断标志

      INTCLKO |= 0x10;                        //使能INT2中断

      INTCLKO |= 0x20;                        //使能INT3中断
      
      Timer0_Init();                              //调用定时器0初始化函数
      Timer1_Init();                              //调用定时器1初始化函数
      Timer3_Init();                              //调用定时器0初始化函数
      Timer4_Init();                              //调用定时器1初始化函数

      Uart1_Init();                              //调用UART1初始化函数
      Uart2_Init();                              //调用UART2初始化函数
      Uart3_Init();                              //调用UART3初始化函数
      Uart4_Init();                              //调用UART4初始化函数

      EA = 1;                                                //总中断允许位打开
      P40 = 0;                                       //打开LED灯供电
      while(1)                                       //主循环中查询需要处理的各种事件
      {
                /*本演示程序中,主循环查询各中断有无需要继续处理的事件的次序,
                依次是 INTx/TIMERx/UARTx, 用户可以自己根据实际情况,
                调整查询各中断有无需要继续处理的事件的优先次序*/

                //查询外部中断0事件
                if(int0_flag)                        //主循环中查询,INT0是否已产生中断,是否有需要处理的INT 0事件
                {
                        int0_flag = 0;                //清0,INT0事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询外部中断1事件
                if(int1_flag)                        //主循环中查询,INT1是否已产生中断,是否有需要处理的INT1事件
                {
                        int1_flag = 0;                //清0,INT1事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询外部中断2事件
                if(int2_flag)                        //主循环中查询,INT2是否已产生中断,是否有需要处理的INT2事件
                {
                        int2_flag = 0;                //清0,INT2事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询外部中断3事件
                if(int3_flag)                        //主循环中查询,INT3是否已产生中断,是否有需要处理的INT3事件
                {
                        int3_flag = 0;                //清0,INT3事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询定时器0中断事件
                if(t0_flag)                              //主循环中查询,定时器0是否已产生中断,是否有需要处理的定时器0事件
                {
                        t0_flag = 0;                //清0,T0事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询定时器1中断事件
                if(t1_flag)                              //主循环中查询,定时器1是否已产生中断,是否有需要处理的定时器1事件
                {
                        t1_flag = 0;                //清0,T1事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询定时器3中断事件
                if(t3_flag)                              //主循环中查询,定时器3是否已产生中断,是否有需要处理的定时器3事件
                {
                        t3_flag = 0;                //清0,T3事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询定时器4中断事件
                if(t4_flag)                              //主循环中查询,定时器4是否已产生中断,是否有需要处理的定时器4事件
                {
                        t4_flag = 0;                //清0,T4事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询串口1中断事件
                if(uart1_txflag)                //主循环中查询,UART1是否已产生发送中断,是否有需要处理的UART1发送事件
                {
                        uart1_txflag = 0;      //清0,UART1发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart1_rxflag)                //主循环中查询,UART1是否已产生接收中断,是否有需要处理的UART1接收事件
                {
                        uart1_rxflag = 0;      //清0,UART1接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询串口2中断事件
                if(uart2_txflag)                //主循环中查询,UART2是否已产生发送中断,是否有需要处理的UART2发送事件
                {
                        uart2_txflag = 0;      //清0,UART2发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart2_rxflag)                //主循环中查询,UART2是否已产生接收中断,是否有需要处理的UART2接收事件
                {
                        uart2_rxflag = 0;      //清0,UART2接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询串口3中断事件
                if(uart3_txflag)                //主循环中查询,UART3是否已产生发送中断,是否有需要处理的UART3发送事件
                {
                        uart3_txflag = 0;      //清0,UART3发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart3_rxflag)                //主循环中查询,UART3是否已产生接收中断,是否有需要处理的UART3接收事件
                {
                        uart3_rxflag = 0;      //清0,UART3接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                //查询串口4中断事件
                if(uart4_txflag)                //主循环中查询,UART4是否已产生发送中断,是否有需要处理的UART4发送事件
                {
                        uart4_txflag = 0;      //清0,UART4发送事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }

                if(uart4_rxflag)                //主循环中查询,UART4是否已产生接收中断,是否有需要处理的UART4接收事件
                {
                        uart4_rxflag = 0;      //清0,UART4接收事件位变量标志
                        _nop_();                        //用户在此添加需要处理的事件
                        _nop_();
                }
      }
}


void int0_isr(void) interrupt INT0_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      int0_flag = 1;                              // int0_flag置1是通知主循环处理部分INT0中断事件不需要特急处理的任务
                                                                //置1,记录INT0已产生中断,供主循环查询判断有无需处理的INT0任务

      if(INT0)                                       //边沿中断,进入后再次判断电平从而判断是什么样的电平
      {
                _nop_();                              //判断为高电平,则当前为上升沿
                _nop_();                              //可以在这里插入断点进行观察现象
      }
      else
      {
                _nop_();                              //判断为低电平,则当前为下降沿
                _nop_();                              //可以在这里插入断点进行观察现象
      }
}
//INT0中断服务程序,INT0_VECTOR在AI8051U.H头文件中已宏定义为0

void int1_isr(void) interrupt INT1_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      int1_flag = 1;                              // int1_flag置1是通知主循环处理部分INT1中断事件不需要特急处理的任务
}
//INT1中断服务程序,INT1_VECTOR在AI8051U.H头文件中已宏定义为2

void int2_isr(void) interrupt INT2_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      int2_flag = 1;                              // int2_flag置1是通知主循环处理部分INT2中断事件不需要特急处理的任务
}
//INT2中断服务程序,INT2_VECTOR在AI8051U.H头文件中已宏定义为10

void int3_isr(void) interrupt INT3_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      int3_flag = 1;                              // int3_flag置1是通知主循环处理部分INT3中断事件不需要特急处理的任务
}
//INT3中断服务程序,INT3_VECTOR在AI8051U.H头文件中已宏定义为11

void Timer0_Isr(void) interrupt TMR0_VECTOR                //定时器0中断服务程序
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      t0_flag = 1;                              // t0_flag置1是通知主循环处理部分T0中断事件不需要特急处理的任务
                                                                //置1,记录定时器0已产生中断,供主循环查询判断有无需处理的定时器0任务
}
//定时器0中断服务程序,TMR0_VECTOR在AI8051U.H头文件中已宏定义为1

void Timer1_Isr(void) interrupt TMR1_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      t1_flag = 1;                              // t1_flag置1是通知主循环处理部分T1中断事件不需要特急处理的任务
                                                                //置1,记录定时器1已产生中断,供主循环查询判断有无需处理的定时器1任务
}
//定时器1中断服务程序,TMR1_VECTOR在AI8051U.H头文件中已宏定义为3


void Timer3_Isr(void) interrupt TMR3_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      t3_flag = 1;                              // t3_flag置1是通知主循环处理部分T3中断事件不需要特急处理的任务
                                                                //置1,记录定时器3已产生中断,供主循环查询判断有无需处理的定时器1任务
}
//定时器3中断服务程序,TMR3_VECTOR在AI8051U.H头文件中已宏定义为19

void Timer4_Isr(void) interrupt TMR4_VECTOR
{
      _nop_();                                        //特急处理,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
      //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      t4_flag = 1;                              // t1_flag置4是通知主循环处理部分T4中断事件不需要特急处理的任务
                                                                //置1,记录定时器4已产生中断,供主循环查询判断有无需处理的定时器1任务
}
//定时器4中断服务程序,TMR4_VECTOR在AI8051U.H头文件中已宏定义为20

void Uart1_Isr(void) interrupt UART1_VECTOR
{
      if (TI)                                                //检测串口1发送中断
      {
                TI = 0;                                        //清除串口1发送中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart1_txflag = 1;                // uart1_txflag置1是通知主循环处理部分串口1发送中断事件不需要特急处理的任务
                                                                //置1,记录UART1已产生发送中断,供主循环查询判断有无需处理的UART1发送任务
      }
      if (RI)                                                //检测串口1接收中断
      {
                RI = 0;                                        //清除串口1接收中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart1_rxflag = 1;                // uart1_rxflag置1是通知主循环处理部分串口1接收中断事件不需要特急处理的任务
                                                                //置1,记录UART1已产生接收中断,供主循环查询判断有无需处理的UART1接收任务
      }
}
//UART1中断服务程序,UART1_VECTOR在AI8051U.H头文件中已宏定义为4

void Uart2_Isr(void) interrupt UART2_VECTOR
{
      if (S2CON & 0x02)                        //检测串口2发送中断
      {
                S2CON &= ~0x02;                        //清除串口2发送中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart2_txflag = 1;                // uart2_txflag置1是通知主循环处理部分串口2发送中断事件不需要特急处理的任务
                                                                //置1,记录UART2已产生发送中断,供主循环查询判断有无需处理的UART2发送任务
      }
      if (S2CON & 0x01)                        //检测串口2接收中断
      {
                S2CON &= ~0x01;                        //清除串口2接收中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart2_rxflag = 1;                // uart2_rxflag置1是通知主循环处理部分串口2接收中断事件不需要特急处理的任务
                                                                //置1,记录UART2已产生接收中断,供主循环查询判断有无需处理的UART2接收任务
      }
}
//UART2中断服务程序,UART2_VECTOR在AI8051U.H头文件中已宏定义为8

void Uart3_Isr(void) interrupt UART3_VECTOR
{
      if (S3CON & 0x02)                        //检测串口3发送中断
      {
                S3CON &= ~0x02;                        //清除串口3发送中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart3_txflag = 1;                // uart3_txflag置1是通知主循环处理部分串口3发送中断事件不需要特急处理的任务
                                                                //置1,记录UART3已产生发送中断,供主循环查询判断有无需处理的UART3发送任务
      }
      if (S3CON & 0x01)                        //检测串口3接收中断
      {
                S3CON &= ~0x01;                        //清除串口3接收中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart3_rxflag = 1;                // uart3_rxflag置1是通知主循环处理部分串口3接收中断事件不需要特急处理的任务
                                                                //置1,记录UART3已产生接收中断,供主循环查询判断有无需处理的UART3接收任务
      }
}
//UART3中断服务程序,UART3_VECTOR在AI8051U.H头文件中已宏定义为17

void Uart4_Isr(void) interrupt UART4_VECTOR
{
      if (S4CON & 0x02)                        //检测串口4发送中断
      {
                S4CON &= ~0x02;                        //清除串口4发送中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart4_txflag = 1;                // uart4_txflag置1是通知主循环处理部分串口4发送中断事件不需要特急处理的任务
                                                                //置1,记录UART4已产生发送中断,供主循环查询判断有无需处理的UART4发送任务
      }
      if (S4CON & 0x01)                        //检测串口4接收中断
      {
                S4CON &= ~0x01;                        //清除串口4接收中断请求位
                _nop_();                              //特急处理
                //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
                //但时间不要太长,否则会影响其他中断事件的实时响应速度
                uart4_rxflag = 1;                // uart4_rxflag置1是通知主循环处理部分串口4接收中断事件不需要特急处理的任务
                                                                //置1,记录UART4已产生接收中断,供主循环查询判断有无需处理的UART4接收任务
      }
}
//UART4中断服务程序,UART4_VECTOR在AI8051U.H头文件中已宏定义为18



ercircle 发表于 2025-7-14 17:01:10

不要给W25Q通5V电压!!!(诶,没坏)
阵亡一颗FLASH,论检查电压的重要性......



tlmimufg 发表于 2025-7-14 19:58:29

请问STC8H8K64U能用吗,还有如何显示出汉字,

ercircle 发表于 2025-7-14 21:04:06

tlmimufg 发表于 2025-7-14 19:58
请问STC8H8K64U能用吗,还有如何显示出汉字,可以,汉字有字库生成工具


C_wolf 发表于 2025-7-14 21:41:23

期待大佬演示刷屏加上音频同步。

ercircle 发表于 2025-7-14 21:46:30

C_wolf 发表于 2025-7-14 21:41
期待大佬演示刷屏加上音频同步。

屏还没刷明白呢,你在为难我胖虎。

ercircle 发表于 2025-7-14 23:54:02


实验箱这个3.3V还是太勉强,需要搞个5V电路试下
843

ercircle 发表于 2025-7-15 11:44:24



ST7735芯片IO电压也不支持5V的,之前用擎天柱测试没烧是侥幸吗~~

ercircle 发表于 2025-7-15 22:23:30

搞个5V驱动板试试效果:



页: 1 [2] 3 4 5 6 7 8 9 10
查看完整版本: AiCube 图形化自动生成程序,驱动 ST7735S,TFT-彩屏, @Ai8051U, 跟帖问TFT, ST7739