ARM裸机开发:汇编LED灯实验(I.MX6UL芯片)

2023-11-01 20:30

本文主要是介绍ARM裸机开发:汇编LED灯实验(I.MX6UL芯片),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ARM裸机开发:汇编LED灯实验(I.MX6UL芯片)
    • 一、I.MX6UL的GPIO原理
      • 1.1 I.MX6UL IO命名
      • 1.2 I.MX6UL IO复用
      • 1.3 I.MX6UL IO配置
      • 1.4 I.MX6UL GPIO配置
      • 1.5 I.MX6UL时钟使能
    • 二、开发板原理图
    • 三、程序编写
    • 四、编译下载
    • 五、实验现象

ARM裸机开发:汇编LED灯实验(I.MX6UL芯片)

一、I.MX6UL的GPIO原理

研究IMX6UL GPIO 原理前先回忆一下STM32GPIO配置流程,其主要分为4个步骤:

  1. 使能指定 GPIO 的时钟。
  2. 初始化 GPIO,如输出功能、上拉、速度等
  3. 是否开启 IO 复用将IO作为其它外设 引脚使用
  4. 设置初始输出的电平高低

下面我们学习 IMX6UL 的 GPIO 原理也是按照这样的流程来学习

1.1 I.MX6UL IO命名

学习前先了解一下 IMX 的命名方式,在以前学STM32时他的 IO 口是按照一组一组来命名的,如PA是一组,一组里面有16个 IO 口即 PA0-PA15;而在 IMX6UL里面命名方式则大不一样,I.MX6UL 的 IO 主要分为两类:SNVS 域IO和通用 IO

SNVC域 IO 命名: IOMUXC_SNVC_SW_MUX_CTL_PAD_XX_XX,后面的 XX_XX 就是 GPIO 命名, 比如:BOOT_MODE0 等等

通用 IO 命名: IOMUXC_SW_MUX_CTL_PAD_XX_XX,后面的 XX_XX 就是 GPIO 命名, 比如:GPIO1_IO01UART1_TX_DATAJTAG_MOD 等等

具体IO文档可以参考 IMX6UL 官方文档

1.2 I.MX6UL IO复用

IO 复用是通过一个寄存器来控制的,这里我以 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 为例子,翻阅手册可以看到一个 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01 的32位寄存器,寄存器如下:

20210827223755

可以看到寄存器的地址为 20E_005CH 低5位用于模式控制分为 SION 和 MUX_MODE,其他的则是保留位

MUX_MODE 的0到3位对应具体模式,具体有以下几个:

MUX_MODE复用模式
0000ALT0 复用为 IIC2_SCL
0001ALT1 复用为 GPT1_CAPTURE1
0010ALT2 复用为 ANATOP_OTG1_ID
0011ALT3 复用为 ENET1_REF_CLK1
0100ALT4 复用为 MQS_RIGHT
0101ALT5 复用为 GPIO1_IO00
0110ALT6 复用为 ENET1_1588_EVENT0_IN
0111ALT7 复用为 SRC_SYSTEM_RESET
1000ALT8 复用为 WDOG3_WDOG_B

SION 的控制功能如下:

SION功能
0IO输入路径按照复用的模式来
1IO输入路径强制按照GPIO1——IO00来

以上就是 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 的复用寄存器一个简单的介绍,不同的 IO 他的复用寄存器不完全相同,需要根据手册具体去查询

I.MX6U 的 GPIO 一共有 5 组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 其中 GPIO1 有 32 个 IO,GPIO2 有 22 个 IO,GPIO3 有 29 个 IO、GPIO4 有 29 个 IO,GPIO5 有 12 个 IO,一共有 124 个 GPIO

1.3 I.MX6UL IO配置

1.2 讲述的是 IO 口的复用配置寄存器,但 IO 的具体工作配置还有另外一个寄存器进行控制,继续以 GPIO1 组的 IO00 为例子;具体 IO 工作配置寄存器由 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 控制,该寄存器如下:

20210830213050

其不同位控制的 IO 配置功能不同,需要结合 IO 的工作原理图来理解,上 IO 原理图:

20210830213240

寄存器分析:

HYS(bit16): 对应图中 HYS,用来使能迟滞比较器,在 IO 输入时有效,可以用来对输入波形进行处理,关于迟滞比较器可以看这篇文章 : 迟滞比较器;HYS 为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器

PUS(bit15:14): 图中的 PUS,用来设置上下拉电阻的:

功能
00100k 下拉
0147k 上拉
10100k 上拉
1122k 上拉

PUE(bit13): 上图没有显示,当 IO 作为输入的时候,这个位用来设置 IO 是使用上下拉还是使用状态保持器。为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。

状态保持器在 IO 作为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住之前状态。

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

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

SPEED(bit7:6): 对应图中的 SPEED,当 IO 用作输出的时候,此位用来设置 IO 速度

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

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

(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的时候是 240Ω)

位设置速度
000输出驱动关闭
001R0 ****
010R0/2
011R0/3
100R0/4
101R0/5
110R0/6
111R0/7

SRE(bit0): 对应图中的 SRE,设置压摆率,当此位为 0 的时候是低压摆率,当为 1 的时候是高压摆率。

压摆率就是 IO 电平跳变所需要的时间,比如从 0 到 1 需要多少时 间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。高速信号压摆率要高,速度快;而要考虑电磁兼容性的话压摆率要低

压摆率参考文章:运放压摆率

1.4 I.MX6UL GPIO配置

1.2 和 1.3 讲了IO 的复用与功能寄存器配置,1.4 小节分析 IO 众多复用里面的一种 GPIO 的具体配置

首先看一下 GPIO 的结构图:

20210830222846

结构中可以看到 IOMUXC 里面有 SW_MUX_CTL_PAD_* 和 SW_PAD_CTL_PAD__* 两个寄存器用于配置 IO;而单独的 GPIO 配置则是另外 8 个 GPIO 自己的寄存器进行配置;

20210830223948

这 8 个寄存器介绍如下:

首先看 GPIOx_DR 数据寄存器,由翻译可以看到,DR 寄存器在 IO 的模式设置为 GPIO 且 GPIO 的输入输出方向确定好后,输出状态时 DR 寄存器里面的位可以控制 GPIO 的输出值,输入时则存储输入的状态值,通过读取可以获取 GPIO 状态,比如当 GPIO1_IO00 引脚接地,那么 GPIO1.DR 的 bit0 就是 0

20210830225058

GPIOx_IR 方向寄存器,结构如下:

20210830230444

GPIO_GDIR 作为方向控制,每个位指定了一位信号的方向,此寄存器用来设置某个 IO 的工作方向,是输入还是输出。同 样的,每个 IO 对应一个位,如果要设置 GPIO 为输入的话就设置相应的位为 0,如果要设置为输出的话就设置为 1

PSR 寄存器: GPIO 的状态寄存器

20210830231716
20210830231722

PSR 寄存器也是一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值,功能和输入状态下的 DR 寄存器一样

ICR1和ICR2 是中断控制寄存器, ICR1用于配置低16个GPIO, ICR2 用于配置高 16 个 GPIO,以 ICR1 为例子:寄存器结构如下:

20210830232058

两位一组控制一个 GPIO 的中断,和 STM32 的中断类似,每一组可配置的选线如下:

20210830232235

位设置速度
00低电平触发
01高电平触发
10上升沿触发
11下降沿触发

比如要设置 GPIO1_IO15 为上升沿触发中断,那么使用 GPIO1.ICR1=2<<30 就可以设置

IMR : 中断屏蔽寄存器,一个 GPIO 对应一个位,IMR 寄存器用来控制 GPIO 的中断禁止和使能,1 对应中断使能,0 则是禁止

20210830232606

**ISR 是中断状态寄存器 ** :一个 GPIO 对应一个位,只要某个 GPIO 的中断发生,那么 ISR 中相应的位就会被置 1,通过读取值判断中断有没有发生

注意:处理完中断以后,必须清除中断标志位,清除方法就是向 ISR 中相应的位写 1 清零

20210830232740

EDGE_SEL 寄存器用来设置边沿中断,该寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一 个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 是上升沿和下降 沿(双边沿)触发,寄存器如下

20210830233108

1.5 I.MX6UL时钟使能

I.MX6U 有复杂的时钟系统,每个外设的时钟都可以独立的使能或禁止,这样可以关闭掉不使用的外设时钟,起到 省电的目的,时钟系统后面学习到在分析,当前先研究 IO 时钟如何使能

时钟系统有关的模块叫做 Clock Controller Module(CCM) ,其中控制时钟使能的寄存器为CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 I.MX6U 的所有外设时钟开关,CCM_CCGR0 结构体如图:

20210830233941

每 2 位控制一个外设的时钟,控制功能如下:

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

要使能对应的时钟只要置位对应的时钟控制位就行!

二、开发板原理图

正点原子阿尔法LED灯原理图如下:

20210802234739

LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03

三、程序编写

程序编写按照下面的流程进行编写:

  1. 使能IO时钟
  2. 设置IO复用功能
  3. 配置IO运行功能
  4. 配置具体GPIO寄存器
  5. 设置输入输出
  • 使能IO时钟

配置 CCM 的 CCGR0-6 寄存器,开启所有时钟

读取立即数到 R0 、 R1,通过寄存器间接寻址将 R1 的值赋值给目标地址

ldr r0, =0X020C4068 	# CCGR0
ldr r1, =0XFFFFFFFF  
str r1, [r0]		ldr r0, =0X020C406C  	# CCGR1
str r1, [r0]ldr r0, =0X020C4070  	# CCGR2
str r1, [r0]ldr r0, =0X020C4074  	# CCGR3
str r1, [r0]ldr r0, =0X020C4078  	# CCGR4
str r1, [r0]ldr r0, =0X020C407C  	# CCGR5
str r1, [r0]ldr r0, =0X020C4080  	# CCGR6
str r1, [r0]
  • 设置IO复用功能
ldr r0, =0X020E0068	# 将寄存器 SW_MUX_GPIO1_IO03_BASE 地址加载到 r0 中
ldr r1, =0X5		
str r1,[r0]		# 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 为5
  • 配置IO运行功能
# 模式配置
# bit 16:0 HYS关闭
# bit [15:14]: 00 默认下拉
# bit [13]: 0 kepper功能
# bit [12]: 1 pull/keeper使能
# bit [11]: 0 关闭开路输出
# bit [7:6]: 10 速度100Mhz
# bit [5:3]: 110 R0/6驱动能力
# bit [0]: 0 低转换率# 寄存器 SW_PAD_GPIO1_IO03_BASE
ldr r0, =0X020E02F4	
ldr r1, =0X10B0
str r1,[r0]
  • 配置具体GPIO寄存器
# 寄存器GPIO1_GDIR
ldr r0, =0X0209C004
# 配置为输出模式
ldr r1, =0X0000008		
str r1,[r0]
  • 设置GPIO输入输出值
# 寄存器GPIO1_DR
ldr r0, =0X0209C000
# 输出低电平
ldr r1, =0		
str r1,[r0]

在开头添加一个全局入口声明代码

.global _start_start
# 需要运行的代码

结尾加一个死循环,防止程序结束

loop:b loop 	

四、编译下载

编译使用 makefile 进行编译链接得到 .elf 文件,之后转化为 .bin 文件,通过 imxdownload 到 sd 下插到开发板上进行 SD 启动,具体步骤可以参考我之前的文章: Linux驱动开发:I.MX6UL 程序编译下载(SD卡)

五、实验现象

下载程序后,LED 灯点亮

20210901000149

这篇关于ARM裸机开发:汇编LED灯实验(I.MX6UL芯片)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325557

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof