N8 ARM第一个程序点灯

一、复习C语言

结构体,内存对齐

共用体(union)的核心本质

所有成员共用同一块内存空间!

  • 同一时间,只能存一个成员
  • 所有成员的起始地址完全一样
  • 大小 = 最大成员的大小

同一块内存,你想当什么类型读,就当什么类型读。

方式 范围 是否需要恢复 平台
#pragma pack(push,1) 全局 必须恢复 所有编译器
__attribute__((packed)) 仅当前结构体 不用恢复 GNU C (Linux/GCC)
文件后缀 含义 可读吗?
.c C 源代码 可读(文本)
.i 预处理后 C 代码 可读(文本,无宏 / 注释)
.s 汇编代码 可读(文本,汇编指令)
.o 目标文件 不可读(二进制,机器码)
可执行文件 最终程序 不可读(二进制,可直接运行)

二、点灯编程

设置引脚:

GPI01_103

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

IOMUXC_SW_PAD_CTL_PAD_GPIO1_I003

GPIO1_DIR 第3位设置位1,引脚方向为输出

GPIO1_DR 第3位置0(低电平)或置1(高电平)

  • 查看原理图,确定硬件连接
    • 找到 LED 连接的 SoC 引脚(例如 GPIO1_IO03),确认是高电平点亮还是低电平点亮。
  • 引脚功能与电气配置
    • 选择引脚功能(MUX) :通过 IOMUXC 寄存器,将该引脚复用为 GPIO 功能(而非 UART/PWM 等其他功能)。
    • 配置引脚电气特性(PAD):设置上下拉、驱动能力、速度等,确保 GPIO 输出稳定。
    • 配置 GPIO 方向(DIR) :将对应 GPIO 引脚设置为 输出模式(Output)。
  • 控制 LED 亮灭
    • 通过 GPIO 数据寄存器(DR)写入高低电平,实现 LED 点亮 / 熄灭
i.MX6ULL 引脚控制逻辑
  • MUXIO_SW:引脚复用选择器,决定引脚功能(GPIO/UART/EINT/PWM 等)。
  • PAD_SW:引脚电气属性配置(上下拉、驱动强度、速度等)。
  • GPIO 模块
    • DIR:方向寄存器,控制引脚为输入 / 输出。
    • DR:数据寄存器,输出时写入电平,输入时读取电平。
  • pad:芯片外部引脚,最终连接到 LED 硬件。

查表:

编程

设置栈指针(堆栈)指向 0x81000000因为:

  • 裸机程序刚开始运行时,没有栈
  • 必须先设置 sp 堆栈,才能调用 C 语言函数
  • 所以启动文件第一件事就是:给栈找一块安全的内存
cs 复制代码
.global _start

_start:
    ldr pc, =_reset_handler
    ldr pc, =_software_handler
    ldr pc, =_undef_handler
    ldr pc, =_prefetch_abort_handler
    ldr pc, =_data_abort_handler
    nop
    ldr pc, =_irq_handler
    ldr pc, =_fiq_handler

_software_handler:
    b _software_handler

_undef_handler:
    b _undef_handler

_prefetch_abort_handler:
    b _prefetch_abort_handler

_data_abort_handler:
    b _data_abort_handler

_irq_handler:
    b _irq_handler

_fiq_handler:
    b _fiq_handler

_reset_handler:
    /*DDR    0x80000000 ~ 0xA0000000*/
    cpsid i             /*disable irq*/
    ldr sp, =0x81000000 /*init system mode  stack  16M   */
    cps #0x12           /*change to irq mode */
    /* 
    mrs r0, cpsr
    bic r0, r0, #0x1f
    orr r0, r0, #0x12
    msr cpsr_c, r0
    */
    ldr sp, =0x82000000 /*init irq mode stack  16M */

    cps #0x1f           /* change to system mode */
    /* 
    mrs r0, cpsr
    orr r0, r0, #0x1f
    msr cpsr_c, r0
    */

    cpsie i     /* enable  irq */

    bl led_init
led:
    bl led_on
    bl led_delay
    bl led_off
    bl led_delay
    b led

code_end:
    b code_end

led_init:
    ldr r0, =0x20e0068
    ldr r1, [r0]
    bic r1, r1, #0x1f
    orr r1, r1, #0x05
    str r1, [r0]

    ldr r0, =0x20e02f4
    ldr r1, [r0]        /*unuse*/
    ldr r1, =0x10b0
    str r1, [r0]

    ldr r0, =0x209c004
    ldr r1, [r0]
    orr r1, r1, #(1 << 3)
    str r1, [r0]

    ldr r0, =0x209c000
    ldr r1, [r0]
    orr r1, r1, #(1 << 3)
    str r1, [r0]
    bx lr

led_on:
    ldr r0, =0x209c000
    ldr r1, [r0]
    bic r1, r1, #(1 << 3)
    str r1, [r0]
    bx lr

led_off:
    ldr r0, =0x209c000
    ldr r1, [r0]
    orr r1, r1, #(1 << 3)
    str r1, [r0]
    bx lr

led_delay:
    ldr r0, =0x80000

loop_delay:
    sub r0, r0, #1
    cmp r0, #0
    bge loop_delay
    bx lr

下载程序:

相关推荐
somi77 小时前
ARM-06-时钟系统配置
arm开发·单片机·嵌入式硬件·时钟配置
坤坤藤椒牛肉面10 小时前
ARM时钟配置
arm开发
-Try hard-10 小时前
ARM | 点亮LED灯!
arm开发·单片机·嵌入式硬件
泛凡(Linyongui)11 小时前
一款基于LP4057芯片的单节 4.2V 锂电池线性充电管理电路,带电源路径自动切换功能
arm开发·单片机·py32
惶了个恐12 小时前
嵌入式硬件第五弹——ARM(2)
arm开发·嵌入式硬件
EnglishJun12 小时前
ARM嵌入式学习(十一)--- IMX6ULL时钟配置
arm开发·学习
阿乐艾官16 小时前
【k8s网络组件及关系】
网络·arm开发·kubernetes
路溪非溪1 天前
Linux下蓝牙框架的数据流
linux·arm开发·驱动开发
’长谷深风‘1 天前
嵌入式 ARM 开发入门解析
汇编·arm开发·cpu·cortex