因为主内存设置在了dtcm,不能被dma访问,然而serial v2框架开启dma,缓存使用的是动态分配的内存,要如何修改buffer位置呢
應該只能修改代碼與linkscript 去配置可以用DMA的記憶體區塊
參考 https://blog.csdn.net/whj123999/article/details/104402070
参考实现
__attribute__((section(".ram_d2"))) uint8_t gps_rx_fifo[sizeof(struct rt_serial_rx_fifo) + BSP_UART3_RX_BUFSIZE];
auto dev = rt_device_find("uart3");
if (!dev) {
log_w("uart3 not found");
return;
}
auto serial_dev = reinterpret_cast<rt_serial_device *>(dev);
rt_device_open(dev, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
// replace fifo path as that cannot be dma
dev->open_flag &= ~RT_SERIAL_RX_NON_BLOCKING;
serial_dev->ops->control(serial_dev,
RT_DEVICE_CTRL_CLR_INT,
(void *) RT_SERIAL_RX_NON_BLOCKING);
struct stm32_uart *uart = rt_container_of(serial_dev, struct stm32_uart, serial);
HAL_UART_DMAStop(&(uart->handle));
auto rx_fifo = (struct rt_serial_rx_fifo *) serial_dev->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_free(rx_fifo);
rx_fifo = (struct rt_serial_rx_fifo *) gps_rx_fifo;
rt_ringbuffer_init(&(rx_fifo->rb), rx_fifo->buffer, serial_dev->config.rx_bufsz);
serial_dev->serial_rx = rx_fifo;
dev->open_flag |= RT_SERIAL_RX_NON_BLOCKING;
serial_dev->ops->control(serial_dev,
RT_DEVICE_CTRL_CONFIG,
(void *) RT_SERIAL_RX_NON_BLOCKING);