HSR04超声波模块是嵌入式项目中常用的测距传感器,在Linux系统中为其编写驱动并正确配置设备树是实现稳定通信的关键。本文将手把手教你完成这一过程,即使你是Linux驱动新手也能轻松跟上。
HSR04是一款低成本、易使用的超声波测距模块,测量范围2cm-400cm,精度可达3mm。它通过TRIG引脚触发测距,ECHO引脚输出与距离成正比的脉冲宽度。在Linux驱动开发中,我们需要通过GPIO操作这两个引脚,并计算时间差来得到距离。
设备树(Device Tree)用于描述硬件信息,让内核在不改动代码的情况下支持不同硬件。对于HSR04,我们需要在设备树中定义使用的GPIO引脚,并指定兼容属性以便驱动能够匹配。
假设我们使用GPIO1_12作为TRIG,GPIO1_13作为ECHO,在设备树文件中添加如下节点:
hsr04@0 { compatible = "mycomp,hsr04"; trig-gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>; echo-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; status = "okay";}; 这里的compatible属性用于驱动匹配,trig-gpios和echo-gpios是自定义属性,驱动会通过of_get_named_gpio()获取。这是典型的设备树配置方法,让驱动与硬件解耦。
下面是一个简单的驱动框架,演示如何从设备树获取GPIO并实现基本的读/写操作:
#include#include #include #include #include struct hsr04_data { struct device *dev; int trig_gpio; int echo_gpio;};static int hsr04_probe(struct platform_device *pdev){ struct hsr04_data *data; struct device_node np = pdev->dev.of_node; data = devm_kzalloc(&pdev->dev, sizeof(data), GFP_KERNEL); if (!data) return -ENOMEM; data->dev = &pdev->dev; data->trig_gpio = of_get_named_gpio(np, "trig-gpios", 0); data->echo_gpio = of_get_named_gpio(np, "echo-gpios", 0); if (!gpio_is_valid(data->trig_gpio) || !gpio_is_valid(data->echo_gpio)) { dev_err(&pdev->dev, "Invalid GPIOs"); return -EINVAL; } gpio_request(data->trig_gpio, "hsr04-trig"); gpio_direction_output(data->trig_gpio, 0); gpio_request(data->echo_gpio, "hsr04-echo"); gpio_direction_input(data->echo_gpio); platform_set_drvdata(pdev, data); dev_info(&pdev->dev, "HSR04 initialized"); return 0;}static int hsr04_remove(struct platform_device *pdev){ struct hsr04_data *data = platform_get_drvdata(pdev); gpio_free(data->trig_gpio); gpio_free(data->echo_gpio); return 0;}static const struct of_device_id hsr04_of_match[] = { { .compatible = "mycomp,hsr04", }, { /* sentinel */ }};MODULE_DEVICE_TABLE(of, hsr04_of_match);static struct platform_driver hsr04_driver = { .driver = { .name = "hsr04", .of_match_table = hsr04_of_match, }, .probe = hsr04_probe, .remove = hsr04_remove,};module_platform_driver(hsr04_driver);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("HSR04 Ultrasonic Sensor Driver");
该驱动在probe中解析设备树,申请GPIO,并设置为输入/输出。完整的驱动还需实现读操作和定时器来测量脉冲宽度,这里仅作演示。
将驱动编译为模块,或编入内核。加载模块后,会在/sys/或/dev/下生成设备节点。编写应用程序通过ioctl或sysfs触发测距并读取结果。注意测量时需要精确计时,可使用高精度定时器或捕获中断。
通过本文,你学习了如何为HSR04超声波模块在Linux下进行设备树配置,并了解了驱动的基本框架。掌握超声波测距在Linux中的实现方法,可以轻松扩展到其他传感器。希望这篇教程对你的Linux驱动开发之路有所帮助!
关键词:HSR04超声波模块、Linux驱动开发、设备树配置、超声波测距
本文由主机测评网于2026-02-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260225497.html