[特殊字符] 驱动开发硬核特训 · Day 3 —— GPIO 子系统与中断机制全解析

linux设备驱动程序——gpio控制 在gpio初始化的函数中添加这个接口,在加载完成之后查看/sys/class/gpio/目录下是否有相应的gpio$num(这里是gpio26)文件(需要注意的是,在上例中,当用户程序打开设备时才进行gpio的初始化,关闭文件时释放gpio的资源,所以需要打开文件再操作)。当用户程序执行时,用户程序一直获取用户的输入,根据用户输入"on"或者"off",然后将其写入设备文件,触发系统调用,设备文件根据设备号找到内核中相应的file_operation结构体,相应write函数被调用,执行相应的点灯操作。 阅读详情

主题:从硬件原理到驱动实战 —— GPIO 子系统与中断机制全解析

在嵌入式 Linux 系统中,GPIO(通用输入输出)接口是最基础也是使用最频繁的硬件控制资源。无论是控制 LED、读取按键、触发中断,还是连接传感器模块,GPIO 都是一切外设交互的起点。

本篇内容将围绕 GPIO 子系统展开深入讲解,从硬件原理、电气属性、SoC 控制器设计入手,系统剖析 GPIO 的驱动架构、中断配置方式、设备树属性配置,以及如何编写一个完整可用的 GPIO 驱动模块。同时结合 i.MX6ULL、AM335x 等主流平台展开实战解析,确保每个环节落地可用、可调试、可维护。


在这里插入图片描述

🎯 本期特训结构

模块内容概览
GPIO 硬件原理引脚定义、电气特性、输入输出逻辑、高阻状态、中断触发机制
GPIO 控制器架构i.MX6ULL 和 AM335x GPIO 控制器寄存器与功能
Linux GPIO 子系统gpiolib 架构、pinctrl 配置、sysfs 接口、irqchip 绑定
设备树配置方法gpio-controller、gpio-ranges、interrupts、label 等
驱动开发流程自定义 platform 驱动、按键/LED 结合中断使用案例
实战平台分析基于 i.MX6ULL 开发板 GPIO 输入中断控制案例全流程
常见问题与调试边沿失效、中断不触发、误抖动、输入态读取异常

📘 Part 1:GPIO 硬件原理与中断基础

✅ 1. GPIO 的定义与逻辑功能

GPIO(General Purpose Input/Output)指可配置为输入或输出的引脚,用于与外部器件进行简单逻辑通信。

  • 输入模式:用于读取外部状态,如按键、传感器信号等;
  • 输出模式:用于控制设备,如点亮 LED、复位模块、触发外部器件;
  • 高阻状态(Hi-Z):在未配置为输入或输出时处于断开状态,不影响总线信号。
✅ 2. 电气特性分析
  • 电平支持:3.3V / 1.8V / 5V(与 SoC 电压域匹配)
  • 驱动能力:单引脚电流不可过载,通常 < 8mA
  • 上拉/下拉:可通过内部电路或外部电阻设置
✅ 3. GPIO 中断机制

GPIO 引脚可以作为中断源,用于检测外部事件的变化。

常见触发模式:

触发类型描述
上升沿从低电平变为高电平时触发
下降沿从高电平变为低电平时触发
双边沿电平变化即触发
高电平触发电平恒定为高触发
低电平触发电平恒定为低触发

📘 Part 2:GPIO 控制器硬件结构(以 i.MX6ULL 为例)

✅ 1. i.MX6ULL GPIO 控制器概览

该芯片包含多个 GPIO 控制器,每组控制 32 个引脚。

  • GPIO1_IO00 ~ GPIO1_IO31
  • GPIO2_IO00 ~ GPIO2_IO31

主要寄存器:

寄存器名功能
GPIOx_DR数据寄存器,读写电平
GPIOx_GDIR设置方向(0:输入, 1:输出)
GPIOx_PSR状态寄存器(实时电平)
GPIOx_IMR中断屏蔽控制
GPIOx_ISR中断状态标记
✅ 2. 设置流程实例

设置 GPIO1_IO03 为输出高电平:

// 配置为输出
writel(readl(GPIO1_GDIR) | (1 << 3), GPIO1_GDIR);
// 设置为高电平
writel(readl(GPIO1_DR) | (1 << 3), GPIO1_DR);

设置为输入:清除 GDIR 相应位即可。


📘 Part 3:Linux GPIO 子系统架构

✅ 1. gpiolib 架构核心

Linux 使用 gpiolib 管理 GPIO 控制器与驱动统一接口,典型结构:

  • struct gpio_chip:抽象一组 GPIO 控制器
  • struct gpio_desc:描述每一个 GPIO 引脚状态

常见操作接口:

int gpio_request(unsigned gpio, const char *label);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned gpio);
void gpio_set_value(unsigned gpio, int value);
void gpio_free(unsigned gpio);
✅ 2. sysfs 接口(legacy,不推荐新项目使用)

通过 /sys/class/gpio/ 可操作 GPIO:

echo 23 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio23/direction
echo 1 > /sys/class/gpio/gpio23/value
✅ 3. 中断绑定机制(IRQChip)

GPIO 控制器可集成中断控制器,通过 irq_chip 注册中断号,与 irqdomain 配置关联,最终可在驱动中 request_irq() 处理。


📘 Part 4:设备树中的 GPIO 与中断配置

✅ 1. 典型节点结构
gpio_keys {
    compatible = "gpio-keys";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio_key>;
    autorepeat;

    button {
        label = "gpio-key";
        linux,code = <KEY_ENTER>;
        gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;
        debounce-interval = <10>;
    };
};
✅ 2. 属性说明
属性名说明
gpiosGPIO 控制器 + 引脚编号
interrupt-parent中断控制器引用节点
interrupts中断号 + 触发类型
debounce去抖时间(ms)
linux,code对应输入子系统的按键码

📘 Part 5:自定义 GPIO 驱动实战 —— 按键中断控制模块

✅ 1. 驱动基本结构
static irqreturn_t key_irq_handler(int irq, void *dev_id) {
    printk("GPIO KEY IRQ Triggered\n");
    return IRQ_HANDLED;
}

static int key_probe(struct platform_device *pdev) {
    int irq, gpio;
    gpio = of_get_named_gpio(pdev->dev.of_node, "gpios", 0);
    gpio_request(gpio, "key_gpio");
    gpio_direction_input(gpio);
    irq = gpio_to_irq(gpio);
    request_irq(irq, key_irq_handler, IRQF_TRIGGER_FALLING, "gpio_key", NULL);
    return 0;
}
✅ 2. 匹配设备树 compatible,加载驱动
custom_gpio_key {
    compatible = "custom,gpio-key";
    gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
};

📘 Part 6:实战平台案例分析 —— i.MX6ULL 开发板 GPIO 按键输入中断

✅ 开发板说明
  • 板载 KEY1 按键连接至 GPIO1_IO10
  • 默认状态高,按下拉低,触发下降沿中断
✅ 步骤回顾
  1. 修改设备树,添加按键节点
  2. 编写驱动程序,申请 GPIO、转换 IRQ、注册中断
  3. 加入 log 打印、状态指示等调试辅助逻辑
  4. insmod 加载模块,按键按下终端打印 “IRQ Triggered”

🧪 常见问题与调试技巧

问题可能原因与处理方式
中断无反应GPIO 中断未 enable、引脚方向错误、未触发边沿
中断频繁抖动无去抖处理、需在硬件加 RC 滤波或软件定时屏蔽
GPIO 无法设置电平未设置方向、pinctrl 状态未配置为 output
中断号为负数(< 0)gpio_to_irq() 失败,可能未正确注册 irqchip
sysfs 接口未出现需检查内核是否启用 legacy GPIO sysfs 功能

🧠 本日知识点总结

分类核心内容
硬件原理GPIO 输入/输出/高阻、边沿检测、电气属性
控制器结构GPIOx_DR、GDIR、IMR、ISR 等寄存器详解
Linux框架gpiolib、irqchip、pinctrl、gpio_keys 驱动框架
设备树配置gpios、interrupts、label、code、debounce
驱动开发流程probe 申请 GPIO → irq → 中断处理逻辑实现
调试技巧回环验证、中断频率测试、dmesg 分析路径追踪

✅ 总结

GPIO 驱动开发不仅是嵌入式系统的起点,更是理解中断控制、资源管理与设备树协同机制的基础。通过本篇内容,我们从硬件原理、寄存器分析,到 Linux 驱动框架和设备树结构,完整实现了一个 GPIO 中断驱动的开发与调试流程。

📘 Day 4 预告:I2C 总线协议原理 + 传感器驱动开发全流程(含外设挂载调试)

敬请期待后续章节,继续深化嵌入式驱动工程核心能力。

GPIO驱动相关笔记 打算跟着友善之臂的《mini2440 linux移植开发指南》来做个LED驱动,虽然LED的原理简单得不能再简单了,但是要把kernel中针对于s3c24**的GPIO的一些数据结构,还有函数搞清楚也不是那么轻松的事,所以本文主要简单地说明下LED驱动中的相关数据结构以及函数/宏的定义,并对驱动加以验证*************************************************************************** 注意:在/arch/arm/mach-s3c2410/i 阅读详情

相关推荐

Linux内核编程(三)gpio库函数驱动编写

Linux内核驱动gpio库函数编写

qq_1033275663的博客 2823

Linux中编写GPIO驱动

GPIO是嵌入式开发中常用的一个模块,Linux下的任何外设驱动,最终目的都是要配置相应的硬件寄存器。在Linux中,不管是内核空间代码,还是用户空间代码,访问的都是虚拟地址。以上就是今天要讲的内容,本文简单介绍了内核中对GPIO的使用,制作不易,多多包涵。

qq_40514606的博客 2349

Linux内核编程(四)gpio寄存器驱动编写

Linux内核驱动gpio寄存器编写。

qq_1033275663的博客 1014

写linux gpio驱动程序

写 Linux GPIO 驱动程序需要具备一定的内核编程基础和熟悉 Linux 设备驱动框架。下面是一个简单的流程: 创建设备文件:在 /dev 目录下创建设备文件,并为其分配一个设备号。 实现设备驱动模块:写一个 Linux 模块,该模块实现了所有与设备相关的操作。 初始化 GPIO:在驱动程序中读取 GPIO 设备的芯片信息,并初始化相应的 GPIO 端口。 实现设备操作:为设备的不同...

weixin_42584586的博客 363

Comsol 超声空化气泡仿真

当液体中受到高能量的超声波作用时,液体中的压力会发生剧烈变化,形成局部的低压区域。当液体中的压力降低到饱和蒸汽压以下时,就会发生空化现象,即液体中形成微小气泡。这种空化常用于一些工业应用,如清洗、乳化、混合等。这种空化常用于一些医学和生物学应用,如碎石术、肿瘤治疗、细胞破碎等。超声空化的应用非常广泛。在医学领域,超声空化广泛应用于诊断和治疗,如超声造影、超声刀、超声碎石术等。在工业领域,超声空化可用于清洗、乳化、混合等工艺。此外,超声空化还在食品加工、化学合成、环境保护等领域有着重要应用。

声学黑洞仿真工作室 2554

中断向量表配置不当引发Default_Handler死循环问题解析

本文深入解析STM32开发中因中断向量表配置不当导致的Default_Handler死循环问题。以STM32F407VET6为例,详细阐述中断向量表的工作原理、常见触发场景及系统化排查方法,并提供使用STM32CubeMX的正确姿势和手动配置的注意事项,帮助开发者快速定位并解决这一常见难题。

grafana6viz的博客 178

Linux驱动GPIO编程入门

Linux驱动GPIO编程入门

我的博客 886

告别NEDC!手把手教你将CLTC/WLTP等最新工况文件导入AVL Cruise(附资源包)

本文详细指导如何将CLTC、WLTP等最新工况文件导入AVL Cruise软件,替代传统的NEDC工况。从资源获取、文件预处理到分步导入指南,再到常见问题排查,帮助工程师高效完成汽车仿真性能评估。附赠全球主流工况文件资源包,助力精准仿真分析。

weixin_30374009的博客 461

【linux驱动开发】zynq下gpio驱动

本结构体用于保存设备信息。/* 设备号 *//* cdev *//* 类 *//* 设备 */int major;/* 主设备号 */int minor;/* 次设备号 *//* 设备节点 */// 指针数组存储多个GPIO// 使用的GPIO数量// GPIO的默认状态。

qq_33983114的博客 669

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 259

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 180

Linux通用GPIO驱动写法与应用

Linux通用GPIO驱动写法与应用 1. 说明 在Linux中,可以对GPIO进行相关的控制,具体的做法就是利用字符设备驱动程序对相关的gpio进行控制。由于操作系统的限制,在Linux上又无法直接在应用程序的层面上对底层的硬件进行操作。本文主要通过一个点亮红外灯的实例,再次理解Linux下的应用程序与驱动程序的交互,同时加深驱动程序编写流程的理解。 2.方法一:采用通用sysfs文件系统的方式 这种方式是利用内核配置sysfs文件系统 这种方式是将gpio映射到sysfs文件系统中,也就是操作/sys

匠心码农 6233

MIKE 21 教程 1.5 基于卫星影像绘制河道边界

上一节讲解了如何输入高程数据与绘制网格本节讲解如何根据卫星影像绘制河道边界。在实际项目中,经常遇到河道图纸缺少的情况,此时可以根据卫星影像进行勾勒绘制。常用的地理信息软件均可完成此功能,这里使用大家较为熟悉的ArcGis进行教学(本文默认大家有基础ArcGis操作知识,如有不懂可留言)。

Hello Word 3282

Linux驱动开发(速记版)--GPIO子系统

RK3568 讯为

荒野 1335

【100%通过率】华为OD机试真题 C++ 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 9943

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 560

【Linux】Linux驱动开发:gpio子系统

在设备树中,“GPIO组”就是一个GPIO Controller,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。如果要操作GPIO引脚的话,需要先将所用引脚配置为GPIO功能,这需要通过Pinctrl子系统来实现。在Pinctrl子系统将引脚配置为GPIO功能后,就可以使用GPIO子系统来设置GPIO的方向等。表示这个节点是一个GPIO Controller,它下面有很多引脚。在根节点下写自己的节点。在根节点下写自己的节点。

W__winter的博客 3630

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux 内核探秘:从零构建 GPIO 设备驱动程序实战指南

通过以上步骤,我们完成了一个简单的 GPIO 设备驱动程序的编写、编译、加载与测试。但实际应用中,还需考虑更多问题,如中断处理、电源管理、错误处理优化等。后续可以深入研究 Linux 内核文档和优秀的开源驱动代码,进一步提升驱动开发能力,为更复杂的嵌入式系统开发打下坚实基础。上述文章涵盖了 GPIO 驱动开发全流程,若你觉得某些部分需要更详细讲解,或想增加调试技巧等内容,随时告诉我。云计算培训摩尔狮的独特优势助力解决问题 摩尔狮的课程不仅有理论知识和实践方法,还有强大的师资团队和教学服务。

Cheese_Y的博客 1269

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LINUX驱动之——GPIO的基本驱动

Linux 驱动开发之GPIO

zzzzzz_9的博客 5031

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。 关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。 文章目录示例程序目标编写驱动程序创建驱动目录和驱动程序创建 Makefile 文件编译驱动模块加载驱动模块设备节点应用程序卸载驱动模块 别人的经验,我们的阶梯! 大家好,我是道哥。 在前几篇文章中,我们一块讨论了:在 Linux 系统中,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这.

IOT物联网小镇 3682

标准linux4.4--驱动开发(二)GPIO驱动编写

RK3308-驱动开发(二)GPIO驱动编写简介介绍GPIODTS配置在驱动文件中关联DTS的配置驱动说明中断复用FAQs 简介 1、什么是linux内核模块 在linux中,驱动程序是以内核模块的形式存在的,驱动程序是放在module中的。每个驱动程序都是一个个独立的module,一般情况下,各个module是无关的。在设计linux驱动的时候,首先需要设计一个module。 2、加载的方式 (1)module编译好以后生成一个*.ko module可以安装,可以卸载 #insmod led_drv.ko

qq_42233843的博客 2053

Linux GPIO驱动实例及GPIOLib简介

26.1 前言 Linux2.6.35 之后就有了gpiolib,其作用为对所有GPIO进行统一管理,避免多个驱动控制一个IO所带来的混乱,需要在编译内核的时候选上支持gpiolib选项。本文是基于Linux gpiolib库初试GPIO驱动编程的学习记录,供学习参考。 26.2 混杂设备 混杂设备主设备号为10,次设备号:0-255共256个设备。minor=MISC_DYNAMIC...

Chasing_Chasing的博客 3211

linux驱动开发(一)—GPIO驱动框架

前言          GPIO驱动是Linux驱动开发中最基础、但却是很常用、很重要的驱动。比如你要点亮一个LED灯、键盘扫描、输出高低电平等等。而Linux内核的强大之处在于对最底层的GPIO硬件操作层的基础上封装了一些统一的GPIO操作接口,也就是所谓的GPIO驱动框架。这样开发人员可以调用这些接口去操作设备的IO口,不需要担心硬件平台的不同导致IO口的不同。          今天,我

yang blog 2万+

Linux-GPIO应用编程

当前 SoC 所包含的 GPIO 控制器,我们知道 I.MX6UL/I.MX6ULL 一共包含了 5 个 GPIO控制器,分别为 GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,在这里分别对应 gpiochip0、gpiochip32、gpiochip64、gpiochip96、gpiochip128 这 5 个文件夹,每一个 gpiochipX 文件夹用来管理一组 GPIO。这个文件夹就是导出来的 GPIO 引脚对应的文件夹,用于管理、控制该 GPIO 引脚,稍后再给大家介绍。

qq_28576837的博客 1389

Linux驱动——杂项驱动&GPIO子系统

Linux驱动中的杂项驱动和GPIO子系统

jcf5832的博客 948

指纹识别传感器驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述在RK3568平台使用私有二进制协议指纹模组的调试要点:以亮灯确认通信为首要步骤,波特率固定为57600,通过tcflush(TCIFLUSH)清除缓冲避免旧应答干扰;严格按“连接→亮灯→录入→比对”顺序操作,依赖包头F11FE22E锚定帧,校验标记与状态(成功为0E,0F为已存在);以灯亮为准选择正确TTY(如ttyS8非ttyS7),禁用CRTSCTS,应用层采用异步poll机制,避免误判。强调硬件层面断电重连、权限配置及单路排针原则,确保通信稳定可靠。

wanwuzhineng_01的博客 345
上一篇: 原来 C++ 这么简单:每日十题轻松学 (Day 6 模板特化精讲篇)
下一篇: [特殊字符] 驱动开发硬核特训 · Day 4
嵌入式孙老师
博客等级 码龄7年 5686粉丝 898原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值