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地址
0x020E02F4ALT5
0x000010B0
GPIO 配置寄存器 GPIOx_GDIR 地址
0x0209C004每个bit对应每个IO的状态,设置为
0x00000004
GPIO 数据寄存器 GPIOx_DR 地址
0x0209C000设置为
0x00000000
时钟配置寄存器,CCGR0~R6 控制了所有外设的时钟,全都设置为
0xFFFFFFFF0x020C40680x020C406C0x020C40700x020C40740x020C40780x020C407C0x020C4080
编译调试
.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 存放地址,以及一些其他用处的地址。
最后更新于