Linux嵌入式开发 | 汇编驱动LED(1)
创始人
2024-05-29 05:33:30
0

文章目录

  • 🚗 🚗Linux嵌入式开发 | 汇编驱动LED(1)
    • 🚗 🚗初始化IO
      • 🚗 🚗STM32
        • 🚗 🚗使能GPIO时钟
        • 🚗 🚗设置IO复用
        • 🚗 🚗配置GPIO
        • 🚗 🚗使用GPIO
      • 🚗 🚗I.MX6ULL
        • 🚗 🚗使能GPIO时钟
        • 🚗 🚗设置IO复用
        • 🚗 🚗配置GPIO
        • 🚗 🚗配置GPIO功能

🚗 🚗Linux嵌入式开发 | 汇编驱动LED(1)

🚀🚀之前我们一直都是在介绍Linux的使用,接下来就开始进入真正的Linux嵌入式开发了,我们的第一个实验就是来使用汇编代码来驱动我们的LED灯,相信很多人不太理解,为什么需要使用汇编代码来操控LED灯,之前不管是51还是STM32都没有使用过汇编呀?确实,我们在之前都是使C语言来控制我们的IO的,那是因为汇编代码已经有人帮你写好了,但是现在我们使用Linux,就需要我们自己去写我们的汇编代码了,那么这些汇编代码有什么用呢?我们简单概述一下。

  1. 🚀🚀需要用汇编去初始化一些SOC外设。
  2. 🚀🚀使用汇编去初始化DDR。
  3. 🚀🚀设置SP指针,一般指向DDR,主要作用就是去设置好C语言运行环境。

🚗 🚗初始化IO

🚀🚀要点灯,其实也就是控制我们的GPIO,所以初始化IO就是我们的第一步,在讲解I.MX6ULL初始化IO之前,我们先来复习一下STM32是如何进行初始化IO的。

🚗 🚗STM32

🚀🚀对于STM32的部分我们不会进行详细的介绍,有兴趣的同学可以去看我的STM32笔记。

🚗 🚗使能GPIO时钟

🚀🚀我们首先需要做的就是去使能我们的时钟,具体的代码如下所示:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);   // 使能GPIO时钟

🚗 🚗设置IO复用

🚀🚀然后我们就需要把IO复用为GPIO,具体代码如下所示:

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       //复用功能

🚗 🚗配置GPIO

🚀🚀接下来就是对于GPIO进行配置了,主要就是一些电气属性,具体代码如下所示;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_10; // LED0和LED1的引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;     // 输出速度选择50HZ
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         // 推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;           // 选择上拉模式

🚗 🚗使用GPIO

🚀🚀最后我们就可以开心愉快地使用GPIO去点灯了。

🚀🚀但是I.MX6ULL的初始化IO就没这么简单了,我们接下来就来看一看I.MX6ULL是怎么去初始化的吧!

🚗 🚗I.MX6ULL

🚀🚀对于我们现在的I.MX6ULL,其实还是有一部分与STM32类似的,我们来重点介绍一下。

🚗 🚗使能GPIO时钟

🚀🚀和32一样,我们也需要去初始化时钟,在I.MX6ULL里面,CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。我们来看一下CCM_CCGR0 结构:

在这里插入图片描述

🚀🚀CCM_CCGR0 是个 32 位寄存器,其中每 2 位控制一个外设的时钟,比如 bit31:30 控制着 GPIO2 的外设时钟,两个位就有 4 种操作方式,而不同的值代表着不同的涵义,所以我们可以按照我们的需求去进行配置。

位设置时钟控制
00所有模式下都关闭外设时钟。
01只有在运行模式下打开外设时钟,等待模式和停止模式下均关闭外设时钟。
10未使用(保留)。
11除了停止模式以外,其他所有模式下时钟都打开。

🚀🚀比如我们需要使能GPIO2的时钟,我们只需要设置 CCM_CCGR0 的 bit31 和 bit30 都为 1 即可,代码如下所示:

 CCM_CCGR0 = 3 << 30

🚗 🚗设置IO复用

🚀🚀对于IO复用,我们先找到寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的介绍,然后看一下,如果我们需要复用为GPIO3的话,我们就应该将MUX_MODE设置为5,也就是将寄存器的bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO。

在这里插入图片描述

🚗 🚗配置GPIO

🚀🚀接下来我们可以去找到寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的介绍,这个寄存器主要是用来设置GPIO1_IO03的电气属性的,包括压摆率、速度、驱动能力、开漏、上下拉等。

在这里插入图片描述

🚀🚀我们接下来详细介绍一下各个位大致是做上什么的。


🚀🚀SRE(bit0):设置压摆率,当此位为 0 的时候是低压摆率,当为 1 的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间,比如从 0 到 1 需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。

🚀🚀DSE(bit5:3):当 IO 用作输出的时候用来设置 IO 的驱动能力, 总共有 8 个可选选项,如下所示:

位设置速度
000输出驱动关闭
001R0(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的时候是 240Ω)
010R0/2
011R0/3
100R0/4
101R0/5
110R0/6
111R0/7

🚀🚀SPEED(bit7:6):当 IO 用作输出的时候,此位用来设置 IO 速度,设置如下所示:

位设置速度
00低速 50M
01中速 100M
10中速 100M
11最大速度 200M

🚀🚀ODE(bit11):当 IO 作为输出的时候,此位用来禁止或者使能开路输出,此位为 0 的时候禁止开路输出,当此位为 1 的时候就使能开路输出功能。

🚀🚀PKE(bit12):此位用来使能或者禁止上下拉/状态保持器功能,为 0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。

🚀🚀PUE(bit13):当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。当为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。状态保持器在 IO 作为输入的时候才有用,也就是当外部电路断电以后此 IO 口可以保持住以前的状态。

🚀🚀PUS(bit15:14):用来设置上下拉电阻的,一共有四种选项可以选择,如下所示:

位设置含义
00100K 下拉
0147K 上拉
10100K 上拉
1122K 上拉

🚀🚀HYS(bit16):对应图 8.1.4.2 中 HYS,用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器。

🚗 🚗配置GPIO功能

🚀🚀与32不同的是,我们还需要进行配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

在这里插入图片描述

🚀🚀好了,原理部分我们就先介绍这么多,到时候我们会分析具体的实现原理。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...