【裸机驱动LED】使用汇编代码驱动LED(一)—— 寄存器解析篇

news2024/11/26 14:30:56

为了后续使用C语言驱动LED,事先学习汇编代码驱动LED,有如下好处:

  • 熟悉一些基本的汇编语法
  • 了解驱动LED的基本流程
  • 了解驱动LED需要用到哪些寄存器
  • 作为一个初学者,可以锻炼自己阅读开发文档的能力

本文的主要目的是了解驱动LED的基本流程,以及要驱动LED需要使用哪些寄存器。


目录

一、驱动LED的基本流程

二、寄存器设置

1、时钟源初始化(CCGRx)

2、设置IO复用(IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03)

3、初始化GPIO(IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03)

4、GPIO 输出(GPIOx_GDIR、GPIOx_DR)


一、驱动LED的基本流程

stm32驱动LED的基本流程为:

  • 使能指定GPIO时钟
  • 设置IO复用,将其复用为GPIO。(GPIO只是IO众多功能的一种)
  • 初始化GPIO。即设置电气属性,比如设置输入还是输出、上下拉、速度等
  • 设置 GPIO 输出高电平还是低电平。

但是 imx6ull 驱动LED的过程是否也是如此呢?我们需要查看《IMX6ULL参考手册》的第28章 GPIO,虽然只有三步,这是因为把 stm32 的最后两点合并为了一步。

因此,对于 imx6ull 我们驱动 LED 可以采取和stm32一样的步骤

二、寄存器设置

接下来我们将针对每一步,详细了解寄存器的设置方法。

1、时钟源初始化(CCGRx)

led灯闪烁,说白了就是高低电平的转换,但是每隔多久转换一次,这就需要时钟来控制了。按照《IMX6ULL参考手册》的提示,我们要去第18章CCM了解时钟源的初始化。不同模块对应的时钟源是不一样的,我们可以在 18.4 找到GPIO模块对应的时钟源。

从下图我们可以看到,GPIO模块的时钟源使能由寄存器 CCGRx 控制,GPIO模块有 5 组。CCGR1 寄存器的 CG13(即第27-16 bit)控制着 GPIO1 的时钟源。(其他类似)

 现在有两种做法,一种是只初始化某一个 GPIOx 的时钟,即只初始化某一个 CCGRx 寄存器。实际上不同时钟源要改的引脚都不一样,这样很是麻烦。

因此,我们采用另一种做法,索性初始化所有时钟源 (CCGR0~6) 的所有模块(CG0~15,即引脚 0-32)。(可以在参考手册的18.6.25 找到每个时钟源CCGRx对应的基地址)

时钟源(寄存器): CCGR0
起始地址: 0x20C4068
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR1
起始地址: 0x20C406C    # 一个时钟源占32bit,即4字节(0x20C406C - 0x20C4068 = 4)
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR2
起始地址: 0x20C4070
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR3
起始地址: 0x20C4074
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR4
起始地址: 0x20C4078
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR5
起始地址: 0x20C407C
初始化值:0xFFFFFFFF

时钟源(寄存器): CCGR6
起始地址: 0x20C4080
初始化值:0xFFFFFFFF

2、设置IO复用(IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

绕了这么一大圈,终于可以回到 28.4 小节了。接下来我们要指定 IO 引脚为GPIO功能,由28.4.3给的提示可以知道,要设为 GPIO 模式,我们要设置的是 IOMUXC 寄存器。所以我们要前往第32章 IOMUX。

我们可以看到第32章下有一小节为IOMUXC Memory,IOMUXC下有很多寄存器,这些寄存器分为了两类:

  • 第一类 IOMUXC_SW_MUX_CTL_PAD_<module name>:用于设置对应模块的IO复用
  • 第二类 IOMUXC_SW_PAD_CTL_PAD_<module name>:用于初始化对应模块,即设置电气属性。

我们现在要设置的是IO复用,那自然就要找跟GPIO相关的

从这里你会发现,这里只有GPIO1 可以设置IO复用,下面要确定的就是GPIO1 中的第几个引脚,连接着 LED。我们先在《imx6ull 底板原理图》上找到 LED 模块,底板上LED名称为 LED0。 

然后我们在《核心板原理图》上找一下 LED0 连到了核心板的哪个引脚。我们发现是 GPIO_3,那么这里就表示的是 GPIO1_3,即 GPIO1 的第3个引脚。

我们在第32章的IOMUX下找到后缀为 GPIO1_IO03 的寄存器,我们只需要设置 MUX_MODE 字段,设置为 0101,其他字段保持不变。

由此可以总结得到

寄存器: IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
基地址: 0x20E0068
初始化值: 0x5    # 低四位为0101,其他位不变

3、初始化GPIO(IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03

上一步其实已经公布了接下来要做啥,没错,找到前缀为 IOMUXC_SW_PAD_CTL_PAD 而且跟GPIO相关的寄存器。(这个比较难找,在32.6.156,大概在1793页)接下来我们要逐一设置寄存器中的每一个字段。

0:SRE,表示电压转换速率,我们选择低转换速率,即设为 0

2-1:保留位

5-3:DSE,表示驱动能力,我们选择 R0/6,即设为 110

 7-6:SPEED,表示速度。我们选择100M,即设为10

10-8:保留位

11:ODE,表示是否关闭开路输出,这里选择关闭,设为 0

12:PKE,pull / keeper 使能,这里选择打开,设为 1

13:PUE,选择 keeper功能,设为 0

15–14:PUS,选择上下拉,默认下拉,设为 00 

16:HYS,禁用,设为 0(该字段用的比较少)

31-17:保留位

寄存器: IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
基地址: 0x020E02F4
初始值: 0x10B0

4、GPIO 输出(GPIOx_GDIR、GPIOx_DR

 我们回到第28章,GPIO一共有五组,每一组都有8个寄存器,每个寄存器对应着不同的功能(属性)。但是实际上我们只需要设置其中两个寄存器,即 GPIOx_DR 和 GPIOx_GDIR。

  • GPIOx_DR数据寄存器用于输出或者读取数据,比如GPIO设置为输出,我们就可以使用该寄存器来让引脚输出高电平或者低电平。
  • GPIOx_GDIR方向寄存器用于设置GPIO是输入还是输出。如果是输入,我们就可以从 GPIOx_DR 寄存器读取内容;如果是输出,我们就需要向 GPIOx_DR 寄存器输出内容。
  • PSRGPIO状态寄存器读取相应的位即可获取对应的 GPIO 的状态。
  • ICR1、ICR2中断寄存器用来配置中断的触发方式(上升沿触发、下降沿触发),ICR1 用于 IO0~15 的配置, ICR2 用于 IO16~31 的配置。
  • IMR:中断使能寄存器。用于控制中断的使能和禁止。
  • ISR:中断状态寄存器。
  • EDGE_SEL:设置边缘中断。这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一 个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 是上升沿和下降 沿(双边沿)触发

寄存器: GPIO1_GDIR
基地址: 0x209C004
初始值: 0x00000008    # 因为是GPIO1的第三个引脚设为输出,即第3 bit应为1(00001000)

寄存器: GPIO1_DR
基地址: 0x209C000
初始值: 0

LED0输出低电平的时候,二极管导通,此时灯会亮,所以寄存器 DR 的初始值应该为 0

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

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

相关文章

【手撕Spring源码】SpringBoot启动过程中发生了什么?

文章目录 SpringBoot启动过程启动详解启动演示启动过程总结 SpringBoot启动过程 启动详解 SpringBoot的启动分为两个部分&#xff1a; 构造SpringApplication执行run方法 接下来我们先来看看构造方法里面都做了什么事情。 第一步&#xff1a;记录 BeanDefinition 源 大家知…

Jenkins配置邮件通知+钉钉通知,任务构建状态随时掌握

1.前言 Hello&#xff0c;各位小伙伴&#xff0c;大家好&#xff01;&#xff01;&#xff01; 在前面的文章中&#xff0c;我们实现了用Maven项目任务和Pipeline流水线任务来完成对项目的自动化部署。 DockerJenkinsGitee自动化部署maven项目 DockerJenkinsGiteePipeline部…

0001欧几里得算法

首先我们先了解欧几里得这个人。俗话说&#xff1a;不了解一个人&#xff0c;很难走进他的思想。欧几里得是约公元前330年~公元前275年的古希腊数学家&#xff0c;被称为“几何之父”。《几何原本》就是他的著作。而欧几里得算法是《几何原本》中的一个用于求两个数的最大公约数…

以AI为灯,照亮医疗放射防护监管盲区

相信绝大部分人都有在医院拍X光片的经历&#xff0c;它能够让医生更方便快速地找出潜在问题&#xff0c;判断病人健康状况&#xff0c;是医疗诊断过程中的常见检查方式。但同时X射线也是一把双刃剑&#xff0c;它的照射量可在体内累积&#xff0c;对人体血液白细胞有杀伤力&…

mysql加索引,数据库卡死

公司的一个内部项目&#xff0c;由于突然导入了几十万的数据&#xff0c;数据量翻了一倍&#xff0c;导致了某个页面打开很慢。通过sql日志看到主要是由于慢查询引起的&#xff0c;通过explain这个sql&#xff0c;发现主要是由于这个SQL没有命中索引&#xff0c;进行了全表扫描…

原型模式的用法

文章目录 一、原型模式的用法1.1 介绍1.2 结构1.3 原型模式类图1.4 实现1.4.1 克隆的分类1.4.2 代码 1.5 "三好学生"奖状案例1.5.1 "三好学生"奖状类图1.5.2 代码 1.6 深、浅克隆的区分1.6.1 浅克隆1.6.2 深克隆 一、原型模式的用法 1.1 介绍 用一个已经…

STL(结)

STL&#xff08;结&#xff09; map存储结构基本操作equal_range遍历方式 插入 multimapsetunordered_mapmap和无序map的异同mapunordered_map map 存储结构 map容器的底层存储是一个红黑树&#xff0c;遍历方式都是按照中序遍历的方式进行的。 int main() {std::map<int…

数组降维

写一个函数&#xff0c;打印数组内的内容&#xff0c;代码为&#xff1a; #include<stdio.h>void show_arr(int arr[], int num) {int i 0;for (i 0; i < num; i){printf("%d ", arr[i]);}printf("\n"); } int main() {int arr[] { 1,2,3,4,5…

Servlet Cookie基本概念和使用方法

目录 Cookie 介绍 Cookie 主要有两种类型&#xff1a;会话 Cookie 和持久 Cookie。 Cookie使用步骤 使用Servlet和Cookie实现客户端存储的登录功能示例&#xff1a; LoginServlet类 index.jsp 删除Cookie 浏览器中查看Cookie的方法 Cookie 介绍 Cookie 是一种在网站和…

win10下载安装mysql8.0版本

打开官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/ 下载完成后解压&#xff0c;这里我是直接放在C盘 然后打开mysql目录文件夹新建my.ini文件,my.ini文件内容如下&#xff0c;需要修改两个地方&#xff0c;其中datadir你自己的mysql的安装目录&#xff0c;data…

如何在线压缩png图片?png压缩图片大小的方法介绍

压缩PNG图片大小的优点 随着数字化时代的发展&#xff0c;PNG格式已成为一种常见的图片格式。然而&#xff0c;由于高分辨率、高色深等原因&#xff0c;PNG图片通常具有较大的文件体积&#xff0c;导致在传输、存储和网页加载等方面会产生不必要的负担。因此&#xff0c;对于需…

ai绘画生成古风场景怎么弄?告诉你怎么ai绘画

随着人工智能技术的不断发展&#xff0c;ai绘画已经成为一个令人着迷的领域。一些软件利用深度学习算法和生成对抗网络等技术&#xff0c;能够帮助艺术家和爱好者创造出令人惊叹的艺术作品。今天我就来跟大家分享一下如何一键ai绘画&#xff0c;感兴趣的朋友就跟我一起看下去吧…

《文体用品与科技》期刊简介及投稿要求

《文体用品与科技》期刊简介&#xff1a; 主管单位&#xff1a;中国轻工业联合会 主办单位&#xff1a;中国文教体育用品协会、全国文教体育用品信息中心、北京市文教体育用品研究所 国际刊号&#xff1a; ISSN1006-8902 国内刊号;CN:11-3762/TS 邮发代号;82-21932 发表周…

DDR跑不到速率后续来了,相邻层串扰深度分析!

高速先生成员&#xff1a;黄刚 就在刚刚&#xff0c;雷豹把他对叠层的调整方式和改善后的仿真结果给师傅Chris看完后&#xff0c;Chris给雷豹点了个大大的赞&#xff0c;因为优化的方式其实不需要大改DDR的走线&#xff0c;只需要把相邻层的信号最大限度的拉开&#xff0c;同时…

如何定位分析视频异常画面

背景 视频典型画面不正常主要包含画面卡顿、画面模糊、画面不显示、画面花屏这 4 类问题。本文主要介绍的是画面花屏的情况&#xff0c;这里的画面花屏包含了花屏、闪屏、绿屏、黑屏。视频花屏是多媒体工程师最常见的问题之一&#xff0c;也是最棘手的问题之一&#xff0c;笔者…

有什么可靠稳定的微信管理系统?

微信管理系统是什么 微信管理系统从字面上来说可以理解为微信的管理和营销系统。通俗一点来说就是利用微信与管理营销相结合的一种新型办公方式。 不用下载任何软件&#xff0c;不用多部手机&#xff0c;对手机没有任何型号要求&#xff0c;不需要刷机、越狱&#xff0c;不需…

政务APP小程序开发 畅享全新政府办事体验

现在很多政府机构打着便民的口号&#xff0c;但其实生活中很多时候去政府机构办事都很费时间&#xff0c;周末节假日不上班没法办理&#xff0c;工作日去人多排长队不说&#xff0c;往往排到自己了又因为资料不全、手续不齐&#xff0c;无法证明自己等奇葩原因不得不一次次被拒…

boost 搜索引擎

boost搜索引擎 01 项目演示 done 02 讲解思路 03 项目背景 公司&#xff1a;百度、搜狗、360搜索、头条新闻客户端 - 我们自己实现是不可能的&#xff01; 站内搜索&#xff1a;搜索的数据更垂直&#xff0c;数据量其实更小 boost的官网是没有站内搜索的&#xff0c;需要…

家乡乐山美食网站系统(含源码+数据库)

1.需求分析 将进行家乡乐山美食网站的需求分析。需求分析是系统开发过程中的一项重要工作&#xff0c;它是对用户需求进行深入研究和分析&#xff0c;明确系统的功能、性能、界面等方面的需求&#xff0c;为后续的设计和开发提供依据。 首先&#xff0c;需要明确该网站的主要目…

成为一个优秀的测试工程师需要具备哪些知识和经验?

目录 前言&#xff1a;  1、我们先来讲第一点&#xff0c;由单纯的测试变成项目质量保证工作 2、持续集成探索和自动化测试技术研究 3、测试相关工具的开发 总结忠告 前言&#xff1a;  本人7年测试经验&#xff0c;在学测试之前对电脑的认知也就只限于上个网&#xff0c;…