找回密码
 立即注册
楼主: wuzhengmin

有关DMA,山东大学陈桂友教授

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-16 10:46:15 | 显示全部楼层
下面姚总补充多机通信:

这个上啦电阻,并联之后变小,所以搞个二极管上去


截图202601161046128924.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-16 11:16:16 | 显示全部楼层
以前的UART是和外面设备通信

现在是经常和板子上面是设备通信

现在STC-USB-CDC串口,速度是10M以上,可以传多远?

用STC ISP 的串口助手,实验环境很稳定的传输10M以上的速度,是OK的





截图202601161106516487.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-16 11:18:49 | 显示全部楼层
115200以下是标准的串口

以上的话,普通串口助手就不支持!

只能用STC 的ISP中的CDC串口助手:

截图202601161118451467.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-16 11:20:53 | 显示全部楼层
关于控制下载次数:

截图202601161120519992.jpg
截图202601161122067290.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 11:56:58 | 显示全部楼层
插入一个长定时器0中断的小实验

上节课陈老师讲了24位自动重载定时器,我随手烧录进去试验箱(不过是Ai8051U的)

竟然没反应

今天花点时间,调试一下,搞好了,程序如下:

  1. #include "../comm/Ai8051U.h" // 包含 Ai8051U 头文件
  2. unsigned int sec_counter = 0; // 秒计数器
  3. u8  Led_State = 0xFF;
  4. bit         t0_flag = 0;                   //定义1个位变量,T0事件位变量标志,记录定时器0已产生中断
  5. // 供主循环查询到该定时器已产生中断,在主循环中处理定时器0的中断任务,不堵塞其他中断
  6. bit         t1_flag = 0;                   //定义1个位变量,T0事件位变量标志,记录定时器0已产生中断的不同时间
  7. // 供主循环查询到该定时器已产生中断的不同时间,在主循环中处理定时器0的中断任务,不堵塞其他中断
  8. void SYS_init(void);
  9. void Timer0_1sInit(void);                //定时器0初始化,1秒@24.000MHz12T模式
  10. void Timer0_2Init(void);                //定时器0初始化,2秒@40.000MHz,12T模式
  11. void Timer0_4Init(void);                //定时器0初始化,4秒@24.000MHz12T模式
  12. void main()
  13. {
  14.     SYS_init();
  15.         
  16.         EA = 1;              // 开启总中断
  17.         
  18.                 //Timer0_1sInit();                //1秒@24.000MHz12T模式
  19.         Timer0_2Init();                        //定时器0初始化,2秒@40.000MHz,12T模式
  20.                 //Timer0_4Init();                //4秒@24.000MHz12T模式
  21.         
  22.         
  23.     P40 = 0;                                        //给LED灯供电
  24.         Led_State = 0;
  25.     while (1) {
  26.         // 主循环可以做其他事情
  27.         // 1秒到了会在中断里置标志位
  28.                
  29.                
  30.             if(t0_flag == 1)                        //如果定时器0已产生中断,主循环判断要处理定时器0的中断任务
  31.                 {
  32.                         t0_flag = 0;                //清0,T0事件位变量标志
  33.                         P00 = ~P00;                                //P00灯2秒闪烁,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
  34.                         
  35.                         
  36.                 }
  37.                
  38.                 if(t1_flag == 1) // 2秒累加数=2,就是4秒
  39.                 {
  40.                         P07=~P07;                                //P07灯4秒闪烁
  41.                         t1_flag = 0;
  42.                 }
  43.                
  44.     }
  45. }
  46. void  sys_init(void)                        //系统初始化
  47. {
  48.         EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR
  49.         WTST = 0;                                        //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
  50.         CKCON = 0;                                        //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
  51.         P0M0 = 0x00; P0M1 = 0x00;         //设置 P0 口为准双向口模式
  52.         P1M0 = 0x00; P1M1 = 0x00;         //设置 P1 口为准双向口模式
  53.         P2M0 = 0x00; P2M1 = 0x00;         //设置 P2 口为准双向口模式
  54.         P3M0 = 0x00; P3M1 = 0x00;         //设置 P3 口为准双向口模式
  55.         P4M0 = 0x00; P4M1 = 0x00;         //设置 P4 口为准双向口模式
  56.         P5M0 = 0x00; P5M1 = 0x00;         //设置 P5 口为准双向口模式
  57.         P6M0 = 0x00; P6M1 = 0x00;         //设置 P6 口为准双向口模式
  58.         P7M0 = 0x00; P7M1 = 0x00;         //设置 P7 口为准双向口模式
  59. }
  60. void Timer0_1sInit(void)                //1秒@24.000MHz12T模式
  61. {
  62.         TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  63.         AUXR &= 0x7F;                        //定时器时钟12T模式
  64.         TMOD &= 0xF0;                        //设置定时器模式
  65.         TL0 = 0xFC;                                //设置定时初始值
  66.         TH0 = 0x03;                                //设置定时初始值
  67.         TF0 = 0;                                //清除TF0标志
  68.         TR0 = 1;                                //定时器0开始计时
  69.         ET0 = 1;                                //使能定时器0中断
  70. }
  71. void Timer0_2Init(void)                //定时器0初始化,2秒@40.000MHz,12T模式
  72. {
  73.         TM0PS = 0x65;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  74.         AUXR &= 0x7F;                        //定时器时钟12T模式
  75.         TMOD &= 0xF0;                        //设置定时器模式
  76.         TL0 = 0xB1;                                //设置定时初始值
  77.         TH0 = 0x00;                                //设置定时初始值
  78.         TF0 = 0;                                //清除TF0标志
  79.         TR0 = 1;                                //定时器0开始计时
  80.         ET0 = 1;                                //使能定时器0中断
  81. }
  82. void Timer0_4Init(void)                //4秒@24.000MHz12T模式
  83. {
  84.         TM0PS = 0x7A;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  85.         AUXR &= 0x7F;                        //定时器时钟12T模式
  86.         TMOD &= 0xF0;                        //设置定时器模式
  87.         TL0 = 0xEF;                                //设置定时初始值
  88.         TH0 = 0x01;                                //设置定时初始值
  89.         TF0 = 0;                                //清除TF0标志
  90.         TR0 = 1;                                //定时器0开始计时
  91.         ET0 = 1;                                //使能定时器0中断
  92. }
  93. // 定时器0中断服务程序
  94. void Timer0_Isr(void) interrupt TMR0_VECTOR                //定时器0中断服务程序
  95. {
  96.         
  97.         static unsigned char count = 0;
  98.         count++;
  99.         sec_counter++;
  100.         t0_flag = 1;                        //置1,记录定时器0已产生中断,供主循环判断要处理定时器0的中断任务
  101.     if (sec_counter >= 2)
  102.         {
  103.         t1_flag = 1;
  104.                
  105.                 sec_counter = 0;
  106.                         
  107.     }
  108.         
  109. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 12:00:33 | 显示全部楼层
其实烧录的时候,选择如下即可:

上次定时器中断时间不对,应该是没注意打开特殊寄存器,XFR

就是下边这句没写

EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR

我把整个项目文件都打包,传上来,供大家指正参考!
截图202601171159014597.jpg

Tmie0_2秒.zip

41.26 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 12:10:18 | 显示全部楼层
关于时基,其实可以试一试AiCube:

在AiCube新建项目,选USB:

截图202601171210157618.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 12:24:28 | 显示全部楼层
当然只是搞个定时器,时钟就没什么好配置的

也不用考虑LCD反应时间

基本不用动,选默认40MHZ:

截图202601171224265648.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 12:27:47 | 显示全部楼层
接着就自动产生项目框架:

截图202601171227452338.jpg
截图202601171228204026.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2026-1-17 12:31:27 | 显示全部楼层
看看主函数:

截图202601171229071036.jpg
截图202601171230174649.jpg
截图202601171230478853.jpg
截图202601171231243507.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-1 04:11 , Processed in 0.116780 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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