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

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

[复制链接]
  • TA的每日心情
    开心
    昨天 08:10
  • 签到天数: 93 天

    [LV.6]常住居民II

    38

    主题

    989

    回帖

    6793

    积分

    荣誉版主

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

    积分
    6793
    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, 下载次数: 70

    回复 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:05
  • 签到天数: 137 天

    [LV.7]常住居民III

    20

    主题

    1051

    回帖

    2495

    积分

    金牌会员

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9346

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:39
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1327

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:05
  • 签到天数: 137 天

    [LV.7]常住居民III

    20

    主题

    1051

    回帖

    2495

    积分

    金牌会员

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

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

    点评

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:05
  • 签到天数: 137 天

    [LV.7]常住居民III

    20

    主题

    1051

    回帖

    2495

    积分

    金牌会员

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

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9346

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-27 13:25
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    14

    主题

    18

    回帖

    175

    积分

    注册会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-9 05:35 , Processed in 0.187680 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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