device->open = rt_serial_open; device->close = rt_serial_close; device->read = rt_serial_read; device->write = rt_serial_write; device->control = rt_serial_control; ... } 这里rt_serial_xxx函数内部再次调用drv_usart.c里的底层驱动函数,最终,我们上层用户使用串口时,总是使用serial.c里提供...
int (*putc)(struct rt_serial_device *serial, char c); // 串口外设读数据寄存器*不为空*,读出读数据寄存器的值。*为空*,返回 -1 int (*getc)(struct rt_serial_device *serial); // 启动发送,多数是开启串口外设发送寄存器空中断 void (*start_tx)(struct rt_serial_device *serial); // 结束发...
需要注意的是,uart = rt_container_of(serial, struct stm32_uart, serial)这个用法是在驱动编程中经常用到的,由于这个函数是在 serial 驱动框架层调用的,所以传进来的形参是 rt_serial_device ,而 rt_serial_device 是 stm32_uart 的一个成员,所以我们可以根据地址的偏移关系的到 stm32_uart 的首地址。 /*...
=RT_NULL);8device = &(serial->parent);//获取serial中parent成员的地址,并将地址赋值给device变量,之后操作device变量就是操作parent9device->type =RT_Device_Class_Char;10device->rx_indicate =RT_NULL;11device->tx_complete
例如,STM32的UART设备模型从struct rt_serial_device派生,并增加了STM32UART的特有数据结构,如STM32串口句柄、串口配置信息、DMA结构信息等。 /* stm32 uart dirver class */ struct stm32_uart { UART_HandleTypeDef handle; struct stm32_uart_config *config; ...
1. serial设备初始化及使用 将配置使能的 uart_obj[ ] 进行设备注册 rtthread_startup --> rt_hw_usart_init() --> rt_hw_serial_register --> rt_device_register 设备注册之后就可使用设备操作方式来使用串口 rt_device_find("uart3") --> rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX) --> ...
rt-thread中 FRDM-MCXA153默认的serial驱动只支持默认uart0, 此实验主要增强串口驱动,增加uart2的支持, 并记录移植过程。 3.2 UART驱动架构 1. IO设备管理层: 向应用层提供统一接口(如rt_device_read、rt_device_write等) 2. 设备框架层(serial_v2.c): ...
应用程序调用 uart_putchar 时,实际调用关系为:rt_device_write ==> rt_serial_write ==> drv_putc,最终数据通过串口数据寄存器发送出去。 串口接收 uart_getchar 函数用于接收数据,uart_getchar 函数的实现采用了串口接收中断回调机制和事件用于异步通信,它具有阻塞特性。相关源码如下: ...
(serial->parent.open_flag & RT_DEVICE_OFLAG_NONBLOCKING) != RT_DEVICE_OFLAG_NONBLOCKING) { do { /* enable interrupt */ rt_hw_interrupt_enable(level); rt_completion_wait(&(serial->completion_rx), RT_WAITING_FOREVER); /* disable interrupt */ ...
在查找串口(rt_device_find)之后,打开串口(rt_device_open)之前添加下面这段代码即可。 /* 修改串口配置参数 */structserial_configureconfig=RT_SERIAL_CONFIG_DEFAULT;// 初始化配置参数config.baud_rate=BAUD_RATE_9600;//修改波特率为 9600config.data_bits=DATA_BITS_8;//数据位 8config.stop_bits=STOP_BI...