我尝试适配h743 的lpuart使用dma。现在tshell使用的是lpuart1。测试发现tshell功能都正常使用,但收发都不进dma中断服务程序。
以下是我的适配操作:
1)rtthread.h生成如下宏:
#define BSP_USING_LPUART
#define BSP_USING_LPUART1
#define BSP_LPUART1_RX_USING_DMA
#define BSP_LPUART1_TX_USING_DMA
2)uart_config.h文件增加lpuart1的配置:
#if defined(BSP_USING_LPUART1)
#ifndef LPUART1_CONFIG
#define LPUART1_CONFIG \
{ \
.name = "lpuart1", \
.Instance = LPUART1, \
.irq_type = LPUART1_IRQn, \
}
#endif /* LPUART1_CONFIG */
#if defined(BSP_LPUART1_RX_USING_DMA)
#ifndef LPUART1_DMA_RX_CONFIG
#define LPUART1_DMA_RX_CONFIG \
{ \
.Instance = LPUART1_RX_DMA_INSTANCE, \
.request = LPUART1_RX_DMA_REQUEST, \
.dma_rcc = LPUART1_RX_DMA_RCC, \
.dma_irq = LPUART1_RX_DMA_IRQ, \
}
#endif /* LPUART1_DMA_CONFIG */
#endif /* BSP_LPUART1_RX_USING_DMA */
#if defined(BSP_LPUART1_TX_USING_DMA)
#ifndef LPUART1_DMA_TX_CONFIG
#define LPUART1_DMA_TX_CONFIG \
{ \
.Instance = LPUART1_TX_DMA_INSTANCE, \
.request = LPUART1_TX_DMA_REQUEST, \
.dma_rcc = LPUART1_TX_DMA_RCC, \
.dma_irq = LPUART1_TX_DMA_IRQ, \
}
#endif /* LPUART1_DMA_CONFIG */
#endif /* BSP_LPUART1_TX_USING_DMA */
#endif /* BSP_USING_LPUART1 */
3)dma_config.h文件增加dma的配置:
/* BDMA_Channel0 */
#if defined(BSP_LPUART1_RX_USING_DMA) && !defined(LPUART1_RX_DMA_INSTANCE)
#define LPUART1_DMA_RX_IRQHandler BDMA_Stream0_IRQHandler
#define LPUART1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN
#define LPUART1_RX_DMA_INSTANCE BDMA_Channel0
#define LPUART1_RX_DMA_REQUEST BDMA_REQUEST_LPUART1_RX
#define LPUART1_RX_DMA_IRQ BDMA_Channel0_IRQn
#endif
/* BDMA_Channel1 */
#if defined(BSP_LPUART1_TX_USING_DMA) && !defined(LPUART1_TX_DMA_INSTANCE)
#define LPUART1_DMA_TX_IRQHandler BDMA_Stream1_IRQHandler
#define LPUART1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN
#define LPUART1_TX_DMA_INSTANCE BDMA_Channel1
#define LPUART1_TX_DMA_REQUEST BDMA_REQUEST_LPUART1_TX
#define LPUART1_TX_DMA_IRQ BDMA_Channel1_IRQn
#endif
4)kservice.c文件的rt_console_set_device()如下修改:
// rt_device_open(new_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_TX );
rt_device_open(new_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_TX | RT_DEVICE_FLAG_DMA_RX);
编译debug的时候,发现程序是不进入drv_usart.c的LPUART1_DMA_RX_IRQHandler()和LPUART1_DMA_TX_IRQHandler()中断的。
这里不打算争论串口有没有必要配DMA,主要目的是学习如何给lpuart配dma,请指教,谢谢。