引言
上次发布的笔记已经学习了几种常见的汇编指令,已经可以满足我们进行一些ARM汇编实例,本系列笔记默认大家有配置好的ubuntu操作系统,默认使用vscode进行开发,vscode就不多介绍了,总之是一款非常好用的开发工具,有很多方便的插件,同时默认大家有Linux C编程基础,知道一些常用的终端指令(ls cd cp…)。
本次笔记记录我学习第一个裸机实验——汇编LED灯实验主要介绍如何使用汇编语言初始化IMX6ULL外设寄存器以及了解最基本的IO输出功能,希望对大家有所帮助。
2.1 I.MX6ULL GPIO 详解
2.1.1 STM32 GPIO 回顾
一般拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO
,控制其
GPIO
输出高低电平,我们学习 I.MX6U
也一样的,先来学习一下
I.MX6U
的
GPIO
。在学习
I.MX6U的 GPIO之
前,我们先来回顾一下
STM32
的
GPIO
初始化。
我们以最常见的 STM32F103
为例来看一下
STM32
的
GPIO
初始化。
示例代码如下
:
1
void
LED_Init
(
void
)
2
{
3
GPIO_InitTypeDef GPIO_InitStructure
;
4
5
RCC_APB2PeriphClockCmd
(
RCC_APB2Periph_GPIOB
,
ENABLE
);
//
使能
PB
端口时钟
6
7
GPIO_InitStructure
.
GPIO_Pin
=
GPIO_Pin_5
;
//PB5 端口配置
8
GPIO_InitStructure
.
GPIO_Mode
=
GPIO_Mode_Out_PP
;
//
推挽输出
9
GPIO_InitStructure
.
GPIO_Speed
=
GPIO_Speed_50MHz
;
//IO
口速度
10
GPIO_Init
(
GPIOB
, &
GPIO_InitStructure
);
//
根据设定参数初始化
GPIOB.5
11
12
GPIO_SetBits
(
GPIOB
,
GPIO_Pin_5
);
//PB.5
输出高
13
}
可以看出上述STM32初始化代码中重点要做的事情有一下几个:
①、使能指定 GPIO
的时钟。
②、初始化 GPIO
,比如输出功能、上拉、速度等等。
③、STM32
有的
IO
可以作为其它外设引脚,也就是
IO
复用,如果要将
IO
作为其它外设引脚使用的话就需要设置 IO
的复用功能。
④、最后设置 GPIO
输出高电平或者低电平
那么IMX6ULL的初始化是不是也是类似的呢?带着这个疑问我们去查一下IMX6ULL的技术手册和参考手册。
2.1.2 I.MX6U IO 命名
从图中可以看出,I.MX6ULL 的
IO
分为两类:
SNVS
域的和通用的,这两类
IO
本质上都是一样的,我们就常用 IO 为例,讲解一下
I.MX6ULL
的
IO
命名方式。
形如“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
”的就是
GPIO
命名,命名形式就是“IOMUXC_SW_MUC_CTL_PAD_
XX_XX
”,后面的“
XX_XX
”就是
GPIO 命名。你会发现貌似 GPIO 只有 GPIO1_IO00~GPIO1_IO09,难道I.MX6ULL 的 GPIO 只有这 10 个?显然不是的, 我们知道 STM32 的很多 IO 是可以复用为其它功能的,那么 I.MX6ULL 的其它 IO 也 是 可 以 复 用 为 GPIO 功能。
8.1.3 I.MX6U IO 复用
以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
”这个
IO 为例,可以看到有个名为:IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 的寄存器,寄存器地址为 0X020E005C,这个寄存器是 32 位的,但是只用到了最低 5 位,
其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的。GPIO1_IO00 一共可以复用为9种功能 IO,分别对应 ALT0~ALT8,其中 ALT5 就是作为 GPIO1_IO00。GPIO1_IO00 还可以为 I2C2_SCL、GPT1_CAPTURE1、ANATOP_OTG1_ID 等,这个就是 I.MX6ULL的IO复用。
以上就介绍了MX6ULL的IO复用部分,可以看到与stm32初始化是有一定类似的,需要操作复用寄存器,下次将会记录IMX6ULL的IO如何配置。