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

下载程序:

相关推荐
somi71 天前
ARM-05-Platform + DTS + GPIO子系统 + 中断 + 等待队列 + 错误处理
linux·运维·arm开发
互联科技报1 天前
好用稳定的5G网络仿真软件如何选?— 深度对比与选型指南
网络·arm开发·5g
web守墓人1 天前
【linux】Mubuntu发布,将完整的ubuntu arm装进手机应用中
linux·arm开发·ubuntu
EnglishJun2 天前
ARM嵌入式学习(十九)--- 字符设备驱动的注册与调用流程
arm开发·学习
ai产品老杨2 天前
异构计算时代的安防底座:基于 Docker 的 X86/ARM 双模部署与 NPU 资源池化实战
arm开发·docker·容器
somi72 天前
ARM-驱动-06-中断底半部 + ioctl + 原子操作与锁
arm开发·单片机·嵌入式硬件
好家伙VCC2 天前
**TEE在嵌入式安全中的应用实践:基于ARM TrustZone的加密存储方案设计与实现*
java·arm开发·python·struts·安全
进击的小头2 天前
第9篇:嵌入式芯片指令集架构(ISA)详解:ARM_RISC-V等主流ISA全对比
arm开发·单片机·架构·risc-v
Yeats_Liao2 天前
混合部署架构:CPU+GPU协同推理的任务调度策略
服务器·arm开发·人工智能·架构·边缘计算
somi72 天前
ARM-驱动-06-DHT11
linux·arm开发·自用