GD32E23x_Demo_Suites ,USART_DMA

[复制链接]
793|4
 楼主| 我爱台妹mmd 发表于 2023-9-30 19:19 | 显示全部楼层 |阅读模式
AI, ICL, NET, DM, DMA, SAR, TE
example:

              GD32E23x_Demo_Suites_V1.0.1/GD32E230C_EVAL_Demo_Suites/Projects/06_USART_DMA

实现效果:

        1.printf("a usart dma function test example!")        // USART0打印

        2.DMA channel 1, 把程序定义的txbuffer[ ]的内容(存储器)传输到数据发送寄存器USART0_TXDATA(外设),即USART0_TX打印出来

       3.DMA channel 2, DMA从外设USART0_RXDATA寄存器(外设)读取内容,读到程序定义的rxBuffer[10], 然后用printf打印出来

 楼主| 我爱台妹mmd 发表于 2023-9-30 19:19 | 显示全部楼层
所以DMA外设的基本操作就是:

        定义外设和存储器,初始化DMA结构体, 使能DMA传输,检测标志等待DMA传输完成。
 楼主| 我爱台妹mmd 发表于 2023-9-30 19:19 | 显示全部楼层
  1. //寄存器地址:外设基址 + 寄存器偏移地址

  2. /*qyc add, usart0 base 0x40003800, USART_TDATA addr_Offset 0x28*/
  3. #define USART0_TDATA_ADDRESS      ((uint32_t)0x40013828)

  4. /*qyc add, usart0 base 0x40003800, USART_TDATA addr_Offset 0x24*/
  5. #define USART0_RDATA_ADDRESS      ((uint32_t)0x40013824)  
 楼主| 我爱台妹mmd 发表于 2023-9-30 19:20 | 显示全部楼层
初始化DMA channel 1的例子:
  1. dma_deinit(DMA_CH1);
  2. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  3. dma_init_struct.memory_addr = (uint32_t)txbuffer;
  4. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  5. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  6. dma_init_struct.number = ARRAYNUM(txbuffer);
  7.        
  8. dma_init_struct.periph_addr = USART0_TDATA_ADDRESS;
  9. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  10. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  11. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  12. dma_init(DMA_CH1,&dma_init_struct);

  13. /* configure DMA mode */
  14. dma_circulation_disable(DMA_CH1);

  15. dma_memory_to_memory_disable(DMA_CH1);

  16. /* enable DMA channel1 */
  17. dma_channel_enable(DMA_CH1);

  18. usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
  19.        
  20. /* wait DMA Channel transfer complete */
  21. while(RESET == dma_flag_get(DMA_CH1, DMA_FLAG_FTF));
 楼主| 我爱台妹mmd 发表于 2023-9-30 19:20 | 显示全部楼层
使能USART的USART_CTRL2寄存器的DMA发送和 DMA接收使能位:
  1. //寄存器是USART_CTL2, DENT和DENR位

  2. #define CTL2_DENR(regval)             (BIT(6) & ((uint32_t)(regval) << 6))
  3. #define USART_DENR_ENABLE             CTL2_DENR(1)               
  4. #define USART_DENR_DISABLE            CTL2_DENR(0)      

  5. #define CTL2_DENT(regval)             (BIT(7) & ((uint32_t)(regval) << 7))
  6. #define USART_DENT_ENABLE             CTL2_DENT(1)                  
  7. #define USART_DENT_DISABLE            CTL2_DENT(0)      

  8. usart_dma_transmit_config(USART0, USART_DENT_ENABLE);

  9. usart_dma_receive_config(USART0, USART_DENR_ENABLE);      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

648

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部