TA的每日心情 | 慵懒 2024-7-12 21:42 |
---|
签到天数: 229 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 az158 于 2023-9-16 14:41 编辑
对于一个板子来说,性能强大只是其中的一部分,更重要的一环就是它的生态,也就是资料的多少。
米尔STM32MP135开发板的资料还是比较全面,今天先来试一试它的GPIO控制。
1.文件操作GPIO
首先是导出引脚
GPIO 的测试是通过文件系统 sysfs 接口来实现的,
首先是引脚编号的计算。
根据 #define PIN_NO(port, line) (((port) - 'A') * 0x10 + (line))进行计算
其中 port 为 gpio 端口,line 为该 gpio 对应引脚,((port)-'A')代表 ASCII 码相减。
如 PF14对应的 pin 引脚编号为IN_NO('F',14)=(0x46-0x41)*0x10+14=(70-65)*16+14=94。
执行导出命令,
- echo 94 > /sys/class/gpio/export
复制代码 导出成功后会在/sys/class/gpio/目录下生成 PF14 这个目录。
设置引脚输出
- echo "out" > /sys/class/gpio/PF14/direction
复制代码
可以使用- cat /sys/class/gpio/PF14/direction
复制代码 查看IO方向
通过向/sys/class/gpio/PF14/value写入1或0即可控制IO
2.libgpiod操作GPIO
libgpiod提供了一个C库和工具,用于与linux GPIO字符设备进行交互(gpiod代表GPIO设备)。
列出系统上存在的所有gpiochips
列出指定gpiochip的所有行、其名称、使用者及其设置
读取指定 GPIO行值(如果已请求该行,则无效)。然后将配置为输入。
设置指定 GPIO 行的值,可能保持行导出,并等待超时、用户输入或信号(如果已请求该行,则无效)。
参照上面编写一个控制PA14输出的代码- #include <errno.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <unistd.h>
- #include <linux/gpio.h>
- int main(int argc, char **argv)
- {
- struct gpiohandle_request req;
- struct gpiohandle_data data;
- char chrdev_name[20];
- int fd, ret;
- strcpy(chrdev_name, "/dev/gpiochip0");
- /* Open device: gpiochip0 for GPIO bank A */
- fd = open(chrdev_name, 0);
- if (fd == -1) {
- ret = -errno;
- fprintf(stderr, "Failed to open %s\n", chrdev_name);
- return ret;
- }
- /* request GPIO line: GPIO_A_14 */
- req.lineoffsets[0] = 14;
- req.flags = GPIOHANDLE_REQUEST_OUTPUT;
- memcpy(req.default_values, &data, sizeof(req.default_values));
- strcpy(req.consumer_label, "led_gpio_a_14");
- req.lines = 1;
- ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
- if (ret == -1) {
- ret = -errno;
- fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n",
- ret);
- }
- if (close(fd) == -1)
- perror("Failed to close GPIO character device file");
- /* Start led blinking */
- while(1) {
- data.values[0] = !data.values[0];
- ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
- if (ret == -1) {
- ret = -errno;
- fprintf(stderr, "Failed to issue %s (%d)\n",
- "GPIOHANDLE_SET_LINE_VALUES_IOCTL", ret);
- }
- sleep(1);
- }
- /* release line */
- ret = close(req.fd);
- if (ret == -1) {
- perror("Failed to close GPIO LINEHANDLE device file");
- ret = -errno;
- }
- return ret;
- }
复制代码
PA14引脚高低变化输出。
|
|