注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
fangkaixin的个人空间 https://home.eeworld.com.cn/space-uid-695502.html [收藏] [复制] [分享] [RSS]
日志

【STM32MP135F-DK】硬件资源测试:玩转GPIO

已有 582 次阅读2024-1-1 15:34 |个人分类:STM32MP1

前面介绍了如何通过简单的配置,对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文件,并编译

  • make
  • make install

更新设备树和设备模块到开发板

更新内核模块依赖,同步内存后重启

加载内核模块验证

  • modprobe red_led

效果:led快速闪烁

退出

  • rmmod red_led

在用户空间编写C代码通过mmap方法直接控制LED

在用户空间中控制LED,前面介绍了sysfs操作的方法,这里介绍另一种方式:mmap。mmap可以将物理设备/dev/mem映射到内存,通过读写内存的方式操作GPIO寄存器,由于避免了系统调用,不需要用户空间和内核空间频繁切换,可以提高使用效率。
还是以上面的红色LED:GPIO-PA13为例
我们先查找一下手册中该GPIO的内存地址:参考手册下载地址STM32MP13xx advanced Arm<Sup>®</Sup>-based 32-bit MPUs - Reference manual
可以看到GPIOA的内存起始地址是0x50002000 ~ 0x500023FF
接着找到相关寄存器,进行配置,以下是寄存器地址
配置相关寄存器
1)MODER寄存器用来配置GPIO的模式,这里我们需要配置为输出0x01
从图中可以看出PA13对应的MODER13是对应寄存器的bit27和bit26,可以编写配置代码如下
2)OTYPER寄存器,配置为推挽输出状态,0x00
3)BSRR寄存器可以改变管脚状态高电平还是低电平,这是一个只写寄存器,对寄存器高 16bit 1 对应管脚为电平,对寄存器低16bit1对应管脚为电平。写 0 ,无动作,我们可以用来控制电平的翻转,实现LED的闪烁效果
效果展示:
 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章