tag 标签: 外设

相关博文
  • 2024-10-10 14:46
    66 次阅读|
    0 个评论
    01 方法一:sysfs文件系统控制外设(linux4.8开始分析) 众所周知,linux下一切皆文件,那么应用层如何控制硬件层,同样是通过 文件I/O的方式来实现的,那、么应用层控制硬件层通常有两种方式: 1、/dev/ 目录下为各设备节点,通过对这些设备文件的I/O操作可以实现对底层硬件的操作 2、sysfs 文件系统的主要功能是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图,而 sysfs 文件系统挂载在 /sys 目录下 一、sys目录架构 进入到 sys 目录下,可以看到如下文件: 包括 block、bus、class、dev、devices、firmware、fs、kernel、 modules、power 等 二、sys 目录介绍 sysfs 是一个基于内存的文件系统,同 devfs 、 proc 文件系统一样,称为虚拟文件系统;它的作用是将内核信息以文件的方式提供给应用层使用。 sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。 sysfs 文件系统挂载在 /sys 目录下, /sys/devices: 这是系统中所有设备存放的目录,也就是系统中的所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。 /sys/block: 块设备的存放目录,这是一个过时的接口,按照 sysfs 的设计理念,系统所有的设备都存放在/sys/devices 目录下,所以/sys/block 目录下的文件通常是链接到/sys/devices 目录下的文件。 /sys/bus: 这是系统中的所有设备按照总线类型分类放置的目录结构,/sys/devices 目录下每一种设备都是挂在某种总线下的,譬如 i2c 设备挂在 I2C 总线下。同样,/sys/bus 目录下的文件通常也是链接到了/sys/devices 目录。 /sys/class: 这是系统中的所有设备按照其功能分类放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。按照设备的功能划分组织在/sys/class 目录下,譬如/sys/class/leds目录中存放了所有的 LED 设备,/sys/class/input 目录中存放了所有的输入类设备。 /sys/dev: 这是按照设备号的方式放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都是链接文件,链接到/sys/devices 目录下对应的设备。 /sys/firmware: 描述了内核中的固件。 /sys/fs: 用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。 /sys/kernel: 这里是内核中所有可调参数的位置。 /sys/module: 这里有系统中所有模块的信息。 /sys/power: 这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。 点击图片可查看完整电子表格 上表显示的便是 sysfs 文件系统中的目录,包括 block 、 bus 、 class 、 dev 、 devices 、 firmware 、 fs 、 kernel 、 modules、 power 等,每个目录下又有许多文件或子目录,对这些目录的说明如所示: Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念; Linux 针对各种常见的设备进行分类,譬如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备、 PWM 设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架,这个就叫做设备驱动框架。设备驱动框架为驱动开发和应用层提供了一套统一的接口规范,譬如对 LED 类设备来说,内核提供了 LED 设备驱动框架,驱动工程师编写 LED 驱动时,使用 LED 驱动框架来开发自己的 LED 驱动程序,这样做的好处就在于,能够对上层应用层提供统一、标准化的接口、同时又降低了驱动开发工程师的难度。 02 方法二:Libgpiod库控制外设 包括字符设备文件和块设备文件,设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/ 目录下,我们也把/dev 目录下的文件称为设备节点。 libgpiod是用于与linux GPIO交互的C库和工具,从 linux 4.8 后,官方不推荐使用 GPIO sysfs 接口,libgpiod库封装了 ioctl 调用和简单的API接口。 与sysfs方式相比,libgpiod可以保证所有分配的资源,在关闭文件描述符后得到完全释放,并且拥有sysfs方式接口中不存在的功能(如时间轮询,一次设置/读取多个gpio值)。此外libgpiod还包含一组命令行工具,允许用户使用脚本对gpio进行个性化操作。 目前有六个命令行工具可用 gpiodetect:列举所有的gpio芯片以及它们名字,标签和io数目 gpioinfo:列举所有gpio芯片以及它们的名字,制造商,方向,激活状态,附加标志等 gpioget :获取特定gpio引脚的当前值 active-high是高电平 值为1 active-low是低电平 值为0 gpioset :设置特定的当前值 gpiofind :获取gpiochip的name和offset eg:gpiofind GPIO26 是加上line的名字 gpiomon : 监视特定io上的特定事件 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf) (如有侵权,联系删除)
  • 热度 4
    2023-12-9 10:58
    670 次阅读|
    0 个评论
    谢谢兆易创新高工、芯片综合服务商映时科技。谢谢面包板论坛。 感谢 机械工业出版社。 感谢提供的这一次试读机会。 感谢 映时科技 董晓 任保宏 。 接上九篇: 《GD32 MCU原理及固件库开发指南》+试读心得(1) 《GD32 MCU原理及固件库开发指南》+试读心得(2)第八章 《GD32 MCU原理及固件库开发指南》+试读心得第一章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第一章(2) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(2) 《GD32 MCU原理及固件库开发指南》+第三章试读心得 《GD32 MCU原理及固件库开发指南》+第四章试读心得 《GD32 MCU原理及固件库开发指南》+第五章MCU基础外设 《GD32 MCU原理及固件库开发指南》+第六章模拟外设 在阅读《GD32 MCU原理及固件库开发指南》之后,我深感嵌入式系统中的串口通信不仅是一门技术,更是一种艺术。在微控制器的世界里,串口通信作为一种通用的通信接口,为设备间的数据交换提供了可能。而GD32F303的USART(Universal Synchronous/Asynchronous Receiver Transmitter)模块更是将这种可能性推向了新的高度。 首先,通过使用printf函数进行实例讲解,我了解到了USART的半双工通信模式、DMA通信模式、同步模式、接收超时、中断方式收发等特性。这不仅让我对USART有了更深入的理解,也让我明白了在硬件系统中,如何灵活、有效地利用这些特性来实现数据通信。 然后,通过构建一个串口命令行,我体验到了使用串口进行程序调试的便捷性。相对于传统的JTAG或SWD接口,串口命令行无疑提供了更大的灵活性,使得我们可以在任何时间、任何地点对程序进行调试。更为重要的是,这个串口命令行经过了实际工程的验证,占用资源少,易于移植到其他MCU,甚至是资源更为紧张的8位微控制器上。 让我们继续用幽默的方式讲解这些通信模式。 1. USART的半双工通信模式 半双工通信模式就像是在一个嘈杂的餐厅里与邻桌人交谈。你们只能通过一个人讲话,另一个人倾听来交流。如果你试图同时说话,那么你们将无法听清对方的话。这就像是在争夺话语权,而最后只会变成一场嘈杂的混乱。 2. DMA通信模式 DMA通信模式就像一个非常专业的侍者。你可以告诉侍者你要什么,然后他会为你送到餐桌上,而你则可以继续享受你的晚餐。你不必亲自去取食物,侍者会帮你完成一切。这样,你可以专注于更重要的事情,比如品尝美食。 3. 同步模式 同步模式就像是一场精心编排的舞蹈表演。每个舞者都必须按照相同的节奏和步伐跳舞,以确保整个表演的协调性和完美性。如果有人跳错了步伐,那么整个表演就会受到影响。因此,在同步通信中,每个设备都必须按照相同的速度和顺序发送和接收数据,以确保数据的准确性和一致性。 4. 接收超时 接收超时就像是在等待一个迟到的朋友。你等了很长时间,但是他还是没有出现。最后,你决定离开并做其他事情。这就是接收超时的情况,如果设备在特定的时间内没有接收到数据,它就会放弃等待并返回一个错误。这就像是在告诉朋友:“我不能再等你了,我要去做其他事情了。” 5. 中断方式收发 中断方式收发就像是在打瞌睡时被突然的电话铃声吵醒。你正在做美梦,但是电话响了,你必须立刻醒来接电话。同样地,当设备需要发送或接收数据时,它会发出一个中断信号,让CPU停止当前的工作并处理数据。这就像是在说:“喂!喂!快醒醒!有重要的事情要做!”这样,CPU可以高效地处理数据,而不会错过任何重要的信息。 希望这些更幽默的讲解方式能够帮助你更好地理解这些通信模式! 使用串口命令行来调试程序比使用JTAG或者SWD接口要更加灵活。 首先,让我们来了解一下这些高大上的名词都是啥意思。JTAG和SWD接口是我们在硬件调试中常用的两种接口,可以帮助我们更加方便地调试嵌入式系统等硬件设备。而串口命令行则是一种通过串口通信来进行调试的方式。 好了,科普完毕,接下来让我们进入正题。 使用JTAG或者SWD接口调试程序,就像是通过一个高级餐厅的旋转门进入餐厅一样,虽然看起来高端大气上档次,但是实际上却有很多限制。比如你只能按照规定的方向进入或退出,而且还必须慢慢地推门,否则门就会卡住。 而使用串口命令行调试程序则像是通过一个街头小摊的摊位门进入市场一样,虽然看起来比较简陋,但是却非常灵活。你可以随时随地进出,而且还可以自由地控制门的开关速度,非常方便。 另外,使用串口命令行还有一个好处就是可以实现远程调试。你可以在家里通过电脑连接到一个远程的串口服务器上,就可以对远在千里之外的程序进行调试了。这就像是你在家里通过手机APP控制智能家居一样,非常便捷。 综上所述,使用串口命令行来调试程序比使用JTAG或者SWD接口要更加灵活,不仅可以实现远程调试,而且还非常便捷。当然,如果你要装X的话,还是可以使用JTAG或SWD接口来调试程序的,毕竟旋转门看起来还是比较高端的。 JTAG和SWD都是用于硬件调试的接口,以下是它们的一些主要区别: 1. 定义:JTAG(Joint Test Action Group)是一种国际标准测试协议,主要用于芯片内部测试。而SWD(Serial Wire Debug)则是一种串行调试接口,采用不同的调试协议。 2. 引脚数量:标准的JTAG接口是4线的,包括TMS、TCLK、TDI、TDO,分别是模式选择、时钟、数据输入线和数据输出线。一般再加上VCC和GND,因此共有6个引脚。而SWD只需要4个引脚,SW_CLK、SW_SDIO、NREST、VDD,所以结构简单。 3. 使用范围:JTAG接口的使用范围比SWD广泛。JTAG可以深入芯片内部进行测试,而SWD主要用于调试。 4. 速度和可靠性:在高速模式和大数据量的情况下,SWD模式比JTAG更加可靠。JTAG下载程序可能会失败,但是SWD发生错误的概率会小很多。基本使用JTAG仿真模式的情况下都可以直接使用SWD模式,只要仿真器支持。 5. 引脚需求:当GPIO刚好缺一个的时候,可以使用SWD仿真,这种模式支持更少的引脚。在板子的体积有限的时候推荐使用SWD模式,它需要的引脚少,当然需要的PCB空间就小。 在嵌入式系统的通信方式中,I2C和SPI是最为常见和重要的两种。从基础知识到实际应用,我收获颇丰。 7.2节中,我了解了I2C接口的背景知识和特点。I2C接口是一种简单、灵活的通信协议,广泛应用于微控制器和其他设备之间的通信。通过学习GD32F303的I2C外设及其相关API,我深入理解了I2C主从通信方式,包括查询方式、DMA方式、中断方式。最后,我使用GD32F303的I2C接口实现了对BluePillExt开发板板载EEPROM的读写访问。这个过程让我深刻体会到I2C的便利性和实用性。 首先,想象一下I2C接口就像是一个小镇上的邮递员。他(接口)负责在镇上的各个房子(微控制器和外设)之间传递信件(数据)。 1. **简单**:I2C接口就像是个只会骑自行车送信的邮递员。他不需要复杂的交通工具,只需一个简单的自行车就能完成任务。同样,I2C接口不需要复杂的硬件设计,两根线就能实现通信,多么简洁啊! 2. **便宜**:你知道小镇上的邮递员薪水通常都不会太高,对吧?同样,使用I2C接口的设备通常都很便宜,毕竟它只需要两根线和简单的硬件设计。 3. **低速**:你知道邮递员送信的速度通常都不会太快,对吧?他们不是闪电麦皮,不能一瞬间就送完所有的信。同样,I2C接口的速度也是相对较慢的,但这并不影响它的工作效率。毕竟,慢工出细活嘛! 然后我们来聊聊重要参数: * **时钟频率**:这就像邮递员的工作节奏。如果节奏太快,邮递员可能会送错信;如果节奏太慢,信件可能要及时才能到达。所以,我们需要找到一个合适的节奏,既能保证送信的效率,又不会让邮递员感到压力。 * **地址空间**:想象一下每个房子都有一个唯一的门牌号,邮递员通过这个门牌号就能准确找到房子。同样,I2C接口上的每个设备都有一个唯一的地址,微控制器通过这个地址就能找到需要通信的设备。 * **数据传输速率**:这就像邮递员每天能送多少信。如果他送得太快,可能会出错;如果他送得太慢,信件可能会堆积。所以我们需要找到一个合适的速率,既能保证送信的效率,又不会让邮递员感到压力。 现在,你是不是对I2C接口有了更深入的了解呢?如果你觉得这个解释很有趣或者很有帮助,别忘了给我点个赞哦! 此外,7.3节中,我也学习了SPI的基础知识,了解了SPI的特点和重要参数。SPI是一种同步串行通信协议,具有高速度、高效率、占用资源少等优点。通过学习GD32F303的SPI外设及其相关API,我进一步了解了SPI的通信方式,包括查询方式、DMA加速实现SPI高性能传输、SPI半双工通信和中断发送方法。最后,我使用GD32F303的SPI实现了对BluePillExt开发板板载SPI Flash的读写擦除访问。这个过程让我深刻体会到SPI的高效性和灵活性。 总的来说,通过学习GD32F303的USART、I2C和SPI等通信接口的使用方法,我对嵌入式系统中的数据通信有了更深的理解。这不仅让我明白了这些接口在硬件系统中的重要性,也激发了我进一步探索和学习嵌入式系统其他领域的兴趣。我相信,随着我对嵌入式系统学习的深入,我将能够更好地利用这些接口为我的项目带来更多的可能性。 谢谢! 本人在本论坛内的试读 : 《Proteus实战攻略》+7 第五章双足机器人仿真实例 《Proteus实战攻略》+6 第四章AVR单片机仿真 本人在本论坛内的帖子: 【灵动MM32SPIN030C单电机控制器】+(二)磁场导向控制-空间矢量调制(SVM) 【灵动MM32SPIN030C单电机控制器】+(一)使用Motor-DK (MM32SPIN030C)芯片的体验与心得 米尔-STM32MP135开发板试用2-螺旋桨控制(原创)首发(开源) 米尔-STM32MP135开发板试用4-Linux控制螺旋桨升力大小(原创) 【KT148ADSP语音芯片】+试用心得1 【KT6368A双模蓝牙芯片】+体验 我希望这些内容能对您有所帮助! 2023年12月8日
  • 热度 5
    2023-10-7 23:13
    1302 次阅读|
    0 个评论
    谢谢兆易创新高工、芯片综合服务商映时科技。谢谢面包板论坛。 感谢 机械工业出版社。 感谢提供的这一次试读机会。 感谢 映时科技 董晓 任保宏 。 为感谢大家的帮助与支持我给大家表演一段: 接上八篇: 《GD32 MCU原理及固件库开发指南》+试读心得(1) 《GD32 MCU原理及固件库开发指南》+试读心得(2)第八章 《GD32 MCU原理及固件库开发指南》+试读心得第一章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第一章(2) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(2) 《GD32 MCU原理及固件库开发指南》+第三章试读心得 《GD32 MCU原理及固件库开发指南》+第四章试读心得 电子发烧友jf_39110170 网名“还没吃饭”阅读《GD32 MCU原理及固件库开发指南》第五章MCU基础外设 的读后感: 最近我回顾了GD32MCU基础外设,包括GPIO、DMA、定时器、RTC、看门狗定时器等,这些是嵌入式系统中常用的接口。通过复习这些外设,我深刻体会到MCU作为控制器的强大之处,可以方便地控制各种硬件设备。首先,GPIO是最基础的外设,可以用于控制LED、LCD等输出设备,以及读取按钮、光敏等输入设备。通过学习GPIO,我了解到它的输出和输入操作是如此简单,可以轻松地实现流水灯和按键输入。此外,GPIO还可以配合DMA实现高速并行数据读取,可以用来模拟UART、I2C、SPI等通信协议。这使我更加深入地了解到嵌入式系统的多样性和灵活性。 其次,我回顾了使用中断方式来实现按键输入实例。EXTI的核心是20个相互独立的边沿检测电路,处理器使用EXTI可以从GPIO或者内部外设获取信息。通过这个实例,我复习了处理器如何感知外界的信息,并作出相应的处理。 此外,我还学习了DMA在SRAM中搬运数据和从Flash向SRAM搬运数据。DMA是一种不依赖于CPU的内存管理技术,可以快速地传输数据。通过这个实例,我了解到在实际工程中如何使用DMA来配合其他外设(如ADC、DAC、SPI、USART等)实现更高效的数据传输和控制。定时器也是我复习的重点之一。通过定时器可以实现软件延时测量事件,输出PWM和测量外部输入信号频率等功能。在定时器之间的同步操作中,我学到了如何实现多个定时器的协同工作,以便更好地控制和管理时间。 最后,我回顾了RTC和看门狗定时器。RTC可以获取日历时间和低功耗唤醒,是实际工程中非常重要的外设之一。而看门狗定时器则是一种可靠性更高的保护措施,可以确保系统在出现异常时能够及时复位并重新启动。通过复习GD32MCU基础外设,我不仅掌握了这些接口的基本使用方法,还深入了解了它们的工作原理和应用场景。这些知识将对我今后的学习和工作产生积极的影响,使我更加深入地了解嵌入式系统的设计和应用。 谢谢! 本人帖子: 米尔-STM32MP135开发板试用2-螺旋桨控制(原创)首发(开源) 米尔-STM32MP135开发板试用4-Linux控制螺旋桨升力大小(原创) 【飞凌AM6254开发板试用】+5内核编译串口芯片Linux驱动(原创) 【Milk-V Duo 开发板免费体验】4-Linux控制小车动作(原创)首发 【飞凌i.MX9352开发板试用】+机械臂游戏2游戏操纵杆控制四自由度机械臂(开源)原创首发 【米尔瑞萨RZ/G2L开发板-创新应用】4(原创)四自由度机械臂游戏开源的项目 【轩辕剑法 ---乾甲申式 】 https://www.bilibili.com/video/BV19w411a7mF/?share_source=copy_web&vd_source=b5b305bec6cbccdfdaee2cf57cf341bc 谢谢!
  • 热度 7
    2021-2-18 11:15
    529 次阅读|
    0 个评论
    初始化外设 的 配置步骤: #1 打开时钟 打开外设时钟 打开相关GPIO时钟 打开DMA时钟         (若需要) #2 关联外设与GPIO 退出复位 配置外设与GPIO相关联 #3 配置GPIO工作模式  #4 配置外设工作模式 退出复位 设置工作模式的各项参数 #5 配置DMA工作模式        (若需要) 退出复位 设置工作模式的各项参数 #6 中断配置            (若需要) 设置中断分组        (若需要)   设置中断入口及优先级   打开中断类型         使能外设自身中断    (接收 / 发射...) 使能DMA中断      (若需要) #7 使能DMA #8 打开外设DMA请求       (接收 / 发射) #9 使能外设 --------------------------------------------------------------------------------------- 关闭外设 的 步骤:    #1 关闭DMA中断 #2 关闭DMA #3 关闭外设DMA请求 #4 关闭外设中断 #5 关闭外设 ----------------------------------------------------------------------------- 初始化外设 的 配置步骤另外可参考以下: 1.外设配置顺序 RCC时钟→GPIO→其他外设 2.外设具体配置过程 ①配置函数首先声明PPP_InitTypeDef结构体变量。 例:GPIO_InitTypeDef GPIO_InitStructure; ②为定义的结构体变量设置需要的值。 设置变量中所有的值:PPP_InitStructure.member1 = value1;PPP_InitStructure.member2 = value2;... OR: 定义时直接赋值:PPP_InitTypeDef PPP_InitStructure = {value1,value2,value3....}; 设置变量中部分值:PPP_StructInit(&PPP_InitStructure);//先对结构体变量进行初始化 PPP_InitStructure.member1 = value1;PPP_InitStructure.member2 = value2;... ③在设置一个外设前,必须调用一下一个函数来使能它的时钟。 根据不同的外设,选择不同的BUS时钟,具体可查考参考手册中的时钟树。 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx,ENABLE); ④调用PPP_Init(PPP,&PPP_InitStructure)进行外设初始化。//PPP_DeInit()功能和PPP_Init(PPP)相反,将寄存器复位为缺省值。 ⑤PPP_Cmd(PPP,ENABLE);将外设使能。 3.头文件的一般结构 ①开头注释:文件名、描述、作者、版本、日期; /******************************************* * 文件:xxx.h * 说明:干什么用的 * 作者:xxx * 版本:v1.0 * 日期:year/month/day ********************************************/ ②预处理:预包含、宏定义 # ifndef __xxxx_h # define __xxxx_h # include "xxxx.h" # define ABC_DEC FGHIGK # endif ③函数声明。 void USARTtoUSB_CONFIG ( void ) ; uint16_t ABC_CALCULATE ( uint16_t , uint16_t ) ; 4.源函数的一般结构 ①开头注释:文件名、描述、作者、版本、日期; ②头文件包含; ③全局变量定义,源文件函数声明(注意:一般不要在头文件声明,否则编译会出现重定义错误) uint16_t xxxValue = 0 ; //变量初始化 extern uint32_t StateofXXX; //变量来自外部引用,不能赋初值 char xString = "I love xxx" ; //字符串变量 ④具体函数体。
  • 热度 17
    2012-4-25 10:07
    1723 次阅读|
    1 个评论
    苹果手机外围配件发展的今天,各种各样的配件层出不穷,如IPHONE Dock音响、IPHONE FM发射器、IPHONE  POS机等产品。 今天我要说的是:无线医疗方案。具体是在体重秤、脂肪仪、心率计、血压计等基本测试设备上添加苹果蓝牙模组,和苹果IPHONE或IPAD通讯,使每一次的测试数据保存起来,也可以通过WIFI或GPRS、3G网络上传到指定数据库,实现特定人群或社区保健的功能。
相关资源