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所示:
- 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。
- 在写模式下配置SPI。代码如下:
__HAL_SPI_DISABLE(hspi); ll_spi_set_transfer_direction(hspi->p_instance, LL_SSI_SIMPLEX_TX); __HAL_SPI_ENABLE(hspi); - 设置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); - 等待UART接收到数据。代码如下:
while(!ll_uart_is_active_flag_rfne(SERIAL_PORT_GRP)); - 开始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);
测试验证
- 用GProgrammer下载spim_dma_uart.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示SPI的数据传输结果。
- 使用逻辑分析仪观察数据的正确性。