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

news2024/9/21 4:35:25

文章目录

  • 🚗 🚗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表示输出低电平。

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.5多线程

一.线程的状态1.NEW安排了工作,还未开始行动把Thread对象创建好了,但是还没有调用startjava内部搞出来的状态,与PCB的状态没什么关系2.TERMINATED工作完成了操作系统的线程执行完毕,销毁了,但是Thread对象还在,获取的对象3.RUNNABLE可以工作的,又可以分为正在工作中和即将开始工…

聊聊内存那些事(基于单片机系统)

单片机的RAM和ROM单片机的ROM&#xff0c;叫只读程序存储器&#xff0c;是FLASH存储器构成的&#xff0c;如U盘就是FLASH存储器。所以&#xff0c;FLASH和ROM是同义的。单片机的程序&#xff0c;就是写到FLASH中了。而RAM是随机读/写存储器&#xff0c;用作数据存储器&#xff…

SpringBoot笔记(一)入门使用

一、为什么用SpringBootSpringBoot优点创建独立Spring应用内嵌web服务器自动starter依赖&#xff0c;简化构建配置自动配置Spring以及第三方功能提供生产级别的监控、健康检查及外部化配置无代码生成、无需编写XMLSpringBoot缺点人称版本帝&#xff0c;迭代快&#xff0c;需要时…

电路基础(1)电路模型和电路定律

电路中的电压、电流之间具有两种约束&#xff0c;一种是由电路元件决定的元件约束&#xff1b;另一种是元件间连接而引入的几何约束&#xff08;就是拓扑约束&#xff09;&#xff0c;后者由基尔霍夫定律来表达。基尔霍夫定律是集总参数电路的基本定律。 1.电路和电路模型电源又…

电路模型和电路定律(2)——“电路分析”

各位CSDN的uu们你们好呀&#xff0c;好久没有更新电路分析的文章啦&#xff0c;今天来小小复习一波&#xff0c;之前那篇博客&#xff0c;小雅兰更新了电路的历史以及电压电流的参考方向&#xff0c;这篇博客小雅兰继续&#xff01;&#xff01;&#xff01; 电阻元件 电压源和…

FFMPEG 安装教程windowslinux(CentOS版)

ps: 从笔记中迁移至blog 版本概述 Windows 基于win10 Linux 基于CentOS 7.6 一.Windows安装笔记 1.下载安装 https://ffmpeg.org/download.html 2 解压缩&#xff0c;拷贝到需要目录&#xff0c;重命名 3 追加环境变量 echo %PATH%setx /m PATH "%PATH%;F:\dev_tools\…

用C/C++制作一个简单的俄罗斯方块小游戏

用C/C制作一个简单的俄罗斯方块小游戏 用C/C制作一个简单的俄罗斯方块小游戏 0 准备1 游戏界面设计 1.1 界面布局1.2 用 EasyX 显示界面1.3 音乐播放 2 方块设计 2.1 方块显示2.2 随机生成一个方块2.3 方块记录 3 方块移动和旋转 3.1 方块的移动3.2 方块的旋转3.3 方块的碰撞和…

基于 WebSocket、Spring Boot 教你实现“QQ聊天功能”的底层简易demo

目录 前言 一、分析 1.1、qq聊天功能分析 1.2、WebSocket介绍 1.2.1、什么是消息推送呢&#xff1f; 1.2.2、原理解析 1.2.3、报文格式 二、简易demo 2.1、后端实现 2.1.1、引入依赖 2.1.2、继承TextWebSocketHandler 2.1.3、实现 WebSocketConfigurer 接口 2.2、…

LeetCode096不同的二叉搜索树(相关话题:卡特兰数)

目录 题目描述 解题思路 代码实现 进出栈序列理解卡特兰数分析策略 相关知识 参考文章 题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; …

《程序员面试金典(第6版)》面试题 02.07. 链表相交

题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果…

socket本地多进程通信基本使用方法和示例

目录 前言&#xff1a; socket是什么 socket基本原理框图 socket基本函数 1 socket() 函数 2 bind()函数 3 connect()函数 4 listen() 函数 5 accept() 函数 6 read() write() send() recv()函数 7 close()函数 8 字节序转换&#xff08;hton&#xff09; 示例代码 …

使用 Pulumi 打造自己的多云管理平台

前言在公有云技术与产品飞速发展的时代&#xff0c;业务对于其自身的可用性提出了越来越高的要求&#xff0c;当跨区域容灾已经无法满足业务需求的情况下&#xff0c;我们通常会考虑多云部署我们的业务平台&#xff0c;以规避更大规模的风险。但在多云平台部署的架构下&#xf…

埃安自研版图扩至夸克电驱,动力研发团队已超1000人

埃安的三电自研版图正在扩大。3月3日&#xff0c;广汽集团旗下埃安发布了一项名为“夸克电驱”的技术产品&#xff0c;相比主流电驱体积减少一倍&#xff0c;同时电机功率密度比主流电驱增加了一倍。此前&#xff0c;比亚迪刚刚发布易四方动力系统&#xff0c;特斯拉也在投资者…

HTML常见标签

文章目录一、HTML基础标签注释标签标题标签段落标签换行标签格式化标签图片、音频、视频标签超链接标签列表标签表格标签布局标签表单标签表单标签概述form标签属性表单项标签综合案例一、HTML基础标签 基础标签就是和文字相关的标签 标签描述<h1> ~ <h6>定义标题…

【项目管理】晋升为领导后,如何开展工作?

兵随将转&#xff0c;作为管理者&#xff0c;你可以不知道下属的短处&#xff0c;却不能不知道下属的长处。晋升为领导后&#xff0c;如何开展工作呢&#xff1f; 金九银十&#xff0c;此期间换工作的人不在少数。有几位朋友最近都换了公司&#xff0c;职位得到晋升&#xff0c…

前端——1.相关概念

这篇文章主要介绍前端入门的相关概念 1.网页 1.1什么是网页&#xff1f; 网站&#xff1a;是指在因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合 网页&#xff1a;是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要…

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…

C++笔记之lambda表达式

引言 Lambda表达式是从C 11版本引入的特性&#xff0c;利用它可以很方便的定义匿名函数对象&#xff0c;通常作为回调函数来使用。大家会经常拿它和函数指针&#xff0c;函数符放在一起比较&#xff0c;很多场合下&#xff0c;它们三者都可以替换着用。 语法 [ captures ] (…

javaScript基础面试题 ---宏任务微任务

宏任务微任务一、为什么JS是单线程语言&#xff1f;二、JS是单线程&#xff0c;怎样执行异步代码&#xff1f;1、JS是单线程语言 2、JS代码执行流程&#xff0c;同步执行完&#xff0c;再进行事件循环&#xff08;微任务、宏任务&#xff09; 3、清空所有的微任务&#xff0c;再…

机器学习100天(四十):040 线性支持向量机-公式推导

《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:线性支持向量机-公式推导! 首先来看这样一个问题,在二维平面上需要找到一条直线划分正类和负类。 我们找到了 A、B、C 三条直线。这三条直线都能正确分类所有训练样本。但是,哪条直线最好呢?直观上来看,我…