使用GPIO子系统操控6盏LED灯的亮灭
1、编写设备树节点:
添加如下所示代码到stm32mp157a-fdmp1a.dts中根节点里面,给LED灯定义名字,并引用GPIO寄存器及相对应的引脚信息;
myleds{
myled1 = <&gpioe 10 0>;
myled2 = <&gpiof 10 0>;
myled3 = <&gpioe 8 0>;
myled4 = <&gpioz 5 0>;
myled5 = <&gpioz 6 0>;
myled6 = <&gpioz 7 0>;
};
2、实现字符设备驱动并创建与LED灯相应的6个设备节点(具体详情见驱动——串口点灯实验内容)
3、获取设备树节点信息(获取方式不唯一,本次采用通过节点名字获取)
struct device_node *of_find_node_by_path(const char *path)
功能:获取设备树节点信息通过路径
参数: path:节点路径
返回值:成功返回目标节点的信息结构体地址,失败返回NULL
struct device_node *of_find_node_by_name(struct device_node *from, const char *name)
功能:通过节点名字获取节点信息
参数:from:已知设备树节点的首地址 (填NULL,默认从根节点解析)
name:设备树节点的名字 "myleds"
返回值:成功返回目标节点的信息结构体地址,失败返回NULL
4、根据GPIO子系统函数API对LED灯进行操作(子系统函数有新旧两个版本,本次采用新版本)
①在在设备树节点信息结构体中获取并申请要使用的gpio编号
旧版本:
int of_get_named_gpio(struct device_node *np, const char *propname, int index)
功能:根据gpio节点解析获取GPIO编号
参数:
np:节点结构体首地址
proname:键名
index:索引号
返回值:成功返回GPIO编号,失败返回错误码
int gpio_request(unsigned gpio, const char *label)
作用:申请指定GPIO编号的使用权
参数:
gpio:目标GPIO编号
label:一般填写NULL
成功返回0,失败返回错误码
新版本:
struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, const char *propname, int index, enum gpiod_flags dflags, const char *label)
功能:在设备树节点信息结构体中获取并申请要使用的gpio编号
参数:
node:设备树节点信息结构体指针
propname:键名
index:索引
dflags:gpio状态值
GPIOD_OUT_LOW
GPIOD_OUT_HIGH
label:标签,填写NULL
返回值:成功返回gpio描述结构体指针,失败返回错误码指针
②设置管脚为输出模式
int gpio_direction_output(unsigned gpio, int value)
作用:设置GPIO为输出
参数:
gpio:GPIO编号 value:1:高电平 0:低电平
返回值:成功返回0,失败返回错误码
int gpio_direction_input(unsigned gpio)
作用:设置GPIO为输入
参数:gpio:GPIO编号
返回值:成功返回0,失败返回错误码
新版本:
int gpiod_direction_input(struct gpio_desc *desc) -----》输入模式
int gpiod_direction_output(struct gpio_desc *desc, int value)------》输出模式
③通过ioctl函数传参获取信息,根据应用层逻辑让LED灯输出高低电平,达到操控灯亮灭的过程
旧版本:
int gpio_get_value(unsigned int gpio)
功能:获取GPIO电平状态
参数:GPIO编号
返回值: 1:高电平 0:低电平
void gpio_set_value(unsigned int gpio, int value)
作用:让GPIO输出高低电平
参数: gpio:GPIO编号
value:1:高电平 0:低电平
返回值:无
新版本
int gpiod_get_value(const struc

该博客详细介绍了如何使用STM32的GPIO子系统来控制6个LED灯的亮灭。首先在设备树中定义LED灯,然后实现字符设备驱动创建设备节点。接着,通过设备树节点信息获取GPIO编号并申请使用权,设置GPIO方向为输出。最后,通过ioctl调用控制GPIO电平,实现LED灯的开关操作。实验代码包括驱动程序、头文件和应用层测试代码,实现了LED灯的周期性闪烁效果。
最低0.47元/天 解锁文章
1973

被折叠的 条评论
为什么被折叠?



