当前位置: 首页 > article >正文

手把手教你用readl/writel调试树莓派GPIO(基于Linux/io.h)

手把手教你用readl/writel调试树莓派GPIO基于Linux/io.h树莓派作为一款广受欢迎的嵌入式开发平台其GPIO控制一直是开发者关注的焦点。不同于常见的用户空间GPIO库如WiringPi或RPi.GPIO本文将带你深入Linux内核层面通过readl()和writel()函数直接操作GPIO寄存器。这种方法不仅性能更高还能让你真正理解硬件寄存器的工作原理。我们将从树莓派BCM2835芯片手册解读开始逐步演示如何定位GPIO寄存器的物理地址通过/dev/mem实现用户空间内存映射编写安全的内核模块进行寄存器访问使用标准API避免直接内存操作的风险1. 理解树莓派GPIO寄存器架构树莓派以3B为例采用Broadcom BCM2835/6/7系列SoC其GPIO控制器通过内存映射I/O方式暴露给系统。要正确操作GPIO首先需要理解几个关键概念寄存器基地址BCM2835的GPIO控制器物理基地址为0x7E200000对应总线地址0x20200000寄存器偏移量每个功能寄存器都有固定的偏移量例如寄存器名偏移量功能描述GPFSEL00x00GPIO功能选择0-9GPSET00x1CGPIO输出置位0-31GPCLR00x28GPIO输出清零0-31GPLEV00x34GPIO输入电平读取0-31寄存器位域每个32位寄存器通常划分为多个功能区域。例如GPFSEL0寄存器每3位控制一个GPIO引脚的功能#define GPFSEL_INPUT 0b000 #define GPFSEL_OUTPUT 0b001 #define GPFSEL_ALT0 0b100 // 其他ALT功能参考芯片手册提示不同树莓派型号的基地址可能不同BCM2711树莓派4的GPIO基地址为0x7E215000使用时需确认具体型号的芯片手册。2. 用户空间内存映射方法在用户空间访问GPIO寄存器最直接的方式是通过/dev/mem设备文件。以下是完整操作步骤启用/dev/mem访问 默认情况下普通用户无法直接访问/dev/mem需要先修改启动参数sudo nano /boot/cmdline.txt # 添加以下内容如果已有其他参数用空格分隔 dwc_otg.lpm_enable0 consoletty1 root/dev/mmcblk0p2 rootfstypeext4 elevatordeadline fsck.repairyes rootwait memmap256M$0x3F000000保存后重启系统。编写内存映射代码#include stdio.h #include stdlib.h #include fcntl.h #include sys/mman.h #include unistd.h #define BCM2835_GPIO_BASE 0x3F200000 // 树莓派3B的总线地址 #define BLOCK_SIZE (4*1024) int main() { int mem_fd; void *gpio_map; volatile unsigned *gpio; // 打开/dev/mem设备文件 if ((mem_fd open(/dev/mem, O_RDWR|O_SYNC)) 0) { perror(cant open /dev/mem); exit(1); } // 映射GPIO寄存器区域 gpio_map mmap( NULL, // 由内核选择映射地址 BLOCK_SIZE, // 映射区域大小 PROT_READ|PROT_WRITE, // 可读写 MAP_SHARED, // 共享映射 mem_fd, // 文件描述符 BCM2835_GPIO_BASE // GPIO基地址 ); close(mem_fd); if (gpio_map MAP_FAILED) { perror(mmap error); exit(1); } gpio (volatile unsigned *)gpio_map; // 示例设置GPIO17为输出并置高电平 *(gpio GPFSEL1/4) | (1 21); // GPFSEL1的bit21-23控制GPIO17 *(gpio GPSET0/4) (1 17); // 置位GPIO17 munmap(gpio_map, BLOCK_SIZE); return 0; }编译与运行gcc -o gpio_test gpio_test.c sudo ./gpio_test注意直接操作/dev/mem存在风险可能导致系统不稳定。生产环境建议使用内核模块方式。3. 内核模块开发实践更安全的做法是编写内核模块利用Linux提供的标准API访问寄存器创建基础模块框架#include linux/init.h #include linux/module.h #include linux/io.h #define GPIO_BASE 0x3F200000 static void __iomem *gpio_base; static int __init gpio_demo_init(void) { gpio_base ioremap(GPIO_BASE, SZ_4K); if (!gpio_base) { printk(KERN_ERR Failed to ioremap GPIO\n); return -ENOMEM; } // 使用readl/writel操作寄存器 u32 reg_val readl(gpio_base GPFSEL1); writel(reg_val | (1 21), gpio_base GPFSEL1); printk(KERN_INFO GPIO module loaded\n); return 0; } static void __exit gpio_demo_exit(void) { if (gpio_base) { iounmap(gpio_base); } printk(KERN_INFO GPIO module unloaded\n); } module_init(gpio_demo_init); module_exit(gpio_demo_exit); MODULE_LICENSE(GPL);添加Makefileobj-m : gpio_demo.o KERNELDIR ? /lib/modules/$(shell uname -r)/build PWD : $(shell pwd) all: $(MAKE) -C $(KERNELDIR) M$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M$(PWD) clean编译加载模块make sudo insmod gpio_demo.ko dmesg | tail # 查看内核日志4. 高级技巧与安全实践在实际开发中有几个关键点需要注意内存屏障使用 寄存器操作可能需要内存屏障确保执行顺序writel(0x01, gpio_base GPSET0); mb(); // 内存屏障确保写入完成寄存器位操作最佳实践 避免直接覆盖寄存器值应采用读-修改-写模式u32 reg readl(gpio_base GPFSEL1); reg ~(0x7 21); // 清除GPIO17的配置位 reg | (0x1 21); // 设置为输出模式 writel(reg, gpio_base GPFSEL1);错误处理模板void __iomem *reg; reg ioremap(phys_addr, size); if (!reg) { dev_err(dev, ioremap failed for 0x%08x\n, phys_addr); return -ENOMEM; } // 使用reg... iounmap(reg);性能优化 频繁的寄存器访问可以考虑使用_relaxed变体在确保顺序不重要时writel_relaxed(0x55, reg_base CTRL_REG);在调试过程中可以通过devmem2工具快速查看寄存器值sudo apt install devmem2 devmem2 0x3F200034 # 读取GPLEV0寄存器5. 实战实现GPIO中断处理除了基本的输入输出GPIO中断是另一个常见需求。以下是实现步骤配置GPIO中断#include linux/interrupt.h static irqreturn_t gpio_irq_handler(int irq, void *dev_id) { u32 gplev0 readl(gpio_base GPLEV0); printk(KERN_INFO GPIO level: 0x%08x\n, gplev0); return IRQ_HANDLED; } static int setup_gpio_irq(void) { int irq_num; int ret; // 设置GPIO17为输入 writel(readl(gpio_base GPFSEL1) ~(0x7 21), gpio_base GPFSEL1); // 配置上升沿触发 writel(1 17, gpio_base GPREN0); // 获取GPIO中断号 irq_num gpio_to_irq(17); ret request_irq(irq_num, gpio_irq_handler, IRQF_TRIGGER_RISING, gpio17, NULL); if (ret) { printk(KERN_ERR Failed to request IRQ\n); return ret; } return 0; }在模块初始化中调用static int __init gpio_demo_init(void) { // ...之前的初始化代码... if (setup_gpio_irq()) { iounmap(gpio_base); return -EIO; } return 0; }释放中断资源static void __exit gpio_demo_exit(void) { free_irq(gpio_to_irq(17), NULL); // ...其他清理代码... }通过以上代码当GPIO17引脚检测到上升沿时系统会调用gpio_irq_handler处理函数。在实际项目中你可以在中断处理函数中实现更复杂的逻辑如触发工作队列或通知用户空间。

相关文章:

手把手教你用readl/writel调试树莓派GPIO(基于Linux/io.h)

手把手教你用readl/writel调试树莓派GPIO(基于Linux/io.h) 树莓派作为一款广受欢迎的嵌入式开发平台,其GPIO控制一直是开发者关注的焦点。不同于常见的用户空间GPIO库(如WiringPi或RPi.GPIO),本文将带你深入…...

LLVMSwift:用Swift原生封装LLVM,实现类型安全的编译器开发

1. 项目概述与核心价值如果你是一个 Swift 开发者,同时对编译原理、程序分析或者高性能计算感兴趣,那么你很可能听说过 LLVM。这个强大的编译器基础设施几乎无处不在,从 Clang 到 Swift 编译器本身,再到各种 JIT 引擎,…...

vulhub系列-33-hacksudo - Thor(超详细)

免责声明:本文记录的是 hacksudo - Thor 渗透测试靶机 的解题过程,所有操作均在 本地授权环境 中进行。内容仅供 网络安全学习与防护研究 使用,请勿用于任何非法用途。读者应遵守《网络安全法》及相关法律法规,自觉维护网络空间安…...

JPEGsnoop深度解析:当你的JPEG图像需要“法医级“诊断时

JPEGsnoop深度解析:当你的JPEG图像需要"法医级"诊断时 【免费下载链接】JPEGsnoop JPEGsnoop: JPEG decoder and detailed analysis 项目地址: https://gitcode.com/gh_mirrors/jp/JPEGsnoop 在数字图像处理的日常工作中,你是否曾遇到过…...

小白技能库:技术新人的场景化学习指南与开源项目实践

1. 项目概述:小白技能库的诞生与价值最近在GitHub上看到一个挺有意思的项目,叫“aptratcn/xiaobai-skills”。光看名字,你大概就能猜到它的定位——“小白技能库”。作为一个在技术社区混迹了十多年的老鸟,我第一眼看到这个项目时…...

Cursor AI 代理 9 秒删除生产数据库:Railway 无作用域令牌与“假备份”如何让灾难成为必然

昨天,一家服务全国租车公司的 SaaS 创业公司 PocketOS 生产环境瞬间归零。 不是黑客入侵,不是配置失误,而是一个运行在 Cursor 里的 Claude Opus 4.6 代理,在处理 staging 环境的凭证问题时,自主决定调用 Railway Grap…...

Git代码分支管理模型TBD++ Flow

现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等。相比CVS和SVN的集中管理,Git具有非常明显的优势,例如:去中心化的代码管理方式减少了开发者对中心服务…...

潮玩盲盒小程序开发全解析:技术架构、合规风控与运营变现

引言盲盒经济凭借 “未知性 收藏欲” 持续爆发,2024 年国内市场规模突破 500 亿元,微信小程序以低获客成本、高便捷性成为核心阵地。本文从技术选型、核心功能、合规风控到运营变现,全链路拆解盲盒小程序开发逻辑,为开发者提供可…...

基于Transformer的中文文本分类

前言 我在github上发现了一个有意思的项目Chinese-Text-Classification-Pytorch,使用pytorch复现了基于Transformer的中文文本分类。 中文数据集 我从THUCNews中抽取了20万条新闻标题,文本长度在20到30之间。一共10个类别,每类2万条。 以…...

整个 AI 项目从本地 → 部署到服务器

一、整体流程(最清晰版)本地打包镜像 → 上传到服务器 → 服务器加载镜像 → 挂载模型目录 → 启动容器 → 运行成功二、完整部署步骤(照着执行即可)1.本地:把你的 AI 项目打包成 Docker 镜像(cmd->项目根目录下执行…...

第十七届蓝桥杯省赛c++b组题解

蓝桥杯省赛自测&#xff08;CB 组&#xff09; - 洛谷 洛谷自测链接(由于数据原因 真实成绩可能与官方成绩有所出入) 1.青春常数 非常简单的入门题目 一共四年&#xff0c;前两年总和要小于后两年 即xy2026202520242023且x<y算出x的最大值即可(注意&#xff01;x可以为0 所…...

vue2+element-UI上传图片封装

针对上传组件进行封装&#xff0c;在页面直接引用即可&#xff0c;上传到minio文件服务器&#xff1a; 可以预览&#xff0c;重新上传&#xff0c;只读模式&#xff0c;可以传入展示缩略图尺寸&#xff0c;传入上传校验尺寸 <template><div><div v-if"read…...

如何用GHelper轻松掌控华硕笔记本性能:5分钟快速配置终极指南

如何用GHelper轻松掌控华硕笔记本性能&#xff1a;5分钟快速配置终极指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, St…...

盟接之桥®制造业EDI软件:从Forecast到Invoice,打通供应链的“任督二脉”

在全球制造业数字化转型的浪潮中&#xff0c;供应链的协同效率直接决定了企业的竞争力。对于汽车零部件、机械制造、电子电器等行业的制造企业而言&#xff0c;电子数据交换&#xff08;EDI&#xff09;已不再是“锦上添花”的选项&#xff0c;而是进入全球顶级供应链体系的“入…...

YOLO26管道泄漏识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+远程环境部署)

摘要 管道泄漏是石油、化工、城市供水及燃气输送系统中的主要安全隐患&#xff0c;传统人工巡检与基于压力、流量等参数的监测方法存在响应慢、定位难、误报率高等问题。本文基于YOLO26系列目标检测算法&#xff0c;构建了一套端到端的管道泄漏视觉识别检测系统。系统以管道场…...

哔哩下载姬:专业B站视频下载工具,支持8K与批量下载

哔哩下载姬&#xff1a;专业B站视频下载工具&#xff0c;支持8K与批量下载 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印…...

烟台群策电子-FMC_M6678评估板

功能说明本子卡是一款面向国产M6678处理器的FMC转接卡。其提供标准的FMC HPC接口&#xff0c;可实现便捷的模块互联&#xff0c;既可作为国产M6678应用生态的评估平台&#xff0c;又能作为算力扩展节点&#xff0c;有效增强系统的整体处理能力。主要组成子卡实现了M6678的最小系…...

为什么现在的人越来越难快乐?曾仕强:因为你只懂“刺激”,不懂“豫卦”

在这个娱乐至死的年代&#xff0c;我们似乎拥有了前所未有的快乐资源&#xff1a;短视频、游戏、直播带货……但奇怪的是&#xff0c;我们却越来越难感到快乐了。台湾师范大学曾仕强教授在讲解《易经》豫卦时&#xff0c;一针见血地指出&#xff1a;现代人过度追求感官刺激&…...

从初出茅庐到功成身退:一个人最高级的活法,是修好这6个阶段

在这个张扬个性的时代&#xff0c;我们常被教导要“敢于表现”、“秀出自己”。但台湾师范大学曾仕强教授在解读《易经》谦卦时&#xff0c;却提出了一个发人深省的观点&#xff1a;有能力的人&#xff0c;往往混不好&#xff1b;真正厉害的人&#xff0c;都有“本事”。为什么…...

# Linux Shell 编程入门 Day01:Shell 基础认知、脚本编写规范、变量四大类型、数值运算

一、实验环境准备 本次实验基于模板机创建 1 台虚拟机&#xff0c;完成 IP 配置后&#xff0c;使用 WindTerm 远程连接主机&#xff0c;为后续脚本编写与执行做好环境准备。 二、Shell 环境及核心特性 Linux 层级关系梳理: 程序/用户输入的命令&#xff08;ls/cd/pwd&#xff…...

2026“网安湘军杯”报名指南:双赛道实战,直通优质offer

真实漏洞挖掘&#xff5c;5小时线下靶场&#xff5c;精英赛新秀赛&#xff5c;省级权威证书&#xff5c;企业重点关注 你是不是也遇到过这种情况&#xff1a; 刷着招聘软件&#xff0c;看到“网络安全工程师”动辄 15K 的起薪&#xff0c;心里很动心。但一看职位要求——“实战…...

2026AI 写论文软件:亲测

作为一名刚完成硕博连读的学术人&#xff0c;过去一年我把AI 论文工具都试了一遍。从本科毕业论文到核心期刊&#xff0c;踩过的坑能绕图书馆三圈——AI 生成内容查重率暴红、参考文献幻觉、学术语言生硬、逻辑链断裂... 这些痛谁懂&#xff1f; 一、掌桥科研 AI 论文&#xff…...

芯片功耗分析入门:如何用Pre-Gate Sim的FSDB波形生成精准的SAIF文件

芯片功耗分析入门&#xff1a;从Pre-Gate Sim到精准SAIF文件生成全流程解析 在数字IC设计流程中&#xff0c;功耗分析已成为与性能、面积同等重要的设计指标。随着工艺节点不断微缩&#xff0c;芯片的静态功耗与动态功耗特性变得愈发复杂&#xff0c;而基于门级仿真的功耗分析…...

GPT5.5数据分析与商业智能实战从入门到提效2026最新

想稳定体验GPT-5.5的数据分析能力&#xff0c;推荐直接用库拉&#xff0c;这是一个AI聚合平台&#xff0c;已上线GPT-5.5&#xff0c;国内直连&#xff0c;注册即用。GPT-5.5来了&#xff0c;数据分析的工作方式正在被重写4月24日&#xff0c;OpenAI正式发布GPT-5.5。官方称这是…...

Copilot Next 工作流配置安全基线(2024 Q3最新):覆盖GDPR/CCPA/等保2.0三级要求,附可审计Terraform模块+自动检测脚本

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Copilot Next 工作流配置安全基线概览 Copilot Next 作为新一代 AI 编程协作者&#xff0c;其工作流配置直接影响代码生成的合规性、数据隔离强度与权限控制粒度。安全基线并非单一策略&#xff0c;而是…...

用 React Native + Expo 开发一个大学生日程排程 App

前面我们已经介绍了如何用 AI 生成一份“AI 赋能大学生全流程计划”。但计划生成只是第一步&#xff0c;真正困难的是&#xff1a;这些任务到底怎么落到每天&#xff1f;怎么避开课表&#xff1f;怎么提醒自己&#xff1f;怎么和手机日历打通&#xff1f;所以我做了一个配套 Ap…...

【Web前端】CSS(一)——基础语法与选择器

文章目录1.什么是CSS2.CSS基本语法规范3.CSS引入方式3.1 内部样式表3.2 行内样式表3.3 外部样式4.选择器的种类4.1 常见的选择器4.2 基础选择器4.2.1 标签选择器4.2.2 类选择器4.2.3 id选择器4.2.4通配符选择器4.2.5 基础选择器小结4.3 复合选择器4.3.1 后代选择器4.3.2 子选择…...

ARM GICv3中断控制器与ICC_EOIR1_EL1寄存器详解

1. ARM GICv3中断控制器架构概述在现代ARM处理器架构中&#xff0c;通用中断控制器(GIC)扮演着系统中断管理的核心角色。作为ARMv8/v9架构的标准组件&#xff0c;GICv3相比前代架构带来了显著的改进&#xff1a;支持更多CPU接口&#xff08;最多256个&#xff09;引入中断分组机…...

CUDA应用检查点技术:透明化GPU状态保存与恢复

1. CUDA应用检查点技术解析在HPC和科学计算领域&#xff0c;GPU加速应用通常需要长时间运行&#xff0c;如何实现这类应用的状态保存与恢复一直是技术难点。传统解决方案要么需要应用层显式实现状态保存逻辑&#xff08;开发成本高&#xff09;&#xff0c;要么依赖虚拟机级别的…...

ncmdump终极指南:3分钟掌握NCM格式解密,解锁网易云音乐播放自由

ncmdump终极指南&#xff1a;3分钟掌握NCM格式解密&#xff0c;解锁网易云音乐播放自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经遇到过这样的困扰&#xff1a;从网易云音乐精心下载的歌曲&#xff0c;却只能在特定…...