智能车制作

标题: 摄像头数据发送到上位机使用DMA通道 [打印本页]

作者: 1354046363    时间: 2018-3-27 15:16
标题: 摄像头数据发送到上位机使用DMA通道
本帖最后由 1354046363 于 2018-3-27 15:17 编辑

K60有大神用过UART+DMA将摄像头数据发送到电脑上位机吗?
有没有历程



作者: 1325536866    时间: 2018-3-27 19:44
没有啥意义吧,串口始终都慢
作者: 1354046363    时间: 2018-3-27 20:26
1325536866 发表于 2018-3-27 19:44
没有啥意义吧,串口始终都慢

我用过stm32的,明显更快了

作者: 铝、不想生锈    时间: 2018-3-28 19:54
本帖最后由 铝、不想生锈 于 2018-3-28 19:57 编辑

1、设置波特率一样的话,不存在不同单片机UART速度有快慢之分的。
2、使用DMA只是提高了操作效率。

附参考初始化代码:
  1. void uart_tx_dma_init(UARTn_e uratn,DMA_CHn CHn)
  2. {
  3.     /* 开启时钟 */
  4.     SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;                        //打开DMA模块时钟

  5. #if defined(MK60DZ10)
  6.     SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;                     //打开DMA多路复用器时钟
  7. #elif defined(MK60F15)
  8.     SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;                    //打开DMA多路复用器时钟
  9. #endif
  10.     UART_C2_REG(UARTN[uratn]) |= (0
  11.                                   | UART_C2_TIE_MASK             //发送中断或DMA传输请求使能(注释了表示禁用)
  12.                                   );
  13.     UART_C2_REG(UARTN[uratn]) &= ~UART_C2_TCIE_MASK;            /* 禁止发送中断,只使能DMA请求*/
  14.     //使能DMA发送
  15.     UART_C5_REG(UARTN[uratn]) |= (0
  16.                                   |UART_C5_TDMAS_MASK
  17.                                   );
  18.    

  19.     /* 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor ) */
  20.     DMA_DADDR(CHn) =    (uint32)&UART_D_REG(UARTN[uratn]);        // 设置目的地址
  21.     DMA_SOFF(CHn)  =    0x01u;                              // 设置源地址偏移 +1
  22.     DMA_DOFF(CHn)  =    0;                                  // 每次传输后,目的地址加 0
  23.     DMA_ATTR(CHn)  =    (0
  24.                          | DMA_ATTR_SMOD(0x0)               // 源地址模数禁止  Source address modulo feature is disabled
  25.                          | DMA_ATTR_SSIZE(0)                // 源数据位宽 :DMA_BYTEn  。    SSIZE = 0 -> 8-bit ,SSIZE = 1 -> 16-bit ,SSIZE = 2 -> 32-bit ,SSIZE = 4 -> 16-byte
  26.                          | DMA_ATTR_DMOD(0x0)               // 目标地址模数禁止
  27.                          | DMA_ATTR_DSIZE(0)                // 目标数据位宽 :DMA_BYTEn  。  设置参考  SSIZE
  28.                         );


  29.     DMA_CR &= ~DMA_CR_EMLM_MASK;                                // CR[EMLM] = 0

  30.     //当CR[EMLM] = 0 时:
  31.     DMA_NBYTES_MLNO(CHn) =   DMA_NBYTES_MLNO_NBYTES(1); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB */

  32.     /* 配置 DMA 传输结束后的操作 */
  33.     DMA_SLAST(CHn)      =   0;                              //调整  源地址的附加值,主循环结束后恢复  源地址
  34.     DMA_DLAST_SGA(CHn)  =   (uint32) 0 ; //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址
  35.     DMA_CSR(CHn) = 0;
  36.     DMA_CSR(CHn)        =   (0
  37.                              | DMA_CSR_BWC(3)               //带宽控制,每读一次,eDMA 引擎停止 8 个周期(0不停止;1保留;2停止4周期;3停止8周期)
  38.                              | DMA_CSR_DREQ_MASK            //主循环结束后停止硬件请求
  39.                              | DMA_CSR_INTMAJOR_MASK        //主循环结束后产生中断
  40.                             );
  41.    
  42.     /* 配置 DMA 触发源 */
  43. #if defined(MK60DZ10)
  44.     DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0
  45. #elif defined(MK60F15)
  46.     DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR, CHn) = (0
  47. #endif
  48.             | DMAMUX_CHCFG_ENBL_MASK                        /* Enable routing of DMA request */
  49.             //| DMAMUX_CHCFG_TRIG_MASK                        /* Trigger Mode: Periodic   PIT周期触发传输模式   通道1对应PIT1,必须使能PIT1,且配置相应的PIT定时触发 */
  50.             | DMAMUX_CHCFG_SOURCE(DMA_UART3_Tx)                    /* 通道触发传输源:     */
  51.                                              );
  52.    
  53. }

  54. void uart_dma_send(UARTn_e uratn,DMA_CHn CHn,uint8 * SADDR,int length)
  55. {
  56.     DMA_SADDR(CHn) =    (uint32)SADDR;   // 设置  源地址
  57.     DMA_DADDR(CHn) =    &UART_D_REG(UARTN[uratn]);                    // 设置目的地址
  58.     DMA_CITER_ELINKNO(CHn)  = DMA_CITER_ELINKNO_CITER(length);         //当前主循环次数
  59.     DMA_BITER_ELINKNO(CHn)  = DMA_BITER_ELINKNO_BITER(length);        //起始主循环次数
  60.    
  61.     DMA_EN(CHn);                                    //使能通道CHn 硬件请求
  62.     DMA_IRQ_EN(CHn);                                //允许DMA通道传输
  63. }
复制代码


调用示例:
  1.     uart_init(UART3,115200);
  2.     uart_tx_dma_init(UART3,UART3_TX_DMA_CH);
  3.         
  4.     uint8 testData[10] = {1,2,3,4,5};
  5.     uart_dma_send(UART3,UART3_TX_DMA_CH,testData,5);
复制代码


作者: 1354046363    时间: 2018-4-12 10:19
本帖最后由 1354046363 于 2018-4-12 10:21 编辑
铝、不想生锈 发表于 2018-3-28 19:54
1、设置波特率一样的话,不存在不同单片机UART速度有快慢之分的。
2、使用DMA只是提高了操作效率。

很详细,谢谢!问下大神用的哪家的库

作者: 铝、不想生锈    时间: 2018-4-12 14:02
1354046363 发表于 2018-4-12 10:19
很详细,谢谢!问下大神用的哪家的库

山外





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2