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

下载程序:

相关推荐
李某学编程7 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
XMAIPC_Robot16 小时前
基于 i.MX95 平台在新一代工业控制器中的应用 — 工业车载平板、半导体设备主控方案解析
arm开发·人工智能·机器学习·fpga开发·rk3588+fpga·i.mx95
女神下凡16 小时前
芯参谋(71):全桥电机驱动电路设计指南
arm开发·stm32·单片机·嵌入式硬件·硬件工程·设计规范·1024程序员节
szxinmai主板定制专家16 小时前
基于 AM62x + Artix-7 的低功耗 ARM+FPGA 平台在轨道交通车门控制中的应用
arm开发·人工智能·fpga开发·zynq·am62x
幻智星科技16 小时前
我砍掉了FPGA里的ARM核项目反而提前交付了
arm开发·网络协议·fpga开发·硬件架构
女神下凡2 天前
芯参谋(69):LED恒流驱动芯片电路设计指南
arm开发·人工智能·单片机·嵌入式硬件·设计规范
工控存储研习2 天前
瑞芯微平台存储系统设计:DDR、eMMC、SPI NOR、SPI NAND怎么配才合理
arm开发
szxinmai主板定制专家2 天前
ARM 还是 x86?CODESYS 数控机床控制器选型、FPGA 取舍与实时性真相
arm开发·人工智能·fpga开发·zynq·1024程序员节·codesys
工控存储研习2 天前
eMMC分区方案设计:Boot分区、系统分区、数据分区怎么分才合理
arm开发
女神下凡2 天前
芯参谋(68):ADC模数转换器电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范