rx_fifo = (struct rt_serial_fifo*) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); /* disable interrupt */ level = rt_hw_interrupt_disable(); len = _serial_fifo_calc_data_len(rx_fifo); if ((len == 0) && // non-blocking io mode (serial->parent.open_flag & RT_DEVICE_...
需要注意的是,uart = rt_container_of(serial, struct stm32_uart, serial)这个用法是在驱动编程中经常用到的,由于这个函数是在 serial 驱动框架层调用的,所以传进来的形参是 rt_serial_device ,而 rt_serial_device 是 stm32_uart 的一个成员,所以我们可以根据地址的偏移关系的到 stm32_uart 的首地址。 /*...
登录后复制#define RT_DEVICE_OFLAG_BLOCKING 0x000 /**< blocking io mode */ #define RT_DEVICE_OFLAG_NONBLOCKING 0x004 /**< non-blocking io mode */ ... #define RT_DEVICE_CTRL_BLOCKING 0x05 /**< blocking io */ serialX.h 添加串口驱动缓存和 DMA 二级缓存大小定义(放弃使用 `RT_SERIAL_RB...
*/rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);/* ...
rt_device_control(serial_1,RT_DEVICE_CTRL_CONFIG,&config); rt_device_control(serial_2,RT_DEVICE_CTRL_CONFIG,&config); /* 打开串口 */ rt_device_open(serial_1,RT_DEVICE_FLAG_RX_NON_BLOCKING|RT_DEVICE_FLAG_TX_BLOCKING); rt_device_open(serial_2,RT_DEVICE_FLAG_RX_NON_BLOCKING|RT_DEVICE...
这个情况我不知道正常使用是否会遇到,所以提了一下 我后面改为DMA+RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING 是DMA非阻塞收发.这样子配置就没出现过上述情况了. serialX 两手一摊,表示“无奈”
1. RX Mode RX Mode 比较简单 我们只是使能了IDLE mode 和DMA的buffer即可 下面是两个函数: void DMA_Init_Rx(u32 Source_addr, u32 Destination_addr) { DMA_InitTypeDef DMA_RX; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); DMA_DeInit(DMA1_Stream1); ...
Serial port Telnet I/O ADC DAC PWM Counters GPIO Inertial Measurement Unit (IMU) Misc Real-time Clock (RTC) Precision Time Protocol (PTP) (ptpd) Hardware timers Configuration INI file JSON Release Notes RT-Kernel 2023.1 New Features Support for new devices RT-Kernel now includes support for ...
重新定义 rt_serial_device 定义: struct rt_serial_device { struct rt_device parent; const struct rt_uart_ops *ops; struct serial_configure config; void *serial_rx; // 串口接收缓存 void *serial_tx; // 串口发送缓存 #ifdef RT_SERIAL_USING_DMA // 串口收发缓存和 DMA 使用的二级缓存分开 rt...
int in_tail; /* RX ring buffer, tail pointer */ size_t in_npend; /* pending bytes in RX ring */ int in_nwait; /* bytes the user waits for */ rtdm_event_t in_event; /* raised to unblock reader */ char in_buf[IN_BUFFER_SIZE]; /* RX ring buffer */ ...