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所示:
- 配置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()进行配置,同时可作为日志打印。
- 使能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); - 设置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); - 等待UART接收到数据。代码如下:
/* Wait until receive any data */ while(!ll_uart_is_active_flag_rfne(SERIAL_PORT_GRP)); - 开始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);
测试验证
- 用GProgrammer下载i2s_master_dma_uart.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示数据通过DMA从UART至I2S发送数据交互结果。