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

SPIM DMA UART

SPIM DMA UART示例实现了将UART中的数据通过DMA方式发送至SPI中并用SPI DMA方式发出数据,此示例请使用逻辑分析仪观察数据的正确性。

SPIM DMA UART示例的源代码和工程文件位于SDK_Folder\projects\peripheral\spi\spim_dma_uart,其中工程文件在文件夹Keil_5下。

代码理解

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

图 29 SPIM DMA UART示例流程图
  1. SPIM DMA UART的初始化。
    g_spim_handle.init.data_size   = SPI_DATASIZE_32BIT;
    g_spim_handle.init.clock_polarity   = SPI_POLARITY_LOW;
    g_spim_handle.init.clock_phase   = SPI_PHASE_1EDGE;
    g_spim_handle.init.baudrate_prescaler = SystemCoreClock/2000000;
    g_spim_handle.init.ti_mode     = SPI_TIMODE_DISABLE;
    g_spim_handle.init.slave_select    = SPI_SLAVE_SELECT_0;
    hal_spi_init(&g_spim_handle);
    

    SPI详细配置参数请参考SPIM DMA

  2. 在写模式下配置SPI。代码如下:
    __HAL_SPI_DISABLE(hspi);
    ll_spi_set_transfer_direction(hspi->p_instance, LL_SSI_SIMPLEX_TX);
    __HAL_SPI_ENABLE(hspi);
    
  3. 设置UART接收阈值与DMA Burst长度。代码如下:
    ll_uart_set_rx_fifo_threshold(SERIAL_PORT_GRP, LL_UART_RX_FIFO_TH_CHAR_1);
    ll_dma_set_source_burst_length(DMA, hspi->p_dmatx->channel, LL_DMA_SRC_BURST_LENGTH_1);
    ll_dma_set_destination_burst_length(DMA,
                                        hspi->p_dmatx->channel, LL_DMA_DST_BURST_LENGTH_4);
    
  4. 等待UART接收到数据。代码如下:
    while(!ll_uart_is_active_flag_rfne(SERIAL_PORT_GRP));
  5. 开始DMA传输并等待传输完成。代码如下:
    hal_dma_start(hspi->p_dmatx, (uint32_t)&UART0->RBR_DLL_THR, 
                  (uint32_t)&hspi->p_instance->DATA, TEST_LENGTH);
    __HAL_SPI_ENABLE_DMATX(hspi);
    hal_dma_poll_for_transfer(hspi->p_dmatx, 1000);
    

测试验证

  1. 用GProgrammer下载spim_dma_uart.bin至开发板。
  2. 将开发板串口连接至PC端,打开并配置GRUart。
  3. 在GRUart的Receive Data窗口中将会显示SPI的数据传输结果。
  4. 使用逻辑分析仪观察数据的正确性。

扫描关注

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