RT-Thread设备驱动开发指南
上QQ阅读APP看书,第一时间看更新

2.3 实现UART设备的操作方法

UART设备驱动框架层为UART设备驱动层提供的操作方法原型如下所示。在开发驱动时,需要为设备定义并实现这些操作方法。

这些操作方法会完成串口的基本操作,例如:configure方法用于配置串口(波特率等);control方法用于控制串口;putc方法用于串口向外发送字符数据;getc方法用于串口获取字符数据;transmit方法用于数据发送,主要是进行多字节数据的发送。下面继续讲解如何实现这些操作方法。

2.3.1 configure:配置UART设备

操作方法configure的作用是根据配置参数对UART设备进行配置,配置参数如波特率、接收缓冲区大小、数据位、停止位、奇偶校验等,UART设备在初始化时会调用此方法,其原型如下所示。

configure方法的参数及返回值如表2-1所示。

表2-1 configure方法的参数及返回值

参数cfg是串口设备的配置参数,结构原型为struct serial_configure,如下所示。configure方法根据这些成员的值进行配置。

成员可取值以及参考的默认取值如下所示,读者可以根据实际用途选择合适的值。

使用STM32串口驱动configure方法的实现示例如下。其内容主要是初始化STM32 UART的句柄,将cfg配置参数赋值给STM32 UART的句柄的成员,然后对串口进行初始化操作。

2.3.2 control:控制UART设备

操作方法control用于控制UART设备行为,会根据传入的参数cmd(控制命令)对串口的行为进行相应的控制,例如配置设备、关闭设备、清除中断等操作,其原型如下所示。

control方法的参数及返回值如表2-2所示,该方法根据控制命令cmd和控制参数arg控制串口设备,如开关中断及DMA的配置。

表2-2 control方法的参数及返回值

在驱动实现时,需要完成的cmd取值情况如下所示。如果注释中标明“驱动中不用实现”,表示在实现驱动代码时不用考虑cmd的取值,因为这些取值无关底层设备,而系统对这些取值的处理也已经在设备驱动框架中实现了。

以下是STM32串口驱动的control方法的代码,该方法实现了6种cmd命令对应的操作。

2.3.3 putc:发送一个字符

操作方法putc用于发送一个字符的数据,其原型如下所示。

putc方法的参数及返回值如表2-3所示。

表2-3 putc方法的参数及返回值

我们看一个具体的putc方法的示例代码,STM32串口驱动中putc方法实现的部分代码如下所示。

在示例代码中,先利用接口rt_container_of获取到STM32的UART设备模型,然后等待上一次数据发送完成后再向硬件寄存器发送一个字符数据。这里需要注意,在UART设备驱动drv_usart_v2.h中,已经定义了向寄存器写入数据的宏UART_SET_TDR,供驱动开发者使用:

2.3.4 getc:接收一个字符

操作方法getc用于从硬件寄存器中接收一个字符数据,其原型如下所示。

getc方法的参数及返回值如表2-4所示。

表2-4 getc方法的参数及返回值

我们看一个具体的getc方法的示例代码,STM32串口驱动中getc方法实现的部分代码如下所示。

在示例代码中,同样先获取STM32的UART设备模型uart,然后利用UART_GET_RDR宏从硬件寄存器中读取一个字符的数据。其中,UART设备驱动drv_usart_v2.h定义了获取寄存器数据的宏UART_GET_RDR,供驱动开发者使用:

2.3.5 transmit:数据发送

操作方法transmit一般用于中断和DMA的数据发送,其原型如下所示。

transmit方法的参数及返回值如表2-5所示。

表2-5 transmit方法的参数及返回值

其中参数tx_flag可取值如下,驱动开发者可以根据以下两种情况完成驱动:

我们来看一个在STM32上实现串口transmit方法的示例代码:

在示例代码中,首先检测是否使用DMA发送数据,然后直接调用了STM32 HAL库提供的DMA传输接口,完成了数据的发送。