找回密码
 立即注册
查看: 137|回复: 0

串口收发框架,带不断电下载功能

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

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-17 17:45:05 | 显示全部楼层 |阅读模式
串口收发框架,带不断电下载功能
单片机:AI8G1K08A
根据
https://www.stcaimcu.com/thread-4598-1-1.html
修改

新增不断电下载功能、485软件控制收发、串口数据原样返回
  1. #include <AI8G.H>
  2. #include "define.h"
  3. #include <intrins.h>
  4. #include <absacc.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #define                RXD                        P30
  10. #define                TXD                        P31
  11. #define                FOSC                11059200UL
  12. #define                BAUD                9600UL                                                //波特率
  13. #define                TMRF                200UL                                                //定时器频率
  14. #define                BRT                        (0x10000-(FOSC/BAUD+2)/4)        //波特率发生器值
  15. #define                TMR                        (0x10000-FOSC/TMRF/12)                //定时器值
  16. #define                R_Buf_Len        64                                                        //Uart1接收缓存长度
  17. #define                T_Buf_Len        64                                                        //Uart1发送缓存长度
  18. #define                R                        0                                                        //485接收
  19. #define                T                        1                                                        //485发送
  20. unsigned char                RP;                                        //Uart1接收指针
  21. unsigned char                TP;                                        //Uart1发送指针
  22. unsigned char                Uart_R_Len;                        //Uart1接收长度
  23. unsigned char                Uart_T_Len;                        //Uart1发送长度
  24. unsigned char xdata        R_Buf[R_Buf_Len];        //Uart1接收缓存
  25. unsigned char xdata        T_Buf[T_Buf_Len];        //Uart1发送缓存
  26. char USER_STCISPCMD[]="@STCISP#";        //下载命令(用户自定义,可修改,必须和ISP软件中设置的一致)
  27. ///*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
  28. //void Delay_10us(void)
  29. //{
  30. //        unsigned char i;
  31. //        i=35;
  32. //        while(--i);
  33. //}
  34. ///*----------------------------延时x10us----------------------------*/
  35. //void Delay_x10us(unsigned char x)
  36. //{
  37. //        while(x--)
  38. //                Delay_10us();
  39. //}
  40. /*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
  41. void Delay_10ms(void)
  42. {
  43.         unsigned char i,j;
  44.         _nop_();
  45.         _nop_();
  46.         i=144;
  47.         j=157;
  48.         do
  49.         {
  50.                 while(--j);
  51.         }while(--i);
  52. }
  53. /*----------------------------延时x10ms----------------------------*/
  54. void Delay_x10ms(unsigned char x)
  55. {
  56.         while(x--)
  57.                 Delay_10ms();
  58. }
  59. void UART_Send(unsigned int x)
  60. {
  61.         TP=0;
  62.         Uart_T_Len=x;
  63.         TI=1;
  64. }
  65. void Uart_Printf(unsigned char *v,...)
  66. {
  67.         va_list ap;
  68.         va_start(ap,v);
  69.         while(Uart_T_Len);
  70.         UART_Send(vsprintf(T_Buf,v,ap));
  71.         va_end(ap);
  72. }
  73. void UART_Return(unsigned char temp)
  74. {
  75.         memcpy(T_Buf,R_Buf,temp);
  76.         UART_Send(temp);
  77. }
  78. void Init(void)
  79. {
  80.         P_SW2|=EAXFR;
  81.         
  82.         P0M1=0x00;        P0M0=0x00;        //设置IO模式
  83.         P1M1=0x00;        P1M0=0x00;        //设置IO模式
  84.         P2M1=0x00;        P2M0=0x00;        //设置IO模式
  85.         P3M1=0x00;        P3M0=0x00;        //设置IO模式
  86.         P4M1=0x00;        P4M0=0x00;        //设置IO模式
  87.         P5M1=0x00;        P5M0=0x00;        //设置IO模式
  88.         P6M1=0x00;        P6M0=0x00;        //设置IO模式
  89.         P7M1=0x00;        P7M0=0x00;        //设置IO模式
  90.         
  91.         AUXR=0x40;                //设置定时器0时钟为12T模式,设置定时器1为1T模式,设置定时器1为波特率发生器
  92.         TMOD=0x01;                //设置定时器0为16位不自动重装载模式,设置定时器1为16位自动重装载模式
  93.         TH0=TMR>>8;                //设置定时器0初始值
  94.         TL0=TMR;                //设置定时器0初始值
  95.         TF0=0;                        //清除TF0中断标志位
  96.         ET0=1;                        //启用定时器0中断
  97.         
  98.         SCON=0x50;                //设置UART1模式为8位数据可变波特率
  99.         TH1=BRT>>8;                //设置UART1波特率
  100.         TL1=BRT;                //设置UART1波特率
  101.         TR1=1;                        //打开定时器1
  102.         ES=1;                        //启用UART1中断
  103.         
  104.         EA=1;                        //启用总中断
  105. }
  106. void main(void)
  107. {
  108.         Init();
  109.         Uart_Printf("AI8G1K08A auto download test.\r\n");
  110.         while(1)
  111.         {
  112.                 Uart_Printf("AI8G1K08A running.\r\n");
  113.                 Delay_x10ms(100);
  114.         }
  115. }
  116. void Uart_Start(void)
  117. {
  118.         TL0=0x00;
  119.         TH0=0xEE;
  120.         TR0=1;
  121. }
  122. void Uart_Stop(void)
  123. {
  124.         TR0=0;
  125.         TL0=0x00;
  126.         TH0=0xEE;
  127.         RP=0;
  128.         memset(R_Buf,0x00,sizeof R_Buf);
  129. }
  130. void Timer0_Isr(void) interrupt 1
  131. {
  132.         UART_Return(RP);        //超时原样返回
  133.         Uart_Stop();
  134. }
  135. void Uart_Isr(void) interrupt 4
  136. {
  137.         if(RI)
  138.         {
  139.                 RI=0;
  140.                 Uart_Start();
  141.                 R_Buf[RP]=SBUF;
  142.                 if((RP==sizeof USER_STCISPCMD-2)&&(memcmp(R_Buf,USER_STCISPCMD,sizeof USER_STCISPCMD-1)==0))        //收到用户命令后复位到ISP区
  143.                 {
  144.                         IAP_CONTR=0x60;
  145.                 }
  146.                 if(RP==R_Buf_Len-1)
  147.                 {
  148.                         Uart_Stop();
  149.                 }
  150.                 else if(TR0)
  151.                 {
  152.                         RP++;
  153.                 }
  154.         }
  155.         if(TI)
  156.         {
  157.                 TI=0;
  158.                 if(TP==Uart_T_Len)
  159.                 {
  160. //                        TR=R;        //485软件收发控制
  161.                         TP=0;
  162.                         Uart_T_Len=0;
  163.                 }
  164.                 if(Uart_T_Len!=0)
  165.                 {
  166. //                        TR=T;        //485软件收发控制
  167.                         SBUF=(T_Buf[TP]);
  168.                         TP++;
  169.                 }
  170.         }
  171. }
复制代码
截图202503171747024649.jpg
硬件选项的时钟频率11.0592M

注意下载端口一定要选CDC,不要选HID,否则不能正确发送下载命令
用户命令按图设置:

截图202503171747234583.jpg
AI8G1K08A_printf.zip (12.44 KB, 下载次数: 13)

DebugLab
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 08:47 , Processed in 0.118680 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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