前面介绍了如何通过简单的配置,对Linux设备树进行修改,实现在用户空间通过sysfs来控制LED灯亮灭,大家对STM32MP135F-DK的引脚控制应该有了简单的认识,接下来就详细介绍下Linux中控制GPIO的方法。
实际Linux上控制GPIO的方式是非常多样化的,可以满足不同类型用户的需求,今天带大家一起基于STM32MP135F-DK套件的Linux系统来玩转GPIO,还是以LED为例,主要通过另外两个方面来进行测试验证:
一是在系统内核空间,通过修改内核驱动来控制LED;
二是在用户空间,用C代码通过mmap直接对LED进行控制
概念介绍
每个ST微控制器管脚都经过多路复用,以支持多种功能。可以配置为以下在三种模式:
- 通用输入/输出GPIO:由软件控制
- 模拟GPIO:由硬件模块直接控制
- Alternate功能:由硬件模块直接控制
可以使用两种框架来配置和控制给定的引脚:pinctrl 和 GPIOLib。
- Pinctrl 主要用于引脚由内部外设控制的情况。Pinctrl 处理引脚配置,并允许将特定功能分配给引脚。
- GPIOLib 用于需要在运行时动态控制引脚的情况。GPIOLib 用于通过软件控制引脚。
此外,当引脚用作外部中断源时,Irqchip框架提供了一个允许配置此中断的 API。
引脚管理框架
通过内核驱动控制LED
目标:使用ST的gpiolib框架,在内核层实现对LED的控制
步骤:
修改设备树,添加对应的GPIO设备文件描述,并重新编译设备树文件
- make ARCH=arm dtbs LOADADDR=0xC2000040
编写内核模块代码,Makefile文件,并编译
更新设备树和设备模块到开发板
更新内核模块依赖,同步内存后重启
加载内核模块验证
效果:led快速闪烁
退出
在用户空间编写C代码通过mmap方法直接控制LED
在用户空间中控制LED,前面介绍了sysfs操作的方法,这里介绍另一种方式:mmap。mmap可以将物理设备/dev/mem映射到内存,通过读写内存的方式操作GPIO寄存器,由于避免了系统调用,不需要用户空间和内核空间频繁切换,可以提高使用效率。
还是以上面的红色LED:GPIO-PA13为例
可以看到GPIOA的内存起始地址是0x50002000 ~ 0x500023FF
接着找到相关寄存器,进行配置,以下是寄存器地址
配置相关寄存器
1)MODER寄存器用来配置GPIO的模式,这里我们需要配置为输出0x01
从图中可以看出PA13对应的MODER13是对应寄存器的bit27和bit26,可以编写配置代码如下
2)OTYPER寄存器,配置为推挽输出状态,0x00
3)BSRR寄存器可以改变管脚状态高电平还是低电平,这是一个只写寄存器,对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作,我们可以用来控制电平的翻转,实现LED的闪烁效果
效果展示:
本文来自论坛,点击查看完整帖子内容。