嵌入式硬件篇---龙芯GPIO控制

embedded/2025/3/19 4:35:12/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • 前言
  • 1. 头文件引入
    • 作用
  • 2. 导出GPIO引脚 export_gpio
    • 功能
    • 示例
    • 注意
  • 3. 设置GPIO方向 set_gpio_direction
    • 功能
    • 示例
  • 4. 设置GPIO值 set_gpio_value
    • 功能
    • 示例
  • 5. 初始化函数 gpio_init
    • 功能
  • 6.class="tags" href="/LongXin.html" title=龙芯>龙芯2K1000适配说明
    • 6.1 GPIO编号映射
    • 6.2 性能优化建议
      • 优点
      • 错误处理
    • 6.3 权限问题
      • 解决方案
    • 6.4内存映射(高级优化)
    • 6.5示例扩展:按键与LED控制
  • 7.总结
    • 适用场景
    • 优势
    • 局限性
    • 改进方向


前言

本文简单介绍了class="tags" href="/LongXin.html" title=龙芯>龙芯class="tags" href="/2K1000.html" title=2k1000>2k1000中的GPIO控制。


1. 头文件引入

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>    class="token comment">// 标准输入输出函数(如snprintf)
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdlib.h>   class="token comment">// 系统调用函数(如system)
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><time.h>     class="token comment">// 时间相关函数
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><unistd.h>   class="token comment">// POSIX操作系统API(如文件操作)
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><fcntl.h>    class="token comment">// 文件控制选项(如open的flags)
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><sys/mman.h> class="token comment">// 内存映射相关函数
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"GPIO.h"     class="token comment">// 自定义GPIO相关声明(可能包含常量或宏)
code>

作用

ckquote>

作用:引入必要的库和头文件c;支持文件操作、字符串格式化等功能。

ckquote>

GPIO_export_gpio_32">2. 导出GPIO引脚 export_gpio

<code class="prism language-c">class="token keyword">void class="token function">export_gpioclass="token punctuation">(class="token keyword">int gpioclass="token punctuation">) class="token punctuation">{class="token keyword">char commandclass="token punctuation">[class="token number">100class="token punctuation">]class="token punctuation">;class="token function">snprintfclass="token punctuation">(commandclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">, class="token string">"echo %d > /sys/class/gpio/export"class="token punctuation">, gpioclass="token punctuation">)class="token punctuation">;class="token function">systemclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

功能

ckquote>

功能:通过写入/sys/class/gpio/export文件导出GPIO引脚。

ckquote>

示例

示例:echo 1 > /sys/class/gpio/export 导出GPIO1

注意

ckquote>

GPIO已导出࿰c;此操作会失败。
需添加错误检查(如检查文件是否存在)。

ckquote>

GPIO_set_gpio_direction_51">3. 设置GPIO方向 set_gpio_direction

<code class="prism language-c">class="token keyword">void class="token function">set_gpio_directionclass="token punctuation">(class="token keyword">int gpioclass="token punctuation">, class="token keyword">const class="token keyword">charclass="token operator">* directionclass="token punctuation">) class="token punctuation">{class="token keyword">char commandclass="token punctuation">[class="token number">100class="token punctuation">]class="token punctuation">;class="token function">snprintfclass="token punctuation">(commandclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">, class="token string">"echo \"%s\" > /sys/class/gpio/gpio%d/direction"class="token punctuation">, directionclass="token punctuation">, gpioclass="token punctuation">)class="token punctuation">;class="token function">systemclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

功能

ckquote>

功能:设置GPIO输入(“in”)或输出(“out”)

ckquote>

示例

ckquote>

示例:echo “out” > /sys/class/gpio/gpio1/direction 设置GPIO1为输出。

ckquote>

GPIO_set_gpio_value_65">4. 设置GPIO值 set_gpio_value

<code class="prism language-c">class="token keyword">void class="token function">set_gpio_valueclass="token punctuation">(class="token keyword">int gpioclass="token punctuation">, class="token keyword">int valueclass="token punctuation">) class="token punctuation">{class="token keyword">char commandclass="token punctuation">[class="token number">100class="token punctuation">]class="token punctuation">;class="token function">snprintfclass="token punctuation">(commandclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">, class="token string">"echo \"%d\" > /sys/class/gpio/gpio%d/value"class="token punctuation">, valueclass="token punctuation">, gpioclass="token punctuation">)class="token punctuation">;class="token function">systemclass="token punctuation">(commandclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

功能

ckquote>

功能:设置输出引脚的电平(0为低࿰c;1为高)。

ckquote>

示例

ckquote>

示例:echo 1 > /sys/class/gpio/gpio1/value 设置GPIO1为高电平。

ckquote>

5. 初始化函数 gpio_init

<code class="prism language-c">class="token keyword">void class="token function">gpio_initclass="token punctuation">(class="token keyword">int gpioclass="token punctuation">, class="token keyword">const class="token keyword">charclass="token operator">* directionclass="token punctuation">, class="token keyword">int valueclass="token punctuation">) class="token punctuation">{class="token function">export_gpioclass="token punctuation">(gpioclass="token punctuation">)class="token punctuation">;class="token function">set_gpio_directionclass="token punctuation">(gpioclass="token punctuation">, directionclass="token punctuation">)class="token punctuation">;class="token function">set_gpio_valueclass="token punctuation">(gpioclass="token punctuation">, valueclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

功能

ckquote>

功能:整合导出方向设置初始值设置的流程。

ckquote>

6.class="tags" href="/LongXin.html" title=龙芯>龙芯2K1000适配说明

GPIO_92">6.1 GPIO编号映射

ckquote>

class="tags" href="/LongXin.html" title=龙芯>龙芯2K1000的GPIO可能按组(Bank)编号c;需查阅手册确认物理引脚与逻辑编号的对应关系

ckquote> ckquote>

示例:GPIO1可能对应硬件引脚PZ.1࿰c;需参考《class="tags" href="/LongXin.html" title=龙芯>龙芯2K1000硬件手册》。

ckquote>

6.2 性能优化建议

<code class="prism language-c">直接文件操作代替system:
class="token keyword">void class="token function">export_gpioclass="token punctuation">(class="token keyword">int gpioclass="token punctuation">) class="token punctuation">{class="token keyword">int fd class="token operator">= class="token function">openclass="token punctuation">(class="token string">"/sys/class/gpio/export"class="token punctuation">, O_WRONLYclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(fd class="token operator">< class="token number">0class="token punctuation">) class="token punctuation">{ class="token comment">/* 错误处理 */ class="token punctuation">}class="token keyword">char bufclass="token punctuation">[class="token number">10class="token punctuation">]class="token punctuation">;class="token function">snprintfclass="token punctuation">(bufclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(bufclass="token punctuation">)class="token punctuation">, class="token string">"%d"class="token punctuation">, gpioclass="token punctuation">)class="token punctuation">;class="token function">writeclass="token punctuation">(fdclass="token punctuation">, bufclass="token punctuation">, class="token function">strlenclass="token punctuation">(bufclass="token punctuation">)class="token punctuation">)class="token punctuation">;class="token function">closeclass="token punctuation">(fdclass="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

优点

ckquote>

优点:避免启动Shell进程c;提升效率。

ckquote>

错误处理

ckquote>

错误处理:检查文件操作返回值c;处理GPIO未导出或权限问题。

ckquote>

6.3 权限问题

ckquote>

操作/sys/class/gpio需要root权限。

ckquote>

解决方案

ckquote>

使用sudo运行程序。
配置udev规则࿰c;允许普通用户访问GPIO设备。

ckquote>

6.4内存映射(高级优化)

对于高频操作(如PWM)࿰c;可通过内存映射直接操作GPIO寄存器:

<code class="prism language-c">class="token keyword">volatile class="token class-name">uint32_t class="token operator">*gpio_baseclass="token punctuation">;
class="token keyword">int fd class="token operator">= class="token function">openclass="token punctuation">(class="token string">"/dev/mem"class="token punctuation">, O_RDWRclass="token punctuation">)class="token punctuation">;
gpio_base class="token operator">= class="token function">mmapclass="token punctuation">(class="token constant">NULLclass="token punctuation">, PAGE_SIZEclass="token punctuation">, PROT_READclass="token operator">|PROT_WRITEclass="token punctuation">, MAP_SHAREDclass="token punctuation">, fdclass="token punctuation">, GPIO_BASE_ADDRclass="token punctuation">)class="token punctuation">;
class="token comment">// 直接读写寄存器:gpio_base[REG_OFFSET] |= (1 << PIN);
需查阅class="tags" href="/LongXin.html" title=龙芯>龙芯class="token number">2K1000的GPIO寄存器基地址和偏移量。
code>

6.5示例扩展:按键与LED控制

<code class="prism language-c">class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token comment">// 初始化GPIO1(LED)为输出࿰c;初始关闭class="token function">gpio_initclass="token punctuation">(class="token number">1class="token punctuation">, class="token string">"out"class="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;class="token comment">// 初始化GPIO2(按键)为输入class="token function">gpio_initclass="token punctuation">(class="token number">2class="token punctuation">, class="token string">"in"class="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;class="token keyword">whileclass="token punctuation">(class="token number">1class="token punctuation">) class="token punctuation">{class="token comment">// 读取按键状态(需实现read_gpio_value)class="token keyword">int key class="token operator">= class="token function">read_gpio_valueclass="token punctuation">(class="token number">2class="token punctuation">)class="token punctuation">;class="token comment">// 控制LEDclass="token function">set_gpio_valueclass="token punctuation">(class="token number">1class="token punctuation">, keyclass="token punctuation">)class="token punctuation">;class="token function">usleepclass="token punctuation">(class="token number">10000class="token punctuation">)class="token punctuation">; class="token comment">// 10ms防抖class="token punctuation">}class="token keyword">return class="token number">0class="token punctuation">;
class="token punctuation">}
code>

7.总结

适用场景

ckquote>

适用场景:简单GPIO控制(如LED、继电器)。

ckquote>

优势

ckquote>

优势:代码简洁࿰c;依赖少࿰c;易于移植。

ckquote>

局限性

ckquote>

局限性:system调用效率低c;缺少错误处理。

ckquote>

改进方向

ckquote>

改进方向:直接文件操作、内存映射寄存器、完善错误处理。

ckquote>

http://www.ppmy.cn/embedded/173763.html

相关文章

大数据技术之Spark优化

第 1 章 Spark 性能调优 问:spark 优化 第一句:我们可以从性能,算子,shuffle 过程以及 jvm 四个方面展开优化。 1 常规性能调优 1.1 常规性能调优一:最优资源配置 Spark 性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正…

蓝桥杯备考:01背包+dfs---》搭配购买

我们可以把搭配的那些云当作一个一个的连通块&#xff0c;然后把这些连通快当成每个物体 比如&#xff0c;本题就是两个连通块 当我们做好连通块儿的时候&#xff0c;我们分析一下01背包 step1 分析状态表示 f[i][j]表示 从1到i个物品选出价格不超过j的最大价值 step2:推导状…

uniapp中使用webview并与原页面通信

uniapp中使用webview并与原页面通信 1.接收数据 主要使用message与onPostMessage接收原页面数据&#xff0c;且两个方法只能在APP中使用&#xff0c;其他平台均不支持。 <web-view style"z-index: 1;" :src"webViewUrlappview" onPostMessage"h…

StarRocks SQL使用与MySql的差异及规范注意事项

StarRocks为OLAP列存数据库&#xff0c;擅长复杂分析查询&#xff0c;需显式定义分区/分桶键&#xff1b;MySQL为OLTP行存数据库&#xff0c;适合事务处理。SQL差异&#xff1a;StarRocks支持批量写入&#xff08;避免单行INSERT&#xff09;、物化视图优化&#xff0c;禁用LIM…

R语言的安全编码

R语言的安全编码实践 引言 在数据科学和统计分析的快速发展中&#xff0c;R语言成为了一种广泛使用的工具。虽然R语言为数据分析提供了强大的功能&#xff0c;但在编写R代码时&#xff0c;安全性常常被忽视。安全编码不仅关乎软件的稳定性和可靠性&#xff0c;还涉及到数据隐…

unreal engine5 mation warping使用,敌人受击后面向攻击者

UE5系列文章目录 文章目录 UE5系列文章目录前言一、Motion Warping是什么&#xff1f;二、使用步骤 前言 unreal engine5 mation warping使用&#xff0c;敌人受击后面向攻击者 一、Motion Warping是什么&#xff1f; 在Unreal Engine 5中&#xff0c;**Motion Warping&…

python-websocket压力测试

一.websocket简介及安装 使用pip命令安装websocket库&#xff1a;pip install websocket-client websocket.WebSocketApp 是对 websocket.WebSocket 的封装&#xff0c;支持自动定时发送 PING 帧&#xff0c;支持事件驱动方式的数据帧接收&#xff0c;可用于长期的 WebSocket…

Webpack优化前端性能

Webpack优化前端性能☆☆ 涵盖了代码分割、懒加载、压缩、缓存优化、Tree Shaking、图片优化、CDN使用等多个方面。 Webpack优化前端性能详解(2025综合实践版) Webpack作为现代前端工程化的核心工具,其优化能力直接影响项目的首屏速度、交互流畅度和用户体验。以下从代码维…