树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

这篇具有很好参考价值的文章主要介绍了树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册

一、寄存器的介绍

芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的。Description是寄存器的功能描述。GPFSEL0(寄存器名) GPIO Function Select 0(功能选择:输入或输出);GPSET0 (寄存器名) GPIO Pin Output Set 0(将IO口置0);GPSET1(寄存器名) GPIO Pin Output Set 1(将IO口置1);GPCLR0(寄存器名) GPIO Pin Output Clear 0 (清0)下图的地址是:总线地址(并不是真正的物理地址)
树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

GPFSEL0是pin0 ~ pin9的配置寄存器,GPFSEL1是pin10 ~ pin19的配置寄存器,以此类推,GPFSEL5就是pin50~pin53的配置寄存器。

字段名 描述 用法
GPFSEL0 GPIO Function select 0,功能选择输出/输入 以引脚9举例:000 = GPIO Pin 9 is an input,001 = GPIO Pin 9 is an output
GPSET0 GPIO Pin output Set 0,输出0 0 = No effect ,1 = Set GPIO pin n
GPSET1 GPIO Pin output set 1,输出1 0 = No effect ,1 = Set GPIO pin n
GPCLR0 GPIO Pin output clear 0,清0 0 = No effect ,1 = Clear GPIO pin n

在上面的文档里已经说的很清楚了,000是引脚输入,而001则是引脚输出,在这里要注意每个寄存器都是32位的

  • FSELn表示GPIOn,下图给出第九个引脚的功能选择示例,对寄存器的29-27进行配置,进而设置相应的功能。根据图片下方的register
    0表示0~9使用的是register 0(即GPFSEL0)这个寄存器。

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

  • 输出集寄存器用于设置GPIO管脚。SET{n}字段定义,分别对GPIO引脚进行设置,将“0”写入字段没有作用。如果GPIO管脚为在输入(默认情况下)中使用,那么SET{n}字段中的值将被忽略。然而,如果引脚随后被定义为输出,那么位将被设置根据上次的设置/清除操作。分离集和明确功能取消对读-修改-写操作的需要。GPSETn寄存器为了使IO口设置为1,set4位设置第四个引脚,也就是寄存器的第四位。
    树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
  • 输出清除寄存器用于清除GPIO管脚。CLR{n}字段定义要清除各自的GPIO引脚,向字段写入“0”没有作用。如果在输入(默认),然后在CLR{n}字段的值是忽略了。然而,如果引脚随后被定义为输出,那么位将被定义为输出根据上次的设置/清除操作进行设置。分隔集与清函数消除了读-修改-写操作的需要。GPCLRn是清零功能寄存器。
    树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
    树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

把pin4引脚配置为输出引脚:
FSEL4 14-12 001 我们把4引脚的14-12配置成001 GPIO Pin 4 is an output
详细操作:
只需要将GPFSL0这个寄存器的14~12位设置为001就可以了。只需要将0x6(对应的2进制是110)左移12位·然后取反再与上GPFSL0就可以将13、14这两位配置为0,然后再将0x6(对应2进制110)左移12位,然后或上GPFSL0即可将12位置1。

特别提示:进行取反后再进行按位与操作是为了不影响其他引脚

配置pin4引脚为输出引脚 bit 12-14 配置成001

31 30 ······14 13 12 11 10 9 8 7 6 5 4 3 2 1 
0  0  ······0  0  1  0  0  0 0 0 0 0 0 0 0 0 

 //配置pin4引脚为输出引脚      bit 12-14  配置成001  
  *GPFSEL0 &= ~(0x6 <<12); // 把bit13 、bit14置为0  
 //0x6是110  <<12左移12位 ~取反 &按位与
  *GPFSEL0 |= (0x1 <<12); //把12置为1   |按位或

忘了按位与和按位或的点这里

代码实现:

  *GPFSEL0 &=~(0x6 <<12); // 把13 、14置为0
  *GPFSEL0 |= (0x1 <<12); //把12置为1
  • 注意:我们配置的底层引脚对应得是BCM 寄存器第0组位FESL0–9, 这个就是在寄存器GPFSEL0里,寄存器已经分好组了
    寄存器第1组位FSEL10–19,这个在寄存器GPFSEL1里

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

更多的引脚对应的寄存器可以去树莓派官网进行查看
树莓派引脚查看官网
树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
在上图中我们可以点击对应的引脚编号,就可以查看到对应的引脚的相关的信息

二、寄存器的地址问题

我们在编写驱动程序的时候,IO口空间的起始地址是0x3f00 0000,加上GPIO的偏移量0x200 0000,所以GPIO的物理地址应该是0x3f20 0000开始的,然后在这个基础上进行Linux系统的MMU内存虚拟化管理,映射到虚拟地址上。
树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
上图的尾部偏移是对的,根据GPIO的物理地址0x3f20 0000可以知道:

GPFSEL0 0x3f20 0000 //IO口的初始的物理地址,而并不是手册里面的那个总线地址
GPSET0 0x3f20 001c  //地址通过查找芯片手册里面的对应的GPSET0 的总线地址的后两位决定是1c
GPCLR0 0x3f20 0028 //地址是查找GPCLR0在芯片手册里的总线地址确定的28,所以地址后两位是28
  • 在原来框架的基础上,添加寄存器的定义
volatile unsigned int* GPFSEL0 = NULL;
volatile unsigned int* GPSET0  = NULL;
volatile unsigned int* GPCLR0  = NULL;

完成以上代码需要搞清楚的几点

  1. 弄清楚寄存器的分组
    GPFSEL0是pin0 ~ pin9的配置寄存器,GPFSEL1是pin10 ~ pin19的配置寄存器,以此类推,GPFSEL5就是pin50~pin53的配置寄存器。这个由查阅芯片手册可以得知

  2. volatile关键字的使用(笔试可能会考)

  • 在此处的作用:防止编译器优化(可能是省略,也可能是更改)这些文章来源地址https://www.toymoban.com/news/detail-426920.html

到了这里,关于树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSS高级技巧导读

    1.1 为什么需要精灵图? 目的: 为了有效地减少服务器接收和发送请求的次数,提高页面的加载速度 核心原理: 将网页中的一些小背景图像整合到一张大图中,这样服务器只需要一次请求就可以了 1.2 精灵图的使用 使用精灵图核心: 1,精灵技术主要针对于背景图片使用,就

    2024年01月24日
    浏览(24)
  • 【数据手册】CH340G芯片使用介绍

    CH340是一系列USB总线适配器,它通过USB总线提供串行、并行或IrDA接口。CH340G集成电路提供通用的MODEM信号,允许将UART添加到计算机上,或将现有的UART设备转换为USB接口。 全速USB接口,兼容USB 2.0接口。 使用最小数量的外部组件:一个晶体管和至少四个电容器。 提供了一个虚

    2024年02月03日
    浏览(139)
  • 【数据手册】LM1117L3芯片的使用

    可调或固定输出 1A 输出电流 低损耗,在 1A 输出电流时最大电压为 1.3V 0.04% 的线路调节 0.2% 负载调节 100% 热极限燃烧 快速瞬态响应      LM1117系列正可调和固定调节器设计提供1A高电流效率。 所有内部电路设计为低至 1.3V 输入输出差。 片内微调将参考电压调整为 1% 高效线性

    2024年02月08日
    浏览(38)
  • W25Q128芯片手册精读

    之前写SPI通信的时候用到了W25Q128,其中对芯片手册的阅读我只写了我们所需要的的部分。 这篇博客就对这个芯片进行详细的阅读并记录,文章可能会比较长,但绝对是结合了自己的理解进行阐述。 芯片手册刚开始看的时候最大的拦路虎其实就是英文,看习惯了中文,直接看

    2024年02月07日
    浏览(41)
  • 【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

    目录 1.AlldataSheet 网站(建议使用) 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet(不建议使用) 5.半导小芯 (建议使用) 6.立创商城 (建议使用)         在做硬件的芯片选型、产品维修、知识学习时经常会需要查找芯片规格书。通过阅读芯片的数据手册,我们可以得出很多

    2024年02月02日
    浏览(55)
  • ES高级操作手册

     一、加快索引recovery速度 当ES扩容缩容时,若分片太大,分片初始化会很慢,此时可选择修改ES配置加快recovery速度。若是生产环境ES在对外提供服务,es默认配置也可能导致对外服务频繁抖动,也可以通过修改配置降低recovery速度。es默认限制了并行恢复的数量,速度等。 修

    2023年04月20日
    浏览(46)
  • 【hx717称重传感器采集芯片】双输入通道高精度 24 位模/数(A/D)转换器芯片(附芯片手册)

    以下是官方文档的简介 HX717A/B 采用了海芯科技专利技术,是一款专为高精度电子计量仪表而设计的 24 位 A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优

    2024年02月17日
    浏览(64)
  • 电路设计基础--MOS管驱动直流电机电路,看懂芯片手册

    本例以驱动继电器为例,来讲述相关电路设计,MOS管选型,以及看懂芯片手册。 D1作用是泄放继电器的反向电动势 24V继电器 电大负载25A/250VAC,线圈电阻640欧。 简单计算一下,流过线圈的电流为37.5mA。 这里有个背景知识,继电器的线圈为感性负载,在通电和断电的瞬间,会

    2024年02月10日
    浏览(40)
  • STM32L151C8T6 芯片数据手册

    2024年02月12日
    浏览(52)
  • Midjourney用户手册中文版详解模型、命令、参数与高级用法

    最近正在上手体验目前网上很火的 AI 绘画工具 Midjourney,在B 站上找了很多教程来看,现在基本可以上手用它生成很多好玩的图片了。 • Midjourney 入门教程:Midjourney零基础入门指南!小白轻松上手人工智能AI绘画 在逐渐深入使用 Midjourney 的过程中,我发现对很多命令、参数

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包