IMX6ULL学习笔记(13)——GPIO接口使用(汇编方式)

发布者:innovator7最新更新时间:2025-02-24 来源: jianshu关键字:GPIO接口 手机看文章 扫描二维码
随时随地手机看文章

一、GPIO简介

i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference Manual》 第26章General Purpose Input/Output (GPIO)(P1133)。


通过 GPIO 硬件结构框图,就可以从整体上深入了解 GPIO 外设及它的各种应用模式。


1.1 IO命名

打开 i.MX6ULL 参考手册的第 32 章“Chapter 32: IOMUX Controller(IOMUXC)”


i.MX6ULL 的 IO 分为两类:SNVS 域的和通用的,这两类 IO 本质上都是一样的。


“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”的就是 GPIO 命名,命名形式就是“IOMUXC_SW_MUC_CTL_PAD_XX_XX”,后面的“XX_XX”就是 GPIO 命名,比如:GPIO1_IO01、UART1_TX_DATA、JTAG_MOD 等等。他是 根据某个 IO 所拥有的功能来命名的。比如我们一看到 GPIO1_IO01 就知道这个肯定能做 GPIO,看到 UART1_TX_DATA 肯定就知道这个 IO 肯定能做为 UART1 的发送引脚。

IO 复用功能。 i.MX6ULL 除了 GPIO1_IO00~GPIO1_IO09 引脚外,其它 IO 也是可以复用为 GPIO 功能。同样的,GPIO1_IO00~GPIO_IO09 也是可以复用为其它外设引脚。

1.2 IO复用

IOMUX 译为 IO 复用选择器。i.MX6ULL 的芯片每个 GPIO 都通过 IOMUX 支持多种功能, 例如一个 IO 可用于网络外设 ENET 的数据接收引脚,也可以被配置成 PWM 外设的输出引脚, 这样的设计大大增加了芯片的适用性,这样可选的功能就是由 IOMUX 实现的。IOMUX 相当于增加了多根内部信号线与 IO 引脚相连,最多有 8 根,也就是说一个 IO 最多可支持 8 种可选的功能。

以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”这个 IO 为例,打开参考手册的 1568 页。



可以看到有个名为: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 等。

1.3 IO配置

IOMUX 由其左侧的 IOMUXC 控制(C表示Controler),IOMUXC 提供寄存器给用户进行配置, 它又分成 MUX Mode(IO模式控制) 以及 Pad Settings(Pad配置) 两个部分:


在 IOMUXC 外设中关于 MUX Mode 和 Pad Settings 寄存器命名格式如下:

IOMUXC控制类型寄存器名称
MUX ModeIOMUXC_SW_MUX_CTL_PAD_XXXX
Pad SettingsIOMUXC_SW_PAD_CTL_PAD_XXXX

每个引脚都包含这两个寄存器,表中的XXXX表示引脚的名字

1.3.1 MUX Mode配置

MUX Mode 就是用来配置引脚的复用功能,即选择引脚具体是用于网络外设 ENET 的数据接收, 还是用于 PWM 外设的输出引脚,当然,也可以配置成普通的 IO 口,仅用于控制输出高低电平。

以 GPIO1_IO04 引脚为例对 MUX 寄存器进行说明,该引脚相应的 MUX 寄存器在参考手册中的描述如下:

该寄存器主要有两个配置域,分别是 SION 和 MUX_MODE。

  • SION: 用于设置引脚在输出模式下同时开启输入通道。

  • MUX_MODE: 使用 4 个寄存器位表示可选的 ALT0~ALT7 这 8 个模式。

    • 如 ALT2 模式就是用于 USB 外设的 USB_OTG1_PWR 信号;

    • 若配置为 ALT5 则引脚会用作普通的 GPIO 功能, 用于输出高、低电平。

1.3.2 Pad Settings配置

Pad Settings 用于配置引脚的属性,例如驱动能力,是否使用上下拉电阻, 是否使用保持器,是否使用开漏模式以及使用施密特模式还是CMOS模式等。

以 GPIO1_IO04 引脚中 PAD 寄存器在参考手册中的描述如下:

相对来说 PAD 寄存器的配置项就更丰富了,而且图中仅是该寄存器的部分说明,如 HYS 设置使用施密特模式的滞后功能,PUS 配置上下拉电阻的阻值, 其它的还包含PUE、PKE、ODE、SPEED、DSE 及 SRE 的配置。

1.3.3 PAD(可跳过不看)

PAD 代表了一个 i.MX6ULL 的 GPIO 引脚。在它的左侧是一系列信号通道及控制线,如 input_on 控制输入开关,Dir 控制引脚的输入输出方向,Data_out 控制引脚输出高低电平,Data_in 作为信号输入,这些信号都经过一个 IOMUX 的器件连接到左侧的寄存器。

①PAD引脚
代表一个i.MX6ULL的引脚。
②输出缓冲区
当输出缓冲区使能时,引脚被配置为输出模式。在输出缓冲区中,又包含了如下的属性配置:

  • DSE驱动能力
    当IO用作输出的时候用来设置IO的驱动能力。DSE可以调整芯片内部与引脚串联电阻R0的大小,从而改变引脚的驱动能力。例如,R0的初始值为260欧姆,在3.3V电压下其电流驱动能力为12.69mA,通过DSE可以把R0的值配置为原值的1/2、1/3…1/7等。

    位设置速度
    000输出驱动关闭
    001R0(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的时候是 240Ω)
    010R0/2
    011R0/3
    100R0/4
    101R0/5
    110R0/6
    111R0/7
  • SRE压摆率配置
    设置压摆率。压摆率是指电压转换速率,可理解为电压由波谷升到波峰的时间。增大压摆率可减少输出电压的上升时间。i.MX6ULL的引脚通过SRE支持低速和高速压摆率这两种配置。当此位为0的时候是低压摆率,当为1的时候是高压摆率。压摆率是大信号特性,下面的带宽是小信号特性。

  • SPEED带宽配置
    设置IO的带宽。分别可设置为50MHz、100MHz以及200MHz。带宽的意思是能通过这个IO口最高的信号频率,通俗点讲就是方波不失真,如果超过这个频率方波就变正弦波。但是这个带宽要区别于IO的翻转速率,IO的翻转速率的信号来自于GPIO这个外设,而IO的带宽只是限制了IO口引脚的物理特性,IO口的信号可以来自于内部定时器输出的PWM信号,也可以来自于GPIO翻转输出的信号,两者相比之下,PWM信号的频率是远远高于GPIO翻转输出的信号频率。

    位设置速度
    00低速 50M
    01中速 100M
    10中速 100M
    11最大速度 200M
  • ODE开漏输出配置
    设置引脚是否工作在开漏输出模式。在该模式时引脚可以输出高阻态和低电平,此位为0的时候禁止开路输出,当此位为1的时候就使能开路输出功能。输出高阻态时可由外部上拉电阻拉至高电平。开漏输出模式常用在一些通讯总线中,如I2C。

③输入缓冲区
当输入缓冲区使能时,引脚被配置为输入模式。在输入缓冲区中,又包含了如下的属性配置:

  • HYS滞后使能
    用来使能迟滞比较器。i.MX6ULL的输入检测可以使用普通的CMOS检测或施密特触发器模式(滞后模式)。施密特触发器具有滞后效应,对正向和负向变化的输入信有不同的阈值电压。如果需要对输入波形进行整形的话可以使能此位。此位为0的时候禁止迟滞比较器,为1的时候使能迟滞比较器。常被用于电子开关、波形变换等场合,其转换特性和对比如下,如检测按键时,使用施密特模式即可起到消抖的功能。


④Pull/Keeper上下拉、保持器
引脚的控制逻辑中还包含了上下拉、保持器的功能。芯片内部的上拉和下拉电阻可以将不确定的信号钳位在高、低电平,或小幅提高的电流输出能力,上拉提供输出电流,下拉提供输入电流。注意这些上下拉配置只是弱拉,对于类似I2C之类的总线,还是必须使用外部上拉电阻。i.MX6ULL芯片的电源模块中包含转换器,当转换器停止工作时,保持器会保持输入输出电压。

上下拉、保持器可以通过如下属性配置:

  • PUS上下拉配置
    设置上下拉电阻。PUS可配置项可选为100K欧下拉以及22K欧、47K欧及100K欧上拉。

    位设置含义
    00100K 下拉
    0147K 上拉
    10100K 上拉
    1122K 上拉
  • PUE上下拉、保持器选择
    上下拉功能和保持器功能是二选一的,可以通过PUE来选择。当IO作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。当为0的时候使用状态保持器,当为1的时候使用上下拉。状态保持器在IO作为输入的时候才有用,顾名思义,就是当外部电路断电以后此IO口可以保持住以前的状态。

  • PKE上下拉、保持器配置
    用来使能或者禁止上下拉/状态保持器功能。为0时禁止上下拉/状态保持器,为1时使能上下拉和状态保持器。

注意,当引脚被配置为输出模式时,不管上下拉、保持器是什么配置,它们都会被关闭。

1.4 GPIO配置

GPIO 模块是每个 IO 都具有的外设,它具有 IO 控制最基本的功能,如输出高低电平、检测电平输入等。 它也占用 IOMUX 分配的复用信号,也就是说使用 GPIO 模块功能时同样需要使用 IOMUX 选中 GPIO 外设,对其 GPIO 的功能进行配置。


1.4.1 GDIR方向寄存器

设置某个 IO 的工作方向。控制一个 GPIO 引脚时,要先用 GDIR 方向寄存器配置该引脚用于输出电平信号还是用作输入检测。 典型的例子是使用输出模式可以控制LED灯的亮灭,输入模式时可以用来检测按键是否按下。

GDIR 寄存器的每一个数据位代表一个引脚的方向,对应的位被设置为0时该引脚为输入模式,被设置为1时该引脚为输出模式。

例如,对 GPIO1 的 GDIR 寄存器的 bit3 位被写入为 1,那么 GPIO1.3 引脚的模式即为输出。

1.4.2 DR数据寄存器

DR 数据寄存器直接代表了引脚的电平状态,它也使用 1 个数据位表示 1 个引脚的电平,每位用 1 表示高电平,用 0 表示低电平。

当 GDIR 方向寄存器设置引脚为输出模式时,写入 DR 数据寄存器对应的位即可控制该引脚输出的电平状态, 如这时 GPIO1 的 DR 寄存器的 bit4 被写入为 1,则引脚为输出高电平。

当 GDIR 方向寄存器设置引脚为输入模式时,读取 DR 数据寄存器对应的位即可获取该引脚当前的输入电平状态,例如这里读取 GPIO1 的DR寄存器的 bit4,得到该位的值为 0,表示当前引脚的输入状态为低电平。


1.4.3 PSR引脚状态寄存器

读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值。PSR 引脚状态寄存器相当于 DR 寄存器的简化版,它仅在 GDIR 方向寄存器设置为输入模式时有效,它的每个位表示一个引脚当前的输入电平状态。PSR 寄存器的权限是只读的,对它进行写操作是无效的。

特别地,当引脚被配置成输出模式时,若 IOMUXC 中的 MUX 寄存器使能了 SION 功能(输出通道回环至输入), 可以通过 PSR 寄存器读取回引脚的状态值。

二、引脚确定

我使用的是 野火_EBF6ULL S1 Pro 开发板


从原理图可看到 RGB 灯的三个阴极 R、G、B 连接分别连接至标号 GPIO_4、CSI_HSYNC、CSI_VSYNC, 这些标号实际上与配套核心板上 i.MX6ULL 芯片的引脚相连。由于引脚功能众多, 绘制原理图时不可避免地无法完全表示引脚信息的所有信息。而无论是具体的引脚名还是复用功能, 我们都无法直接得知这些具体是 i.MX6ULL 芯片的哪个引脚。我们需要知道这些引脚是对应的具体 GPIO,这样我们才能编写程序进行控制。


由于还不清楚标号 GPIO_4、CSI_HSYNC、CSI_VSYNC 的具体引脚名,我们首先要在核心板原理图中查看它与 i.MX6ULL 芯片的关系。打开 《野火_EBF6ULL S1 邮票孔核心板V1.0原理图》,在PDF阅读器的搜索框输入前面的 GPIO_4、CSI_HSYNC、CSI_VSYNC 标号。


查找到了 GPIO_4 信号的具体引脚名为 GPIO1_IO04。 但是当我们使用同样的方法查找时发现只能找到 CSI_HSYNC、CSI_VSYNC, 并没有我们熟悉的 GPIOx_IOx 标注的引脚名。这两个引脚默认情况下不用作 GPIO,而是用作摄像头的某一功能引脚,但是它可以复用为 GPIO,我们怎么找到对应的 GPIO 呢?

  • 方法一:
    在《i.MX 6UltraLite Applications Processor Reference Manual》的第4章 External Signals and Pin Multiplexing 搜索引脚名


  • 方法二:
    在官方写好的文件 fsl_iomuxc.h(路径:SDK文件夹/devices/MCIMX6Y2/drivers/fsl_iomuxc.h) 中搜索引脚名


经查阅,我们把以上连接 LED 灯的各个 i.MX6ULL 芯片引脚总结出如表:

LED灯原理图的标号具体引脚名GPIO端口及引脚编号
R灯GPIO_4GPIO1_IO04GPIO1_IO04
G灯CSI_HSYNCCSI_HSYNCGPIO4_IO20
B灯CSI_VSYNCCSI_VSYNCGPIO4_IO19

三、编程流程

1. 开启GPIO时钟
2. 设置引脚的复用功能以及引脚属性
3. 设置引脚方向以及输出电平


四、编程代码

4.1 完整代码

/*************************第一部分*************************/.text            //代码段.align 2         //设置2字节对齐.global _start   //定义一个全局标号/*************************第二部分*************************/_start:          //程序的开始

   b reset      //跳转到reset标号处/*************************第三部分*************************/reset:

   mrc     p15, 0, r0, c1, c0, 0     /*  将 CP15 协处理器中的寄存器数据读到 ARM 寄存器中   */

   bic     r0,  r0, #(0x1 << 12)     /*  清除第12位(I位)禁用 I Cache  */

   bic     r0,  r0, #(0x1 <<  2)     /*  清除第 2位(C位)禁用 D Cache  */

   bic     r0,  r0, #0x2             /*  清除第 1位(A位)禁止严格对齐   */

   bic     r0,  r0, #(0x1 << 11)     /*  清除第11位(Z位)分支预测   */

   bic     r0,  r0, #0x1             /*  清除第 0位(M位)禁用 MMU   */

   mcr     p15, 0, r0, c1, c0, 0     /*  将 ARM 寄存器的数据写入到 CP15 协处理器寄存器中   *//*************************第四部分*************************/

   /*跳转到light_led函数*/

   bl light_led   /*进入死循环*/

 /*************************第五部分*************************/loop:

   b loop/*************************第六部分*************************//*CCM_CCGR1 时钟使能寄存器地址,默认时钟全部开启*/#define gpio1_clock_enible_ccm_ccgr1  0x20C406C/*IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04

寄存器地址,用于设置GPIO1_iIO04的复用功能*/#define gpio1_io04_mux_ctl_register  0x20E006C/*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO04寄存器地址,用于设置GPIO的PAD属性*/#define gpio1_io04_pad_ctl_register  0x20E02F8/*GPIO1_GDIR寄存器,用于设置GPIO为输入或者输出*/#define  gpio1_gdir_register  0x0209C004/*GPIO1_DR寄存器,用于设置GPIO输出的电平状态*/#define  gpio1_dr_register  0x0209C000/*************************第七部分*************************/light_led:

   /*开启GPIO1的时钟*/

   ldr r0, =gpio1_clock_enible_ccm_ccgr1

   ldr r1, =0xFFFFFFFF

   str r1, [r0]/*************************第八部分*************************/

   /*将PAD引脚复用为GPIO*/

   ldr r0, =gpio1_io04_mux_ctl_register

   ldr r1, =0x5

   str r1, [r0]/*************************第九部分*************************/

   /*设置GPIO PAD属性*/

   ldr r0, =gpio1_io04_pad_ctl_register

   ldr r1, =0x1F838

   str r1, [r0]/*************************第十部分*************************/

   /*将GPIO_GDIR.[4] 设置为1, gpio1_io04设置为输出模式*/

   ldr r0, =gpio1_gdir_register

   ldr r1, =0x10

   str r1, [r0]/*************************第十一部分*************************/

   /*将GPIO_DR 设置为0, gpio1全部输出为低电平*/

   ldr r0, =gpio1_dr_register

   ldr r1, =0x0

   str r1, [r0]/*************************第十二部分*************************/

   /*跳出light_led函数,返回跳转位置*/

   mov pc, lr

4.2 分析代码

在 Ubuntu 下创建 led.S 文件用于编写 LED 汇编驱动代码。


第一部分

.text 定义代码段。

.align 2 设置字节对齐。

.global _start 生命全局标号_start。


/*************************第一部分*************************/.text            //代码段.align 2         //设置2字节对齐.global _start   //定义一个全局标号

第二部分

_start: 定义标号_start: ,它位于汇编的最前面,说以会首先被执行。

b reset 使用b指令将程序跳转到reset标号处。


/*************************第二部分*************************/_start:          //程序的开始

   b reset      //跳转到reset标号处

第三部分

通过修改CP15寄存器(系统控制寄存器) 关闭 I Cache 、D Cache、MMU 等等。

我们暂时用不到的功能,如果开启可能会影响我们裸机运行,为避免不必要的麻烦暂时关闭这些功能。


/*************************第三部分*************************/reset:

   mrc     p15, 0, r0, c1, c0, 0     /*  将 CP15 协处理器中的寄存器数据读到 ARM 寄存器中   */

   bic     r0,  r0, #(0x1 << 12)     /*  清除第12位(I位)禁用 I Cache  */

   bic     r0,  r0, #(0x1 <<  2)     /*  清除第 2位(C位)禁用 D Cache  */

[1] [2]
关键字:GPIO接口 引用地址:IMX6ULL学习笔记(13)——GPIO接口使用(汇编方式)

上一篇:IMX6ULL学习笔记(14)——GPIO接口使用(C语言方式)
下一篇:IMX6ULL学习笔记(12)——通过SD卡启动官方SDK程序

推荐阅读最新更新时间:2026-03-24 11:29

ARM 内核 汇编指令 的 8种 寻址方式
str: store register - 指令将寄存器内容存到内存空间中, ldr: load register 将内存内容加载到通用寄存器, ldr/str 组合来实现ARM CPU 和内存数据的 交换! 1、mov r1,r2; //寄存器r2的内容复制到r1中,寄存器寻址方式,(r1,r2 ARM中的通用寄存器) 2、mov r0,#0xFF00; //数0xFF00复制到r0中,立即寻址方式,(#代表后面跟一个数) 3、mov r0,r1,lsl #3; //将r1中的内容左移三位后传送到r0中,寄存器移位寻址,(LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作) 4、ldr r1, ; //
[单片机]
ARM汇编--寻址方式
ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集。 RM指令集效率高,但是代码密度高 Thumb指令集具有较高的代码密度,却仍然保持着ARM的大多数性能上的优势,它是ARM的子集。 所有的ARM置零都是可以条件执行的,而Thumb置零仅有一条指令具备条件执行的功能。 ARM和Thumb程序可以相互调用,相互之间状态切换开销几乎为零。 首先我们来看一下分类: 一、数据处理指令操作数寻址方式 1、立即数寻址方式 2、寄存器寻址方式 3、寄存器移位寻址方式 二、存储器访问指令操作数寻址方式 1、寄存器间接寻址 2、基址变址寻址 3、相对寻址 4、多寄存器寻址(块拷贝寻址) 5、堆栈寻址 下面
[单片机]
ESP32学习笔记(2)——GPIO接口使用
一、简介 ESP32 芯片有 40 个物理 GPIO pad。每个 pad 都可用作一个通用 IO,或连接一个内部的外设信号。IO_MUX、RTC IO_MUX 和 GPIO 交换矩阵用于将信号从外设传输至 GPIO pad。这些模块共同组成了芯片的 IO 控制。 注意:其中 GPIO 34-­39 仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚。 GPIO6-11通常用于SPI闪存。 1.1 官方资料 ESP-IDF 编程指南——GPIO&RTC GPIO ESP32 技术参考手册——4 IO_MUX 和 GPIO 交换矩阵 (GPIO, IO_MUX) gpio_example 1.2 包含头文件 #includ
[单片机]
GD32F103学习笔记(4)——GPIO接口使用
一、简介 最多可支持112个通用I/O引脚(GPIO),分别为PA0 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,PD0 ~ PD15,PE0 ~ PE15,PF0 ~ PF15和PG0 ~ PG15,各片上设备用其来实现逻辑输入/输出功能。每个GPIO端口有相关的控制和配置寄存器以满足特定应用的需求。外设GPIO引脚上的外部中断在中断/事件控制器(EXTI)中有相关的控制和配置寄存器。GPIO端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。GPIO引脚通过配置相关的寄存器可以用作备用功能引脚,备用功能输入/输出都可。每个GPIO引脚可以由软件配置为输出(推挽或开漏)、输入、外设的备用功能或
[单片机]
ARM汇编之寻址方式
ARM7处理器有两个指令集:32位的ARM指令集,16位的Thumb指令集。 1 ARM指令集:效率高,代码密度高 2 Thumb指令集:具有较高的代码密度。 注: 1. 所有的ARM指令集都是有条件执行的,而Thumb指令集仅有一条指令具备条件执行功能。 2. ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。 二. ARM处理器寻址方式 寻址方式是指根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM7处理器总共有9中基本的寻址方式。 1. 寄存器寻址 1 操作数的值存放在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。 2 MOV R
[单片机]
ARM<font color='red'>汇编</font>之寻址<font color='red'>方式</font>
GPIO接口及点亮第一个LED灯
一、GIPIO介绍 General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。 1.GPIO的优点 低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。 集成IIC从机接口:GPIO内置IIC从机接口,即使在待机模式下也能够全速工作。 小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN! 低成本:您不用为没有使用的功能买单。 快速上市:不需要
[单片机]
<font color='red'>GPIO</font><font color='red'>接口</font>及点亮第一个LED灯
ARM汇编中调用C函数的参数传递方式
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard)标准,ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回。 不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。 我们先讨论一下形参个数为4的情况: 实例1 s// test_asm_args.asm //--------------------------------------------------------
[单片机]
GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法
在《 GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读 》中分析完u-boot-2012.07的makefile以及mkconfig脚本后,发现一个现象:在makefile中少了许多xxx_config之类的目标,而在目录下多了一个boards.cfg文件.仔细看下makefile和mkconfig就明白其实也没什么实质性的变化.也就是说,我们在make xxx_config的时候都用的是 %_config::unconfig @$(MKCONFIG) -A $(@:_config=) 奇怪的就是在下面一点点有: #################################
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved