找回密码
 立即注册
查看: 3008|回复: 8

串口1使用DMA中断+软件超时接收不定长数据心得

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-6-15 16:00:35 | 显示全部楼层 |阅读模式
本帖最后由 电子DIY小家 于 2023-6-15 16:05 编辑


最近发现STC家的MCU开始支持DMA了。之前一直没时间用,这几天有空刚好看了下关于串口的这部分DMA.



可以看到这个串口部分的DMA一共就12个寄存器,可以说是简单到了极点,那就一起往下看看,当然了其实如标题类似的程序手册里也有,不过手册的相对简单,这边稍稍给他概括升级了一下下,顺便亲身体验一下这个DMA的使用,看看会不会踩坑。


首选贴上主函数的代码:

  1. void main(void)
  2. {
  3.     u8 xdata dat[50];
  4.         
  5.         u16 i,j;
  6.         COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  7.    
  8.    
  9. //-----------------------------------------------系统初始化-----------------------------------------------   
  10.     WTST = 0;                                                                   //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  11.     EAXFR = 1;                                                                  //扩展寄存器(XFR)访问使能
  12.     CKCON = 0;                                                                  //提高访问XRAM速度
  13.         P0M1 = 0x00;   P0M0 = 0x00;                                                 //设置为准双向口
  14.         P1M1 = 0x00;   P1M0 = 0x00;                                                 //设置为准双向口
  15.         P2M1 = 0x00;   P2M0 = 0x00;                                                 //设置为准双向口
  16.         P3M1 = 0x00;   P3M0 = 0x00;                                                 //设置为准双向口
  17.         P4M1 = 0x00;   P4M0 = 0x00;                                                 //设置为准双向口
  18.         P5M1 = 0x00;   P5M0 = 0x00;                                                 //设置为准双向口
  19.         P6M1 = 0x00;   P6M0 = 0x00;                                                 //设置为准双向口
  20.         P7M1 = 0x00;   P7M0 = 0x00;                                                 //设置为准双向口
  21. //-----------------------------------------------串口初始化-----------------------------------------------     
  22.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                                //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  23.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                                            //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
  24.         COMx_InitStructure.UART_BaudRate  = 115200UL;                                            //波特率, 一般 110 ~ 115200
  25.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                                    //接收允许,   ENABLE或DISABLE
  26.         COMx_InitStructure.BaudRateDouble = DISABLE;                                            //波特率加倍, ENABLE或DISABLE
  27.     COMx_InitStructure.Priority       = Priority_1;                 
  28.         UART_Configuration(UART1, &COMx_InitStructure);                                        //初始化串口1
  29.                     
  30.     Timer0_Init();                                                              //定时器初始化,提供1ms系统时钟
  31.         EA = 1;                                                                     //允许总中断
  32.         UART1_DMA_Receive(COM_RX_Lenth);                                            //设置dma下的数据接收
  33.                     
  34.         while (1)                  
  35.         {     
  36.         P21 = 0;
  37.         
  38.         if( flag_1ms )                                                          //1ms系统时间
  39.         {
  40.             flag_1ms = 0;
  41.             if( COM1.RX_TimeIDLE>0 )                                            //模拟空闲中断的超时变量
  42.             {           
  43.                 COM1.RX_TimeIDLE--;
  44.                 if( COM1.RX_TimeIDLE==0 )                                       //空闲中断时间到达
  45.                 {
  46.                     P21 = 1;
  47.                     i=sprintf(dat,"接收:%d\t",(u16)UART1_DMA_ReceiveNum());            //计算接受到的数据长度
  48.                     
  49.                     for(j=0;j<UART1_DMA_ReceiveNum();j++)                       //将接收到的数据写入缓冲区
  50.                         dat[i++] = COM1.RX_Buff[j];
  51.                     
  52.                     UART1_DMA_FreightSend(dat,i);                                    //打印字符串
  53.                     UART1_DMA_Receive(COM_RX_Lenth);                                //重新设置接收区                        
  54.                 }
  55.             }
  56.             
  57.             if( COM1.RX_TimeOUT>0 )                                             //发送数据的超时
  58.             {
  59.                 COM1.RX_TimeOUT--;
  60.                 if( COM1.RX_TimeOUT==0 )
  61.                 {
  62.                         
  63.                 }
  64.             }               
  65.         }
  66.         }
  67. }
复制代码
其次贴上子函数的一些代码

  1. COMx_Define        xdata COM1;
  2. //========================================================================
  3. // 函数: void UART1_DMA_Interrupt (void) interrupt 50/51
  4. // 描述: UART1 DMA中断函数
  5. // 参数: none.
  6. // 返回: none.
  7. // 版本: VER1.0
  8. // 日期: 2021-5-8
  9. // 备注:
  10. //========================================================================
  11. void UART1_DMA_Interrupt(void) interrupt 13
  12. {
  13.    
  14.     if (DMA_UR1T_STA & 0x01)        //发送完成
  15.     {
  16.         P21 = 1;
  17.         DMA_UR1T_STA &= ~0x01;
  18.         COM1.TX_OK = 1;
  19.     }
  20.     if (DMA_UR1T_STA & 0x04)        //数据覆盖
  21.     {
  22.         P21 = 1;
  23.         DMA_UR1T_STA &= ~0x04;
  24.     }
  25.    
  26.     if (DMA_UR1R_STA & 0x01)        //接收完成
  27.     {
  28.         P21 = 1;
  29.         DMA_UR1R_STA &= ~0x01;
  30.         COM1.RX_OK = 1;
  31.         P20=!P20;
  32.     }
  33.     if (DMA_UR1R_STA & 0x02)        //数据丢弃
  34.     {
  35.         P21 = 1;
  36.         DMA_UR1R_STA &= ~0x02;
  37.     }
  38. }
  39. void UART1_DMA_FreightSend(u8 *pData, u16 Size)
  40. {
  41.     u16 i;
  42.     if(Size == 0)
  43.         return;
  44.    
  45.     for( i=0;i<Size;i++ )
  46.     {
  47.         COM1.TX_Buff[i] = pData[i];
  48.         COM1.TX_Cnt++;
  49.     }
  50.    
  51.     while(COM1.TX_OK==0);
  52.     COM1.TX_OK = 0;
  53.    
  54.     Size -= 1;
  55.     DMA_UR1T_AMTH = (u8)(Size >> 8);    //设置传输总字节数(低8位):n+1
  56.     DMA_UR1T_AMT = (u8)Size;            //设置传输总字节数(高8位):n+1
  57.     DMA_UR1T_TXAH = (u8)((u16)&COM1.TX_Buff >> 8);
  58.     DMA_UR1T_TXAL = (u8)((u16)&COM1.TX_Buff);
  59.     DMA_UR1T_CR = 0xc0;                        //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
  60.     COM1.RX_TimeOUT = RX_TimeOUT_Set1 ;
  61. }
  62. void UART1_DMA_Send(void)
  63. {
  64.     u16 Size;
  65.     if(COM1.TX_Cnt == 0)
  66.         return;
  67.    
  68.     while(COM1.TX_OK==0);
  69.     COM1.TX_OK = 0;
  70.    
  71.     Size = COM1.TX_Cnt-1;
  72.     DMA_UR1T_AMTH = (u8)(Size >> 8);    //设置传输总字节数(低8位):n+1
  73.     DMA_UR1T_AMT = (u8)Size;            //设置传输总字节数(高8位):n+1
  74.     DMA_UR1T_TXAH = (u8)((u16)&COM1.TX_Buff >> 8);
  75.     DMA_UR1T_TXAL = (u8)((u16)&COM1.TX_Buff);
  76.     DMA_UR1T_CR = 0xc0;                        //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
  77.     COM1.RX_TimeOUT = RX_TimeOUT_Set1 ;
  78. }
  79. void UART1_DMA_Receive( u16 Size)
  80. {
  81.     if(Size == 0) return;
  82.     DMA_UR1R_CR = 0x00;
  83.     COM1.RX_Cnt  =Size;
  84.     Size -= 1;
  85.     DMA_UR1R_AMTH = (u8)(Size >> 8);    //设置传输总字节数(低8位):n+1
  86.     DMA_UR1R_AMT = (u8)Size;            //设置传输总字节数(高8位):n+1
  87.     DMA_UR1R_RXAH = (u8)((u16)&COM1.RX_Buff >> 8);
  88.     DMA_UR1R_RXAL = (u8)((u16)&COM1.RX_Buff);
  89.     DMA_UR1R_CR = 0xa1;                        //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
  90.     COM1.RX_Cnt_Num = 0;
  91.    
  92.     DMA_UR1R_DONEH = 0;
  93.     DMA_UR1R_DONE = 0;
  94. }
  95. u16 UART1_DMA_ReceiveNum(void)
  96. {
  97.     return ((u16)DMA_UR1R_DONEH<<8)|DMA_UR1R_DONE;
  98.     //return (u8)DMA_UR1R_DONE;
  99. }
  100. void UART1_int (void) interrupt 4
  101. {
  102.     P21 = 1;
  103.     if(RI)
  104.     {
  105.         RI = 0;
  106.         COM1.RX_TimeIDLE = RX_TimeIDLE_Set1;
  107.         COM1.RX_Cnt_Num++;
  108.     }
  109.     if(TI)
  110.     {
  111.         TI = 0;
  112.     }
  113. }
  114. //========================================================================
  115. // 函数: UART_Configuration
  116. // 描述: UART初始化程序.
  117. // 参数: UARTx: UART组号, COMx结构参数,请参考UART.h里的定义.
  118. // 返回: none.
  119. // 版本: V1.0, 2012-10-22
  120. //========================================================================
  121. u8 UART_Configuration(u8 UARTx, COMx_InitDefine *COMx)
  122. {
  123.     #if  defined( UART1 ) || defined( UART2 ) || defined( UART3 ) || defined( UART4 )
  124.         u16        i;
  125.         u32        j;
  126.     #else
  127.         UARTx = NULL;
  128.         COMx = NULL;
  129.     #endif
  130.     #ifdef UART1
  131.         if(UARTx == UART1)
  132.         {
  133. //-------------------------------------------结构体参数初始化-------------------------------------------           
  134.             COM1.RX_TimeIDLE    = 0;
  135.             COM1.RX_TimeOUT   = 0;
  136.             COM1.RX_Cnt  = 0;
  137.             COM1.TX_Cnt     = 0;
  138.             COM1.TX_OK = 1;
  139.             COM1.RX_OK = 0;
  140.             
  141.             for(i=0; i<COM_TX_Lenth; i++)        
  142.                 COM1.TX_Buff[i] = 0;
  143.             for(i=0; i<COM_RX_Lenth; i++)        
  144.                 COM1.RX_Buff[i] = 0;
  145. //-------------------------------------------串口参数初始化-------------------------------------------               
  146.             SCON = (SCON & 0x3f) | COMx->UART_Mode;        //模式设置
  147.             if((COMx->UART_Mode == UART_9bit_BRTx) || (COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
  148.             {
  149.                 j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
  150.                 if(j >= 65536UL)        return FAIL;        //错误
  151.                 j = 65536UL - j;
  152.                 if(COMx->UART_BRT_Use == BRT_Timer2)
  153.                 {
  154.                     T2R = 0;                //Timer stop
  155.                     S1BRT = 1;        //S1 BRT Use Timer2;
  156.                     T2_CT = 0;        //Timer2 set As Timer
  157.                     T2x12 = 1;        //Timer2 set as 1T mode
  158.                     T2H = (u8)(j>>8);
  159.                     T2L = (u8)j;
  160.                     T2R = 1;                //Timer run enable
  161.                 }
  162.                 else
  163.                 {
  164.                     TR1 = 0;
  165.                     S1BRT = 0;                //S1 BRT Use Timer1;
  166.                     T1_CT = 0;                //Timer1 set As Timer
  167.                     TMOD &= ~0x30;//Timer1_16bitAutoReload;
  168.                     T1x12 = 1;                //Timer1 set as 1T mode
  169.                     TH1 = (u8)(j>>8);
  170.                     TL1 = (u8)j;
  171.                     TR1  = 1;
  172.                 }
  173.             }
  174.             else if(COMx->UART_Mode == UART_ShiftRight)
  175.             {
  176.                 if(COMx->BaudRateDouble == ENABLE)        S1M0x6 = 1;        //固定波特率SysClk/2
  177.                 else                                                                S1M0x6 = 0;        //固定波特率SysClk/12
  178.             }
  179.             else if(COMx->UART_Mode == UART_9bit)        //固定波特率SysClk*2^SMOD/64
  180.             {
  181.                 if(COMx->BaudRateDouble == ENABLE)        SMOD = 1;        //固定波特率SysClk/32
  182.                 else                                                                SMOD = 0;        //固定波特率SysClk/64
  183.             }
  184.             UART1_RxEnable(COMx->UART_RxEnable);        //UART接收使能
  185.             if(COMx->Priority <= Priority_3) UART1_Priority(COMx->Priority); else  return FAIL;
  186.             UART1_Interrupt(1);
  187.             
  188.             DMA_UR1T_CFG = 0x80;                //bit7 1:Enable Interrupt
  189.             DMA_UR1T_STA = 0x00;
  190.             DMA_UR1T_AMT =0;                //设置传输总字节数(低8位):n+1
  191.             DMA_UR1T_AMTH = 0;                //设置传输总字节数(高8位):n+1
  192.             DMA_UR1T_TXAH = (u8)((u16)&COM1.TX_Buff >> 8);
  193.             DMA_UR1T_TXAL = (u8)((u16)&COM1.TX_Buff);
  194.             DMA_UR1T_CR = 0xc0;                        //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
  195.             DMA_UR1R_CFG = 0x80;                //bit7 1:Enable Interrupt
  196.             DMA_UR1R_STA = 0x00;
  197.             DMA_UR1R_AMT = 0;                //设置传输总字节数(低8位):n+1
  198.             DMA_UR1R_AMTH = 0;                //设置传输总字节数(高8位):n+1
  199.             DMA_UR1R_RXAH = (u8)((u16)&COM1.RX_Buff >> 8);
  200.             DMA_UR1R_RXAL = (u8)((u16)&COM1.RX_Buff);
  201.             DMA_UR1R_CR = 0xa1;                        //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
  202.             
  203.             return SUCCESS;
  204.         }
  205.     #endif
  206.         return FAIL;        //错误
  207. }
复制代码


  1. #ifndef __USART_H
  2. #define __USART_H
  3. #include "stc.h"
  4. //========================================================================
  5. //                              定义声明
  6. //========================================================================
  7. #define        UART1        1       //使用哪些串口就开对应的定义,不用的串口可屏蔽掉定义,节省资源
  8. #define        UART2        2
  9. #define        UART3        3
  10. #define        UART4        4
  11. #define        COM_TX_Lenth        290         //设置串口发送数据缓冲区大小
  12. #define        COM_RX_Lenth        290         //设置串口接收数据缓冲区大小
  13. #define        PRINTF_SELECT  UART2                //选择 printf 函数所使用的串口,参数 UART1~UART4
  14. #define        UART_ShiftRight        0                //同步移位输出
  15. #define        UART_8bit_BRTx        (1<<6)        //8位数据,可变波特率
  16. #define        UART_9bit                (2<<6)        //9位数据,固定波特率
  17. #define        UART_9bit_BRTx        (3<<6)        //9位数据,可变波特率
  18. #define        RX_TimeIDLE_Set1                5       //接收数据超时时间设置
  19. #define        TimeOutSet2                5
  20. #define        TimeOutSet3                5
  21. #define        TimeOutSet4                5
  22. #define        RX_TimeOUT_Set1     200;
  23. #define        BRT_Timer1        1           //波特率发生器选择
  24. #define        BRT_Timer2        2
  25. #define        BRT_Timer3        3
  26. #define        BRT_Timer4        4
  27. //========================================================================
  28. //                              UART设置
  29. //========================================================================
  30. #define                UART1_RxEnable(n)                (n==0?(REN = 0):(REN = 1))                        /* UART1接收使能 */
  31. #define                UART2_RxEnable(n)                (n==0?(S2REN = 0):(S2REN = 1))                /* UART2接收使能 */
  32. #define                UART3_RxEnable(n)                (n==0?(S3REN = 0):(S3REN = 1))                /* UART3接收使能 */
  33. #define                UART4_RxEnable(n)                (n==0?(S4REN = 0):(S4REN = 1))                /* UART4接收使能 */
  34. #define                CLR_TI2()                        S2TI = 0                        /* 清除TI2                                                                 */
  35. #define                CLR_RI2()                        S2RI = 0                        /* 清除RI2                                                                 */
  36. #define                CLR_TI3()                        S3TI = 0                        /* 清除TI3                                                                 */
  37. #define                CLR_RI3()                        S3RI = 0                        /* 清除RI3                                                                 */
  38. #define                CLR_TI4()                        S4TI = 0                        /* 清除TI3                                                             */
  39. #define                CLR_RI4()                        S4RI = 0                        /* 清除RI3                                                             */
  40. #define                S3_8bit()                        S3SM0 = 0        /* 串口3模式0,8位UART,波特率 = 定时器的溢出率 / 4  */
  41. #define                S3_9bit()                        S3SM0 = 1        /* 串口3模式1,9位UART,波特率 = 定时器的溢出率 / 4  */
  42. #define         S3_BRT_UseTimer3()        S3ST3 = 1        /* BRT select Timer3                                                         */
  43. #define         S3_BRT_UseTimer2()        S3ST3 = 0        /* BRT select Timer2                                                         */
  44. #define                S4_8bit()                        S4SM0 = 0        /* 串口4模式0,8位UART,波特率 = 定时器的溢出率 / 4  */
  45. #define                S4_9bit()                        S4SM0 = 1        /* 串口4模式1,9位UART,波特率 = 定时器的溢出率 / 4  */
  46. #define         S4_BRT_UseTimer4()        S4ST4 = 1        /* BRT select Timer4                                                         */
  47. #define         S4_BRT_UseTimer2()        S4ST4 = 0        /* BRT select Timer2                                                         */
  48. //串口1中断优先级控制
  49. #define         UART1_Priority(n)                        do{if(n == 0) PSH = 0, PS = 0; \
  50.                                                                                                                                 if(n == 1) PSH = 0, PS = 1; \
  51.                                                                                                                                 if(n == 2) PSH = 1, PS = 0; \
  52.                                                                                                                                 if(n == 3) PSH = 1, PS = 1; \
  53.                                                                                                                         }while(0)
  54. #define                UART1_Interrupt(n)        (n==0?(ES = 0):(ES = 1))                                        /* UART1中断使能 */
  55. #define                UART2_Interrupt(n)        (n==0?(ES2 = 0):(ES2 = 1))                                /* UART2中断使能 */
  56. #define                UART3_Interrupt(n)        (n==0?(ES3 = 0):(ES3 = 1))                                /* UART3中断使能 */
  57. #define                UART4_Interrupt(n)        (n==0?(ES4 = 0):(ES4 = 1))                                /* UART4中断使能 */
  58.                                                             
  59. //========================================================================
  60. //                              变量声明
  61. //========================================================================
  62. typedef struct
  63. {
  64.         u8        RX_TimeIDLE;                //字节接收超时(模拟空闲中断)
  65.     u8  RX_TimeOUT;             //接收超时
  66.    
  67.     u8  RX_Buff[COM_RX_Lenth];  //接收数组
  68.     u16        RX_Cnt;                            //接收数据个数
  69.         u16        RX_Cnt_Num;                            //接收数据个数
  70.     u8  TX_Buff[COM_TX_Lenth];  //发送数组
  71.     u16        TX_Cnt;                            //发送数据个数
  72.     u8        TX_OK;                            //发送完成 1
  73.     u8        RX_OK;                            //发送完成 1
  74.    
  75. } COMx_Define;
  76. typedef struct
  77. {
  78.         u8        UART_Mode;                        //模式,         UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  79.         u8        UART_BRT_Use;                //使用波特率,   BRT_Timer1,BRT_Timer2,BRT_Timer3,BRT_Timer4
  80.         u32        UART_BaudRate;                //波特率,            一般 110 ~ 115200
  81.         u8        Morecommunicate;        //多机通讯允许, ENABLE,DISABLE
  82.         u8        UART_RxEnable;                //允许接收,   ENABLE,DISABLE
  83.         u8        BaudRateDouble;                //波特率加倍, ENABLE,DISABLE
  84.     u8  Priority;               //优先级
  85. } COMx_InitDefine;
  86. u8        UART_Configuration(u8 UARTx, COMx_InitDefine *COMx);
  87. extern COMx_Define        xdata COM1;
  88. void UART1_DMA_FreightSend(u8 *pData, u16 Size);
  89. void UART1_DMA_Send(void);
  90. void UART1_DMA_Receive( u16 Size);
  91. u16 UART1_DMA_ReceiveNum(void);
  92. #endif
复制代码
代码部分如上,整体用下来其实非常的简单,总的概括下几个注意事项:

1.串口DMA的读写的数据源地址必须在xram区域,否则无法正常读写;

2.接收不定长数据的时候,接收缓冲区没有接收满但是需要开启下一次接收之前,记得要先复位一下DMA_UR1R_CR寄存器,否则DMA_UR1R_DONE计数器不会清空

3.MDA发送的时候由于是缓冲区发送,为了避免发送过快数据丢失,记得在发送之前要判断上一次是否发送完成。

4.在使用接收之前一定要先开启DMA的数据缓冲区,否则无法收到数据

5.在接收不定长数据时,由于我的这个STC32G12K128暂时不带串口超时中断,所以用了串口数据接收中断做了超时校验(这里一定要开启接收中断),换别的型号的时候可以直接用硬件的超时中断。

6.由于串口的DMA中断用到的中断向量号非常大,可以使用插件或者内嵌汇编的中断跳转,具体查看手册“5.9 关于中断号大于31在Keil中编译出错的处理”相关内容

7.DMA_UR1T_AMT寄存器的实际读写的字节数为(AMT+1),即当AMT 设置为0时,读写1字节,当AMT 设置255时,读写256字节


可以看到整个代码比串口就加了十几行代码,但是效率提高了n多,下面看实测:



具体代码可以在附件中下载测试,等我有了STC32G8K64在来试试这个串口超时中断来替换这个软件超时



串口1使用DMA中断 软件超时接收不定长数据.rar

90.6 KB, 下载次数: 185

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-8 16:00:19 | 显示全部楼层
也就是说对于STC8 系列等没有串口超时中断的单片机,,,还是需要开着串口接收中断。那串口DMA这里就有点鸡肋了,,,本意是通过串口DMA接收串口数据减少单片机进入串口接收中断的次数。就目前也就是做到了不用单片机搬运数据,中断该进还是得进。。再不定长的使用情形下,提升感觉真得不大。定长发送的应该还不错。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-12-8 16:03:16 | 显示全部楼层
先在 STC32G8K64 支持了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-01 04:31:49

24

主题

515

回帖

986

积分

荣誉版主

积分
986
发表于 2023-12-8 16:45:52 | 显示全部楼层
用在STC32G8K64 上面,效果很好。多谢楼主分享。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-8 17:35:05 | 显示全部楼层
神*** 发表于 2023-12-8 16:03
先在 STC32G8K64 支持了

老片子也升级一下啊,,救一救啊。加个超时中断 对不对

点评

也讲下具体哪个老片子  发表于 2023-12-8 17:48
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-8 17:52:23 | 显示全部楼层
神*** 发表于 2023-12-8 16:03
先在 STC32G8K64 支持了

STC8系列啊,,说他老片子其实也挺新的了,STC8AD4也带DMA,最近准备要测试的STC8H8K64U 也是带DMA的。。。还有手册上写的64K的DMA缓冲区STC8H上实现了么。。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2023-12-8 19:32:54 | 显示全部楼层
不用 USB, STC8H8K64U-LQFP48/32 和 STC32G8K64-LQFP48/32 管脚兼容
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2024-01-27 13:25:26

14

主题

18

回帖

175

积分

注册会员

积分
175
发表于 2024-1-5 11:51:53 | 显示全部楼层
_奶*** 发表于 2023-12-8 16:00
也就是说对于STC8 系列等没有串口超时中断的单片机,,,还是需要开着串口接收中断。那串口DMA这里就有点鸡 ...

对啊,不像STM32带空闲中断的,这个用起来确实有点鸡肋
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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