ADC DMA UART
ADC DMA UART示例实现了使用DMA方式将ADC采样数据通过UART直接传输至PC或其他外围设备。数据传输无需CPU参与,有助于高速数据传输。
ADC DMA UART示例的源代码和工程文件位于SDK_Folder\projects\peripheral\adc\adc_dma_uart,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 3所示:
- 配置ADC模块。
g_adc_handle.init.channel_p = ADC_INPUT_SRC_IO0; g_adc_handle.init.channel_n = ADC_INPUT_SRC_IO1; g_adc_handle.init.input_mode = ADC_INPUT_SINGLE; g_adc_handle.init.ref_source = ADC_REF_SRC_BUF_INT; g_adc_handle.init.ref_value = ADC_REF_VALUE_1P6; g_adc_handle.init.clock = ADC_CLK_1P6M;ADC配置参数详情请参考ADC。
- UART发送阈值及DMA传输单元大小配置。
ll_adc_set_thresh(16); ll_uart_set_tx_fifo_threshold(uart_handle.p_instance, LL_UART_TX_FIFO_TH_CHAR_2); ll_dma_set_source_burst_length(DMA, hadc->p_dma->channel, LL_DMA_SRC_BURST_LENGTH_8); ll_dma_set_destination_burst_length(DMA, hadc->p_dma->channel, LL_DMA_DST_BURST_LENGTH_8);- ADC阈值配置为16,即ADC采样到16个数据时请求DMA传输。
- UART发送阈值配置为2,即UART TX FIFO中的数据少于2个时请求DMA传输。
- DMA burst长度配置为8,即一次传输8个数据,用于减少DMA的读取次数,提高DMA效率。
- 数据采样。
__HAL_ADC_ENABLE_CLOCK(hadc); hal_dma_start(hadc->p_dma, (uint32_t)&MCU_SUB->SENSE_ADC_FIFO, (uint32_t)&UART1->RBR_DLL_THR, TEST_CONV_LENGTH >> 1); hal_dma_poll_for_transfer(hadc->p_dma, 1000); __HAL_ADC_DISABLE_CLOCK(hadc);- 打开ADC时钟。
- 调用hal_dma_start()开始DMA传输。
- hal_dma_poll_for_transfer()以polling方式等待DMA传输完成。结果将通过UART1传输至GRUart。
测试验证
- 用GProgrammer下载adc_dma_uart.bin至开发板。
- 将开发板串口UART0,UART1连接至PC端,打开并设置两个GRUart。
- 连接UART0的GRUart打印程序的调试信息,连接UART1的GRUart打印ADC采样值的16进制数据。