当前位置: 首页 > news >正文

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

文章目录

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

在这里插入图片描述

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

相关文章:

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

文章目录&#x1f697; &#x1f697;Linux嵌入式开发 | 汇编驱动LED&#xff08;1&#xff09;&#x1f697; &#x1f697;初始化IO&#x1f697; &#x1f697;STM32&#x1f697; &#x1f697;使能GPIO时钟&#x1f697; &#x1f697;设置IO复用&#x1f697; &#x1f6…...

什么是EventLoop?怎么测试Node或页面的性能

Event Loop 机制大家应该都有了解。本文利用 EventLoop 去做一个有趣的检测node或页面性能的代码&#xff0c;顺便介绍了一下EventLoop&#xff0c;希望对大家有所帮助&#xff01; Event Loop Event Loop 机制大家应该都有了解。我先重复总结一下。 Node.js 和 Javascript 的…...

1018 锤子剪刀布 1025 反转链表

现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜算最大。 输入格式&#xff1a; 输入第 1 行给出正整数 N&#xff08;≤10 5 &#xff09;&#xff0c;即双方交锋的次数。随后 N 行&#xff0c;每行给出一次交锋的信…...

卷积神经网络的原理及实现

专栏&#xff1a;神经网络复现目录 卷积神经网络 本章介绍的卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位&#xff0c;当今…...

【C++知识点】重载

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…...

apscheduler三种定时触发方式

#第一种# date: 特定的时间点触发# 2019-01-01 00:00:00 准时执行# import time # from apscheduler.schedulers.blocking import BlockingScheduler # # def my_job(): # print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(time.time()))) # sched BlockingSchedu…...

802.11 service服务类型

802.11 serviceservice定义service分类按照模块分为两类按照功能分为六类数据传输相关服务分布式服务DS&#xff08;Distribution Service&#xff09;整合服务IS&#xff08;Integration Service&#xff09;关联&#xff08;association&#xff09;重关联&#xff08;reasso…...

pytest测试框架——allure报告

文章目录一、allure的介绍二、allure的运行方式三、allure报告的生成方式一、在线报告、会直接打开默认浏览器展示当前报告方式二、静态资源文件报告&#xff08;带index.html、css、js等文件&#xff09;&#xff0c;需要将报告布置到web服务器上。四、allure中装饰器1、实现给…...

SQLI-Labs(3)8-14关【布尔盲注和时间盲注】

目录 第八关 第九关&#xff1a; 第十关 第十一关 第十二关 第十三关 第十四关 第八关 我们用测试语句来测试是否为注入点 从上图中得知存在注入点&#xff0c;那么接下来就是爆列 一共有三列&#xff0c;接下来用union select 和报错注入都试一下发现没有回显点&…...

ESP32学习笔记03-日志打印

ESP32日志 日志分为5个等级 ESP_LOGE - error (lowest)ESP_LOGW - warningESP_LOGI - infoESP_LOGD - debugESP_LOGV - verbose (highest)API 0.头文件 #include "esp_log.h"1.给一个日志标签设置等级...

mongoTemplate非string类型模糊查询

需求 为方便使用人员对任务Task的搜索&#xff0c;需要根据number实现模糊搜索。 背景 之前设计的number是long类型&#xff0c;但是mongodb只支持string类型的正则匹配。 方案 修改number为string类型&#xff1b;新增一个冗余字段&#xff0c;用于模糊查询&#xff1b;在…...

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...

到底什么才是幻读?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

RPC重试机制和控制方案

重试机制 因为网络抖动等原因导致 RPC 调用失败&#xff0c;这时候使用重试机制可以提高请求的最终成功率&#xff0c;减少故障影响&#xff0c;让系统运行更稳定。 重试简易实现方案 在重试的过程中&#xff0c;为了能够在约定的时间内进行安全可靠地重试&#xff0c;在每次…...

【无标题】动态给结构体赋值

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int id; char name[20]; double score; } Student; int main() { Student *p (Student *)malloc(sizeof(Student)); if (p NULL) { printf(“Memory allocation failed.”…...

centos7 soft raid每周自动同步的问题

之前redhat老版本时也遇到过这样的问题https://blog.csdn.net/jolly10/article/details/108768360centos7解决的办法略有不同&#xff0c;记录一下&#xff1a;centos7默认是每周日凌晨1点进行raid检查&#xff0c;有点太频繁了[oracleqht117 data]$ ls /etc/cron*/etc/cron.de…...

嵌入式Linux内核代码风格

这是一个简短的文档&#xff0c;描述了linux内核的首选代码风格。代码风格是因人而异的&#xff0c;而且我 不愿意把我的观点强加给任何人&#xff0c;不过这里所讲述的是我必须要维护的代码所遵守的风格&#xff0c; 并且我也希望绝大多数其他代码也能遵守这个风格。请在写代码…...

Andorid:关于Binder几个面试问题

1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机&#xff0c;系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯&#xff0c;则需要使用到内核空间做载体&#xff0c;内核空间是所有进程共享…...

【剑指Offer-Java】包含min函数的栈?

题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。 MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min()…...

红队APT——邮件钓鱼攻击SwaksOffice漏洞RLO隐藏压缩释放

目录 (一)采用自己搭建Ewomail配合Swaks 0x01 搭建过程 0x02 配置转发信息 (二)网页钓鱼-克隆修改...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...