知名人物
渣
- 积分
- 37979
- 威望
- 11560
- 贡献
- 3701
- 兑换币
- 2372
- 注册时间
- 2014-11-1
- 在线时间
- 11359 小时
|
本帖最后由 铝、不想生锈 于 2018-3-28 19:57 编辑
1、设置波特率一样的话,不存在不同单片机UART速度有快慢之分的。
2、使用DMA只是提高了操作效率。
附参考初始化代码:
- void uart_tx_dma_init(UARTn_e uratn,DMA_CHn CHn)
- {
- /* 开启时钟 */
- SIM_SCGC7 |= SIM_SCGC7_DMA_MASK; //打开DMA模块时钟
- #if defined(MK60DZ10)
- SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK; //打开DMA多路复用器时钟
- #elif defined(MK60F15)
- SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK; //打开DMA多路复用器时钟
- #endif
- UART_C2_REG(UARTN[uratn]) |= (0
- | UART_C2_TIE_MASK //发送中断或DMA传输请求使能(注释了表示禁用)
- );
- UART_C2_REG(UARTN[uratn]) &= ~UART_C2_TCIE_MASK; /* 禁止发送中断,只使能DMA请求*/
- //使能DMA发送
- UART_C5_REG(UARTN[uratn]) |= (0
- |UART_C5_TDMAS_MASK
- );
-
- /* 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor ) */
- DMA_DADDR(CHn) = (uint32)&UART_D_REG(UARTN[uratn]); // 设置目的地址
- DMA_SOFF(CHn) = 0x01u; // 设置源地址偏移 +1
- DMA_DOFF(CHn) = 0; // 每次传输后,目的地址加 0
- DMA_ATTR(CHn) = (0
- | DMA_ATTR_SMOD(0x0) // 源地址模数禁止 Source address modulo feature is disabled
- | DMA_ATTR_SSIZE(0) // 源数据位宽 :DMA_BYTEn 。 SSIZE = 0 -> 8-bit ,SSIZE = 1 -> 16-bit ,SSIZE = 2 -> 32-bit ,SSIZE = 4 -> 16-byte
- | DMA_ATTR_DMOD(0x0) // 目标地址模数禁止
- | DMA_ATTR_DSIZE(0) // 目标数据位宽 :DMA_BYTEn 。 设置参考 SSIZE
- );
- DMA_CR &= ~DMA_CR_EMLM_MASK; // CR[EMLM] = 0
- //当CR[EMLM] = 0 时:
- DMA_NBYTES_MLNO(CHn) = DMA_NBYTES_MLNO_NBYTES(1); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB */
- /* 配置 DMA 传输结束后的操作 */
- DMA_SLAST(CHn) = 0; //调整 源地址的附加值,主循环结束后恢复 源地址
- DMA_DLAST_SGA(CHn) = (uint32) 0 ; //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址
- DMA_CSR(CHn) = 0;
- DMA_CSR(CHn) = (0
- | DMA_CSR_BWC(3) //带宽控制,每读一次,eDMA 引擎停止 8 个周期(0不停止;1保留;2停止4周期;3停止8周期)
- | DMA_CSR_DREQ_MASK //主循环结束后停止硬件请求
- | DMA_CSR_INTMAJOR_MASK //主循环结束后产生中断
- );
-
- /* 配置 DMA 触发源 */
- #if defined(MK60DZ10)
- DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0
- #elif defined(MK60F15)
- DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR, CHn) = (0
- #endif
- | DMAMUX_CHCFG_ENBL_MASK /* Enable routing of DMA request */
- //| DMAMUX_CHCFG_TRIG_MASK /* Trigger Mode: Periodic PIT周期触发传输模式 通道1对应PIT1,必须使能PIT1,且配置相应的PIT定时触发 */
- | DMAMUX_CHCFG_SOURCE(DMA_UART3_Tx) /* 通道触发传输源: */
- );
-
- }
- void uart_dma_send(UARTn_e uratn,DMA_CHn CHn,uint8 * SADDR,int length)
- {
- DMA_SADDR(CHn) = (uint32)SADDR; // 设置 源地址
- DMA_DADDR(CHn) = &UART_D_REG(UARTN[uratn]); // 设置目的地址
- DMA_CITER_ELINKNO(CHn) = DMA_CITER_ELINKNO_CITER(length); //当前主循环次数
- DMA_BITER_ELINKNO(CHn) = DMA_BITER_ELINKNO_BITER(length); //起始主循环次数
-
- DMA_EN(CHn); //使能通道CHn 硬件请求
- DMA_IRQ_EN(CHn); //允许DMA通道传输
- }
复制代码
调用示例:
- uart_init(UART3,115200);
- uart_tx_dma_init(UART3,UART3_TX_DMA_CH);
-
- uint8 testData[10] = {1,2,3,4,5};
- uart_dma_send(UART3,UART3_TX_DMA_CH,testData,5);
复制代码
|
|