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

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所示:

图 3 ADC DMA UART示例工程流程图
  1. 配置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

  2. 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效率。
  3. 数据采样。
    __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。

测试验证

  1. 用GProgrammer下载adc_dma_uart.bin至开发板。
  2. 将开发板串口UART0,UART1连接至PC端,打开并设置两个GRUart。
  3. 连接UART0的GRUart打印程序的调试信息,连接UART1的GRUart打印ADC采样值的16进制数据。

扫描关注

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