CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

I2S Master DMA UART

I2S Master DMA UART示例用于验证DMA的p2p功能,数据通过DMA从UART发送至I2S。

I2S Master DMA UART示例的源代码和工程文件位于SDK_Folder\projects\peripheral\i2s\i2s_master_dma_uart,其中工程文件在文件夹Keil_5下。

代码理解

示例工程流程图如图 19所示:

图 19 I2S Master DMA UART示例工程流程图
  1. 配置I2S模块。
    hi2s->p_instance        = I2S_M;
    hi2s->init.data_size    = I2S_DATASIZE_16BIT;
    hi2s->init.clock_source = I2S_CLOCK_SRC_32M;
    hi2s->init.audio_freq   = 4000;
    
    hal_i2s_deinit(hi2s);
    hal_i2s_init(hi2s);
    
    • I2S详细配置参数请参考I2S Master Audio。此示例工程中,init.data_size选择I2S_DATASIZE_16BIT,init.clock_source选择I2S_CLOCK_SRC_32M,init.audio_freq选择4000。
    • UART通过调用app_log_init()进行配置,同时可作为日志打印。
  2. 使能I2S DMA、刷新TX FIFO,以及使能TX通道、TX block。代码如下:
    __HAL_I2S_ENABLE_DMA(hi2s);
    /* Flush TX FIFO */
    ll_i2s_clr_txfifo_all(hi2s->p_instance);
    /* Enable channel TX */
    ll_i2s_enable_tx(hi2s->p_instance, 0);
    /* Enable TX block */
    ll_i2s_enable_txblock(hi2s->p_instance);
    
  3. 设置UART接收阈值与DMA Burst长度。代码如下:
    ll_uart_set_rx_fifo_threshold(SERIAL_PORT_GRP, LL_UART_RX_FIFO_TH_QUARTER_FULL);
    ll_dma_set_source_burst_length(DMA, hi2s->p_dmatx->channel, 
                                   LL_DMA_SRC_BURST_LENGTH_8);
    ll_dma_set_destination_burst_length(DMA, hi2s->p_dmatx->channel, 
                                        LL_DMA_DST_BURST_LENGTH_8);
    
  4. 等待UART接收到数据。代码如下:
    /* Wait until receive any data */
    while(!ll_uart_is_active_flag_rfne(SERIAL_PORT_GRP));
    
  5. 开始DMA传输、使能TX FIFO空时触发中断、使能I2S时钟,并等待DMA传输完成。代码如下:
    hal_dma_start(hi2s->p_dmatx, (uint32_t)&UART0->RBR_DLL_THR, 
    (uint32_t)&hi2s->p_instance->TXDMA, TEST_LENGTH);
    __HAL_I2S_ENABLE_IT(hi2s, I2S_IT_TXFE);
    /* Enable clock */
    ll_i2s_enable_clock(hi2s->p_instance);
    hal_dma_poll_for_transfer(hi2s->p_dmatx, 1000);
    

测试验证

  1. 用GProgrammer下载i2s_master_dma_uart.bin至开发板。
  2. 将开发板串口连接至PC端,打开并配置GRUart。
  3. 在GRUart的Receive Data窗口中将会显示数据通过DMA从UART至I2S发送数据交互结果。

扫描关注

打开微信,使用“扫一扫”即可关注。