UART2_EDMA例程 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10473|回复: 12

UART2_EDMA例程

[复制链接]

3

主题

6

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2015-11-18 15:45:03 | 显示全部楼层 |阅读模式
C6748的板子,自带的UART2_EDMA例程是通过UART串口把数据传输到PC机,可是每次只有输入达到5个字符才一起显示在上位机,而且只能传输一次,在输入不管多少个字符都不会再传输了,我现在的问题是想要能够无限次的输入并每输入一个字符就在上位机显示一个,请问该怎么弄?谢谢了!
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
发表于 2015-11-19 13:55:38 | 显示全部楼层
  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*              通用异步串口2测试(EDMA3 方式)                             */
  4. /*                                                                          */
  5. /*              2014年10月24日                                              */
  6. /*                                                                          */
  7. /****************************************************************************/
  8. // 注意:DSP ports, Shared RAM, UART0, EDMA, SPI0, MMC/SDs,
  9. //       VPIF, LCDC, SATA, uPP, DDR2/mDDR (bus ports), USB2.0, HPI, PRU
  10. //       这些外设使用的时钟来源为 PLL0_SYSCLK2 默认频率为 CPU 频率的二分之一
  11. //       但是,ECAPs, UART1/2, Timer64P2/3, eHRPWMs,McBSPs, McASP0, SPI1
  12. //       这些外设的时钟来源可以在 PLL0_SYSCLK2 和 PLL1_SYSCLK2 中选择
  13. //       通过修改 System Configuration (SYSCFG) Module
  14. //       寄存器 Chip Configuration 3 Register (CFGCHIP3) 第四位 ASYNC3_CLKSRC
  15. //       配置时钟来源
  16. //       (默认值) 0 来源于 PLL0_SYSCLK2
  17. //                  1 来源于 PLL1_SYSCLK2
  18. //       如果不是为了降低功耗,不建议修改这个值,它会影响所有相关外设的时钟频率

  19. // 修改为连续收发模式 2015/11/19

  20. #include "TL6748.h"                 // 创龙 DSP6748 开发板相关声明

  21. #include "hw_types.h"               // 宏命令
  22. #include "hw_syscfg0_C6748.h"       // 系统配置模块寄存器
  23. #include "soc_C6748.h"              // DSP C6748 外设寄存器

  24. #include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
  25. #include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  26. #include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
  27. #include "interrupt.h"              // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
  28. #include "edma.h"                   // 直接内存访问宏及设备抽象层函数声明
  29. #include "edma_event.h"             // 直接内存访问事件

  30. #include "uartStdio.h"              // 串口标准输入输出终端函数声明

  31. #include "string.h"

  32. /****************************************************************************/
  33. /*                                                                          */
  34. /*              宏定义                                                      */
  35. /*                                                                          */
  36. /****************************************************************************/
  37. // 软件断点
  38. #define SW_BREAKPOINT     asm(" SWBP 0 ");

  39. // EDMA3 参数
  40. #define MAX_ACNT           1
  41. #define MAX_CCNT           1
  42. #define RX_BUFFER_SIZE     1

  43. // EDMA3 通道
  44. #define EVT_QUEUE_NUM          0

  45. /****************************************************************************/
  46. /*                                                                          */
  47. /*              全局变量                                                    */
  48. /*                                                                          */
  49. /****************************************************************************/
  50. volatile unsigned int flag = 0;

  51. /****************************************************************************/
  52. /*                                                                          */
  53. /*              函数声明                                                    */
  54. /*                                                                          */
  55. /****************************************************************************/
  56. // 外设使能配置
  57. void PSCInit(void);

  58. // DSP 中断初始化
  59. void InterruptInit(void);
  60. // EDMA3 中断初始化
  61. void EDMA3InterruptInit(void);

  62. // 串口发送数据
  63. void UartTransmitData(unsigned int tccNum, unsigned int chNum,
  64.                         volatile char *buffer, unsigned int buffLength);
  65. // 串口接收数据
  66. void UartReceiveData(unsigned int tccNum, unsigned int chNum,
  67.                        volatile char *buffer);
  68. // 回调函数
  69. void (*cb_Fxn[EDMA3_NUM_TCC]) (unsigned int tcc, unsigned int status);
  70. void callback(unsigned int tccNum, unsigned int status);

  71. // UART EDMA3 初始化
  72. void EDMA3UARTInit();
  73. // EDMA3 初始化
  74. void EDMA3Initialize(void);
  75. // EDMA3 中断服务函数
  76. void Edma3ComplHandlerIsr(void);
  77. void Edma3CCErrHandlerIsr(void);

  78. /****************************************************************************/
  79. /*                                                                          */
  80. /*              主函数                                                      */
  81. /*                                                                          */
  82. /****************************************************************************/
  83. int main(void)
  84. {
  85.         // 外设使能配置
  86.         PSCInit();

  87.         // DSP 中断初始化
  88.         InterruptInit();

  89.         // EDMA3 中断初始化
  90.         EDMA3InterruptInit();

  91.         // EDMA3 初始化
  92.         EDMA3UARTInit();

  93.     // 初始化串口终端 使用串口2
  94.     UARTStdioInit();

  95.     // 申请串口 EDMA3 发送通道
  96.     EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
  97.                           EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX,
  98.                           EVT_QUEUE_NUM);

  99.     // 注册回调函数
  100.     cb_Fxn[EDMA3_CHA_UART2_TX] = &callback;

  101.     // 申请串口 EDMA3 接收通道
  102.     EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
  103.                           EDMA3_CHA_UART2_RX, EDMA3_CHA_UART2_RX,
  104.                           EVT_QUEUE_NUM);

  105.     // 注册回调函数
  106.     cb_Fxn[EDMA3_CHA_UART2_RX] = &callback;

  107.     volatile char enter[] = "Tronlong UART2 EDMA3 Application......\n\rPlease Enter 20 bytes from keyboard\r\n";
  108.     volatile char buffer[RX_BUFFER_SIZE];
  109.     unsigned int buffLength = 0;

  110.     // 发送数据
  111.     buffLength = strlen((const char *)enter);
  112.     UartTransmitData(EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX, enter, buffLength);

  113.     // 使能串口 DMA 模式
  114.     UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 |  \
  115.                                      UART_DMAMODE |         \
  116.                                      UART_FIFO_MODE );

  117.     // 等待从回调函数返回
  118.     while(flag == 0);
  119.     flag = 0;

  120. //    // 释放 EDMA3 通道
  121. //    EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
  122. //                       EDMA3_CHA_UART2_TX, EDMA3_TRIG_MODE_EVENT,
  123. //                       EDMA3_CHA_UART2_TX, EVT_QUEUE_NUM);
  124. //
  125. //    EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
  126. //                       EDMA3_CHA_UART2_RX, EDMA3_TRIG_MODE_EVENT,
  127. //                       EDMA3_CHA_UART2_RX, EVT_QUEUE_NUM);

  128.         // 主循环
  129.         for(;;)
  130.         {
  131.             // 接收数据
  132.             UartReceiveData(EDMA3_CHA_UART2_RX, EDMA3_CHA_UART2_RX, buffer);

  133.             // 使能串口 DMA 模式
  134.             UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 | \
  135.                                              UART_DMAMODE |        \
  136.                                              UART_FIFO_MODE );

  137.             // 等待从回调函数返回
  138.             while(flag == 0);
  139.             flag = 0;

  140.             // 发送数据
  141.             UartTransmitData(EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX, buffer, RX_BUFFER_SIZE);

  142.             // 使能串口 DMA 模式
  143.             UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 |  \
  144.                                              UART_DMAMODE |         \
  145.                                              UART_FIFO_MODE );

  146.             // 等待从回调函数返回
  147.             while(flag == 0);
  148.             flag = 0;
  149.         }
  150. }

  151. /****************************************************************************/
  152. /*                                                                          */
  153. /*              PSC 初始化                                                  */
  154. /*                                                                          */
  155. /****************************************************************************/
  156. void PSCInit(void)
  157. {
  158.         // 对相应外设模块的使能也可以在 BootLoader 中完成
  159.         // 使能 EDMA3CC_0
  160.     PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

  161.     // 使能 EDMA3TC_0
  162.     PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  163. }

  164. /****************************************************************************/
  165. /*                                                                          */
  166. /*              DSP 中断初始化                                              */
  167. /*                                                                          */
  168. /****************************************************************************/
  169. void InterruptInit(void)
  170. {
  171.         // 初始化 DSP 中断控制器
  172.         IntDSPINTCInit();

  173.         // 使能 DSP 全局中断
  174.         IntGlobalEnable();
  175. }

  176. /****************************************************************************/
  177. /*                                                                          */
  178. /*              EDMA3 初始化                                                */
  179. /*                                                                          */
  180. /****************************************************************************/
  181. void EDMA3UARTInit(void)
  182. {
  183.         EDMA3Init(SOC_EDMA30CC_0_REGS, EVT_QUEUE_NUM);
  184. }

  185. /****************************************************************************/
  186. /*                                                                          */
  187. /*              EDMA3 中断初始化                                            */
  188. /*                                                                          */
  189. /****************************************************************************/
  190. void EDMA3InterruptInit(void)
  191. {
  192.         IntRegister(C674X_MASK_INT4, Edma3ComplHandlerIsr);
  193.         IntRegister(C674X_MASK_INT5, Edma3CCErrHandlerIsr);

  194.         IntEventMap(C674X_MASK_INT4, SYS_INT_EDMA3_0_CC0_INT1);
  195.         IntEventMap(C674X_MASK_INT5, SYS_INT_EDMA3_0_CC0_ERRINT);

  196.         IntEnable(C674X_MASK_INT4);
  197.         IntEnable(C674X_MASK_INT5);
  198. }

  199. /****************************************************************************/
  200. /*                                                                          */
  201. /*              EDMA3 中断服务函数                                          */
  202. /*                                                                          */
  203. /****************************************************************************/
  204. void Edma3ComplHandlerIsr(void)
  205. {
  206.     volatile unsigned int pendingIrqs;
  207.     volatile unsigned int isIPR = 0;

  208.     unsigned int indexl;
  209.     unsigned int Cnt = 0;

  210.     indexl = 1;

  211.     IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);

  212.     isIPR = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IPR(1));
  213.     if(isIPR)
  214.     {
  215.         while((Cnt < EDMA3CC_COMPL_HANDLER_RETRY_COUNT)&& (indexl != 0u))
  216.         {
  217.             indexl = 0u;
  218.             pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IPR(1));

  219.             while(pendingIrqs)
  220.             {
  221.                 if((pendingIrqs & 1u) == TRUE)
  222.                 {
  223.                     HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_ICR(1)) = (1u << indexl);

  224.                     (*cb_Fxn[indexl])(indexl, EDMA3_XFER_COMPLETE);
  225.                 }
  226.                 ++indexl;
  227.                 pendingIrqs >>= 1u;
  228.             }
  229.             Cnt++;
  230.         }
  231.     }
  232. }

  233. void Edma3CCErrHandlerIsr()
  234. {
  235.     volatile unsigned int pendingIrqs = 0;
  236.     unsigned int regionNum = 0;
  237.     unsigned int evtqueNum = 0;
  238.     unsigned int index = 1;
  239.     unsigned int Cnt = 0;

  240.     IntEventClear(SYS_INT_EDMA3_0_CC0_ERRINT);

  241.     if((HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR) != 0 ) || \
  242.        (HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR) != 0) || \
  243.        (HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR) != 0))
  244.     {
  245.         while((Cnt < EDMA3CC_ERR_HANDLER_RETRY_COUNT) && (index != 0u))
  246.         {
  247.             index = 0u;
  248.             pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR);
  249.             while(pendingIrqs)
  250.             {
  251.                 if((pendingIrqs & 1u) == TRUE)
  252.                 {
  253.                     HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMCR) = (1u<<index);
  254.                     HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_SECR(regionNum)) = (1u<<index);
  255.                 }

  256.                 ++index;
  257.                 pendingIrqs >>= 1u;
  258.             }

  259.             index = 0u;
  260.             pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR);

  261.             while(pendingIrqs)
  262.             {
  263.                 if((pendingIrqs & 1u)==TRUE)
  264.                 {
  265.                     HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMCR) = (1u<<index);
  266.                     HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_QSECR(0)) = (1u<<index);
  267.                 }

  268.                 ++index;
  269.                 pendingIrqs >>= 1u;
  270.             }

  271.             index = 0u;
  272.             pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR);

  273.                         if(pendingIrqs != 0u)
  274.                         {
  275.                                 for(evtqueNum = 0u; evtqueNum < EDMA3_0_NUM_EVTQUE; evtqueNum++)
  276.                                 {
  277.                                         if((pendingIrqs & (1u << evtqueNum)) != 0u)
  278.                                         {
  279.                                                 HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERRCLR) = (1u << evtqueNum);
  280.                                         }
  281.                                  }

  282.                                  if ((pendingIrqs & (1 << EDMA3CC_CCERR_TCCERR_SHIFT)) != 0u)
  283.                                  {
  284.                                          HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERRCLR) = \
  285.                                                   (0x01u << EDMA3CC_CCERR_TCCERR_SHIFT);
  286.                                  }

  287.                                  ++index;
  288.                         }

  289.                         Cnt++;
  290.         }
  291.     }
  292. }

  293. /****************************************************************************/
  294. /*                                                                          */
  295. /*              发送数据                                                    */
  296. /*                                                                          */
  297. /****************************************************************************/
  298. void UartTransmitData(unsigned int tccNum, unsigned int chNum,
  299.                          volatile char *buffer, unsigned int buffLength)
  300. {
  301.     EDMA3CCPaRAMEntry paramSet;

  302.     // 配置参数 RAM
  303.     paramSet.srcAddr = (unsigned int)buffer;
  304.     // 接收缓存寄存器 / 发送保持寄存器 地址
  305.     paramSet.destAddr = SOC_UART_2_REGS + 0;
  306.     paramSet.aCnt = MAX_ACNT;
  307.     paramSet.bCnt = (unsigned short)buffLength;
  308.     paramSet.cCnt = MAX_CCNT;

  309.     // 源索引自增系数 1 即一个字节
  310.     paramSet.srcBIdx = (short)1u;

  311.     // 目标索引自增系数
  312.     paramSet.destBIdx = (short)0u;

  313.     // 异步传输模式
  314.     paramSet.srcCIdx = (short)0u;
  315.     paramSet.destCIdx = (short)0u;
  316.     paramSet.linkAddr = (unsigned short)0xFFFFu;
  317.     paramSet.bCntReload = (unsigned short)0u;
  318.     paramSet.opt = 0x00000000u;
  319.     paramSet.opt |= (EDMA3CC_OPT_DAM );
  320.     paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);
  321.     paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);

  322.     // 写参数 RAM
  323.     EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet);

  324.     // 使能 EDMA3 通道
  325.     EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_EVENT);
  326. }

  327. /****************************************************************************/
  328. /*                                                                          */
  329. /*              接收数据                                                    */
  330. /*                                                                          */
  331. /****************************************************************************/
  332. void UartReceiveData(unsigned int tccNum, unsigned int chNum,
  333.                             volatile char *buffer)
  334. {
  335.     EDMA3CCPaRAMEntry paramSet;

  336.     // 配置参数 RAM
  337.     // 接收缓存寄存器 / 发送保持寄存器 地址
  338.     paramSet.srcAddr = SOC_UART_2_REGS + 0;
  339.     paramSet.destAddr = (unsigned int)buffer;
  340.     paramSet.aCnt = MAX_ACNT;
  341.     paramSet.bCnt = RX_BUFFER_SIZE;
  342.     paramSet.cCnt = MAX_CCNT;

  343.     // 源索引自增系数
  344.     paramSet.srcBIdx = 0;
  345.     // 目标索引自增系数 1 即一个字节
  346.     paramSet.destBIdx = 1;

  347.     // 异步模式
  348.     paramSet.srcCIdx = 0;
  349.     paramSet.destCIdx = 0;
  350.     paramSet.linkAddr = (unsigned short)0xFFFFu;
  351.     paramSet.bCntReload = 0;
  352.     paramSet.opt = 0x00000000u;
  353.     paramSet.opt |= ((EDMA3CC_OPT_SAM) << EDMA3CC_OPT_SAM_SHIFT);
  354.     paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);
  355.     paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);

  356.     // 写参数 RAM
  357.     EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet);

  358.     // 使能 EDMA3 通道
  359.     EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_EVENT);
  360. }

  361. /****************************************************************************/
  362. /*                                                                          */
  363. /*              回调函数                                                    */
  364. /*                                                                          */
  365. /****************************************************************************/
  366. void callback(unsigned int tccNum, unsigned int status)
  367. {
  368.     UARTDMADisable(SOC_UART_2_REGS, (UART_RX_TRIG_LEVEL_1 | UART_FIFO_MODE));

  369.     flag = 1;
  370. }
复制代码


回复 支持 反对

使用道具 举报

3

主题

6

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2015-11-19 20:51:26 | 显示全部楼层
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet);  第三个参数是啥?我试着仿真了一下,好像还不行!

点评

只改过主函数和宏定义 我测过的完全可以  详情 回复 发表于 2015-11-20 09:25
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
发表于 2015-11-20 09:25:33 | 显示全部楼层
xaut606 发表于 2015-11-19 20:51
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet);  第三个参数是啥?我试着仿真了一下,好像还不行! ...

只改过主函数和宏定义 我测过的完全可以
回复 支持 反对

使用道具 举报

3

主题

6

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2015-11-21 10:00:33 | 显示全部楼层
恩,跑通了!
// 回调函数
void (*cb_Fxn[EDMA3_NUM_TCC]) (unsigned int tcc, unsigned int status);
void callback(unsigned int tccNum, unsigned int status);
// 注册回调函数
    cb_Fxn[EDMA3_CHA_UART2_TX] = &callback;
// 等待从回调函数返回
    while(flag == 0);
但是关于回调函数这块我还是没能很好的理解,麻烦您给在详细解答一下,非常感谢!

点评

回调函数就是通过指针调用的函数 在这里就是传输完成后禁用 DMA  详情 回复 发表于 2015-11-22 14:23
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
发表于 2015-11-22 14:23:14 | 显示全部楼层
xaut606 发表于 2015-11-21 10:00
恩,跑通了!
// 回调函数
void (*cb_Fxn[EDMA3_NUM_TCC]) (unsigned int tcc, unsigned int status);

回调函数就是通过指针调用的函数
在这里就是传输完成后禁用 DMA
回复 支持 反对

使用道具 举报

3

主题

6

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2015-11-23 08:54:20 | 显示全部楼层
我现在接触C6748有一段时间了,一直都是在看例程和一些datasheet,我现在想编一些简单的程序练练手,请问编一些什么样的程序比较适合?麻烦给推荐几个,最好是能在6748上仿真的!

点评

这个.... 根据需要来吧 比如 你正在参与的项目  详情 回复 发表于 2015-11-23 09:17
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
发表于 2015-11-23 09:17:34 | 显示全部楼层
xaut606 发表于 2015-11-23 08:54
我现在接触C6748有一段时间了,一直都是在看例程和一些datasheet,我现在想编一些简单的程序练练手,请问编 ...

这个.... 根据需要来吧
比如 你正在参与的项目
回复 支持 反对

使用道具 举报

0

主题

10

帖子

1035

积分

金牌会员

Rank: 6Rank: 6

积分
1035
发表于 2016-5-3 20:29:40 | 显示全部楼层
有没有EDMA的使用心得呢,给分享一下
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
发表于 2016-9-13 20:07:29 | 显示全部楼层
EDMA3 的传输完成中断进不去,IPR相应位已经置1,其他中断都能运行。
看到有人解释“EDMA的中断要从相应的region配置,不是从global配置。”   不理解 ,求解答???
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-4-16 14:38 , Processed in 0.044911 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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