LED,开发流程,启动

芯片启动流程的各种细节。STM32 开发有集成 IDE,认为芯片启动从 main 开始执行。

但是,C 语言运行需要栈,最起码需要设置 SP 指针到 ram 区。A 系列用用到 DDR,在使用前还要初始化一些必要的硬件,才能为C 语言运行准备好环境。

裸机汇编点灯的步骤

步骤

  • 1.初始化外设(如关看门狗,防一直复位)

  • 2.初始化 DDR

  • 3.设置 SP 指针指向 DDR 中

对于 IMX,芯片内部有 96KB ROM,完成 DDR 的初始化,上面这些步骤之前,C 语言还没法跑。

板上的 LED 以及相关寄存器

  • LED0 GPIO1_IO03

    • 复用寄存器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

      • 地址 0x020E0068

      • 低 4 位 设置为 ALT5 0x00000005

    • 电气属性配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03

      • 地址 0x020E02F4

      • ALT5 0x000010B0

    • GPIO 配置寄存器 GPIOx_GDIR 地址 0x0209C004

      • 每个bit对应每个IO的状态,设置为 0x00000004

    • GPIO 数据寄存器 GPIOx_DR 地址 0x0209C000

      • 设置为 0x00000000

  • 时钟配置寄存器,CCGR0~R6 控制了所有外设的时钟,全都设置为 0xFFFFFFFF

    • 0x020C4068

    • 0x020C406C

    • 0x020C4070

    • 0x020C4074

    • 0x020C4078

    • 0x020C407C

    • 0x020C4080

编译调试

  • .c .s 处理为 .o

  • .o 连接为 elf

  • elf 转为 bin

关于链接,链接吧所有的 .o 文件链接成一个可执行文件,keil 里也会有这些中间文件。keil 中双击工程名,有个 map 文件,展示了 .o 文件如何连接。因此在手动链接时,需要给一个起始的地址。keil 设置中,target 选项卡里,会指定一些地址。

链接起始地址,就是代码运行的起始地址,对于 6ULL,链接起始地址应该指向RAM,即代码也是放在 RAM 的,和STM32不一样。芯片的内部 RAM 128KB,地址范围 0x00900000-0x0091FFFF,外部 DDR 的起始地址为 0x80000000,256M 结束地址 0x8FFFFFFF ,512M 结束地址 0x9FFFFFFF

可以指向DDR里的任意地址。这里先链接到 0x87800000

要使用 DDR,理论上讲要初始化,bin 文件无法直接烧写到 SD卡、EMMC NAND 等,需要添加一些头部信息,包含了 DDR 初始化参数,IMX系列 soc 内部 bootrom 代码会从 持久化存储设备读取头部信息,初始化 DDR 并将 bin 文件复制到指定位置(链接起始位置)

链接 ``

烧写

STM 直接下载到芯片内部 flash

6ULL 支持 SD卡、EMMC、NAND、nor、SPI flash 启动。比较方便的是烧写到 SD 卡。将bin文件烧写到SD卡的绝对地址上。对于 IMX 而言,除了bin文件还要加点其他东西。

6ull 支持 JTAG,但是无法向SD卡烧写(没有烧写算法),可以通过JTAG将bin文件下载到内部RAM里,对普通开发者,几乎用不到JTAG,

芯片启动

IMX 系列都大致相同。

通过引脚设置为从芯片内部 boot 启动。内部 ROM 代码执行,最一些事情

  • 设置内核时钟为 396 M

  • 使能 MMU 和 cache,加速启动

  • 从 BOOT_CFG 设置的外设中,读image做相应处理

添加的头是什么

最终烧写的东西有什么

  • IVT,image vector table,

  • boot date,启动数据,镜像拷贝的地址,拷贝的大小

  • device configuration data,配置信息,最重要的是DDR初始化

  • 用户可执行文件,即 .bin

IVT 里放了地址信息,包括镜像入口地址,DCD 存放地址,以及一些其他用处的地址。

最后更新于