700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > STM32MP157驱动开发——Linux RS232/485/GPS 驱动

STM32MP157驱动开发——Linux RS232/485/GPS 驱动

时间:2024-05-02 19:12:02

相关推荐

STM32MP157驱动开发——Linux RS232/485/GPS 驱动

STM32MP157驱动开发——Linux RS232/485/GPS 驱动

一、简介二、STM32MP1 UART 驱动分析1.UART 的 platform 驱动框架2.uart_driver相关流程三、驱动开发1.RS232驱动编写1)添加 usart3 和 uart5 的引脚信息2)移植minicom四、驱动测试1.RS232收发测试2.RS485测试3.GPS测试

参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux RS232/485/GPS驱动

一、简介

除了 platform、I2C、SPI 之外,还可以通过串口 uart 与其他设备或传感器进行通信。根据电平的不同,串口分为 TTL 和 RS232,但是不管是什么样的接口电平,其驱动程序都是一样的,通过外接 RS485 这样的芯片就可以将串口转换为 RS485 信号。

正点原子的 STM32MP1 开发板有 8 个串口,四个同步串口(USART1、USART2、USART3 和 USART6),四个异步串口(UART4、UART5、UART7 和 UART8)。RS232 和 RS485 接口连接到了 STM32MP1 的 USART3 接口上,通过跳线帽选择相应的功能。GPS 模块连接到 UART5 接口上,因此这些外设最终都归结为 USART3 和 UART5 的串口驱动。

同 I2C、SPI 一样,Linux 也提供了串口驱动框架,只需要按照相应的串口框架编写驱动程序即可。串口驱动没有主机端和设备端之分,就只有一个串口驱动,而且这个驱动也已经由 ST 官方编写好,开发人员要做的就是在设备树中添加所要使用的串口节点信息。当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动起来,生成 /dev/ttySTMX(X=0….n)文件。

二、STM32MP1 UART 驱动分析

1.UART 的 platform 驱动框架

在设备树 stm32mp151.dtsi 文件中,有 USART3 对应的子节点:

根据compatible属性值可以找到驱动文件为drivers/tty/serial/stm32-usart.c。查看相应文件可以发现 UART 本质上是一个 platform 驱动。

2.uart_driver相关流程

初始化:

1550 static struct uart_driver stm32_usart_driver = {1551 .driver_name = DRIVER_NAME,1552 .dev_name = STM32_SERIAL_NAME,1553 .major = 0,1554 .minor = 0,1555 .nr = STM32_MAX_PORTS,1556 .cons = STM32_SERIAL_CONSOLE,1557 };

probe函数:

1306 static int stm32_usart_serial_probe(struct platform_device *pdev)1307 {1308 const struct of_device_id *match;1309 struct stm32_port *stm32port;1310 int ret;13111312 stm32port = stm32_usart_of_get_port(pdev);1313 if (!stm32port)1314 return -ENODEV;13151316 match = of_match_device(stm32_match, &pdev->dev);1317 if (match && match->data)1318 stm32port->info = (struct stm32_usart_info *)match->data;1319 else1320 return -EINVAL;13211322 ret = stm32_usart_init_port(stm32port, pdev);1323 if (ret)1324 return ret;......1374 ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);1375 if (ret)1376 goto err_port;13771378 pm_runtime_put_sync(&pdev->dev);13791380 return 0;.....1410 }

三、驱动开发

本节要用到 STM32MP1 的 USART3 接口和 UART5 接口,USART3 连接 RS485 和RS232 的公头,UART5 连接 GPS 和 RS232 的母头。

RS232原理图:

RS232 串口一共有 2 个,COM1 是母头,COM2为公头,这两个 RS232 串口都是通过 SP3232 芯片来实现。

COM1 母头连接到 STM32MP1 的 UART5 接口上,和正点原子的 ATK 模块共用 USART5,把 JP5 的 1-3 和 2-4 连接起来以后 SP3232 就和 URAT5 连接到一起。UART5_TX 和 UART5_RX 分别接到了 PB13 和 PB12 这两个引脚上。

COM2 公头连接到 STM32MP1 的 USART3 接口上,COM2 和 RS485 共用 USART3,把JP4的3-5和4-6连接起来以后SP3232就和USRAT3连接到一起。USART3_TX和USART3_RX分别接到了 PD8 和 PD9 这两个引脚上。

RS485原理图:

与 COM2 共用 USART3,把 JP4 的 3-5 和 4-6 连接起来,RS485 就连接到了 USART3 上。

RS485 采用 SP3485 芯片实现,RO 为数据输出端,RI 为数据输入端,RE 是接收使能信号(低电平有效),DE 是发送使能信号(高电平有效)。图中 RE 和 DE 经过一系列的电路,最终通过 RS485_RX 来控制,这样可以省掉一个 RS485 收发控制 IO,将 RS485完全当作一个串口来使用,方便写驱动。

GPS原理图:

正点原子有一款 GPS+北斗定位模块,型号为 ATK1218-BD,只在开发板上留出了接口。COM1 和正点原子的 ATK 模块共用 USART5 接口,USART5 驱动成功以后就可以直接读取 GPS 模块数据了。ATK 模块还有两个引脚 GBC_KEY 和 GBC_LED 分别连接到了 STM32MP157 的 PC13 和 PI8 上,这两个引脚是给其他模块准备的,GPS 模块没有用到。

1.RS232驱动编写

1)添加 usart3 和 uart5 的引脚信息

STM32MP1 的 UART 驱动 ST 已经编写好了,所以不需要自己编写。只用在设备树中添加 USART3 和 UART5 对应的设备节点即可。并且因为 usart3 和 uasrt5 的节点在 stm32mp151.dtsi 已经存在,所以只用在自己的设备树中追加内容即可。

修改 stm32mp15-pinctrl.dtsi,追加一个 usart3 引脚设置:

追加 uart5 引脚设置:

在设备树 stm32mp157d-atk.dtsi 中追加串口设备节点:

&usart3 {pinctrl-names = "default";pinctrl-0 = <&usart3_pins_c>;status = "okay";};&uart5 {pinctrl-names = "default";pinctrl-0 = <&uart5_pins_a>;status = "okay";};

设置串口的别名:

aliases {serial0 = &uart4;serial1 = &uart5;serial2 = &usart3;};

在根节点/下原先存在 aliases 子节点,在其中追加 uart5 和 usart3 的别名,用于 UART 子系统的匹配。

修改完成后编译出新的设备树文件,用于开发板启动。

2)移植minicom

minicom 类似常用的串口调试助手,是 Linux 下很常用的一个串口工具,将 minicom 移植到开发板中,这样就可以借助 minicom 对串口进行读写操作。

buildroot 已经集成了 minicom,所以只需要重新配置 buildroot,使能 minicom 即可。在buildroot的menuconfig中,选中以下编译项:

修改完成后保存,然后使用sudo make进行编译,将编译出的rootfs.tar文件解压到nfs即可用于开发板启动。启动后使用minicom -v命令查看是否正常工作,使用minicom -s命令进行配置。

四、驱动测试

RS232连接:

左边的 COM2 为公头,可以通过 JP4 跳接到 USART3上。右边的 COM1 为母头,可以通过 JP5 跳接到 UART5 上。本节使用右边的 COM1,所以将 JP5 的两个跳线帽接到上方,也就是将 UART5 与 COM1 连接起来。

使用RS232转TTL线连接到电脑,就可以进行收发测试。在开发板上使用minicom -s命令配置UART5。

按下Ctrl + A,再按下 Z,就会出现以下界面:

1.RS232收发测试

发送测试:需要打开 minicom 的回显功能(不打开也可以,但是在 minicom 中看不到自己输入的内容),回显功能打开以后输入“AAAA”,在电脑的串口助手就会收到消息。

接收测试:在电脑上的串口助手发送消息,在开发板上就能接收到。

使用 Ctrl + A然后按下 X 键关闭minicom。

2.RS485测试

将JP4 跳线帽的 1-3、2-4 连接起来,此外还需要一个RS485转接器,与电脑进行连接。

收发测试与RS232相同。

3.GPS测试

GPS模块大部分都是通过串口通信的,使用开发板上的 JP5 跳线帽,将 UART5 与 ATK 模块接口上的串口连接起来。

然后设置minicom,波特率设置为 38400,8 位数据位, 1 位停止位。

之后就可以接收到GPS发送的数据。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。