| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> NXP i.MX RT1052 连载之 Boot 简介【2】 -> 正文阅读 |
|
[嵌入式]NXP i.MX RT1052 连载之 Boot 简介【2】 |
一、代码放在哪里了?? ? ? ? 我们辛辛苦苦编写好的代码都会通过下载工具下载到设备的 ROM 、RAM 或者 Flash 当中去,既然代码的安身之处有如此多的地方,那设备上电后,应该去哪里取代码执行呢?是不是设备已经非常 "智能" 了,可以自动的识别代码 "藏" 在哪里了?显然答案是否定的,设备可没有那么智能~,既然设备无法自动识别代码在哪里,那只能由代码的烧录者来告诉它,让它知道代码放在哪里了,应该去哪里取代码执行。那应该怎么告诉它呢? Boot Mode 启动模式就应运而生了,往往通过设置不同的引脚电平来告诉芯片,让它知道去那里取代码执行。 ? ? ? ? 在正式说 RT1052 启动模式之前,还有个重量级的人物要介绍,它就是 Bootrom(或Boot ROM)是嵌入处理器芯片内的一小块掩模 ROM 或写保护闪存。它包含处理器在上电或复位时执行的第一段代码。根据某些特定引脚或内部保险丝的配置,它可以决定从哪里加载要执行的代码的下一部分以及如何/或是否验证其正确性或有效性。有时它可能包含其他功能,可能在引导期间或之后由用户代码使用。 二、启动设备与启动模式????????从 NXP 官方提供的参考手册《IMXRT1050RM.pdf》可以了解到芯片引导过程从上电复位 (POR) 开始,硬件复位逻辑强制 ARM 内核从片上 boot ROM 开始执行。boot ROM 代码使用内部寄存器 BOOT_MODE[1:0] 的状态以及各种 eFUSE 和 GPIO 设置的状态来确定设备的引导流程。其中 ROM 的主要功能包括: ????????对于设备的 ROM,本文主要介绍它支持的外部启动设备,其它方式启动:例如串行下载、DCD、低功耗唤醒等功能放到后面再介绍,从上图中,我们可以了解到 RT1050 系列支持六种启动设备【针对的内部启动方式】,分别是:
? ? ? ? 相信看到这里,对于没有接触过 NXP 芯片的同学来讲可能会产生疑问了,为啥这里既有?FlexSPI 又有 LPSPI,难道它们不是一样的吗?还有 SEMC 又是什么来的呢?所以还是穿插一下讲讲?FlexSPI / LPSPI /?SEMC 又是何方神圣:
? ? ? ? 回归主题,现在我们已经知道了 RT1050 系列的六种启动设备了,那我们应该使用哪种设备呢作为启动设备呢?芯片又是怎么知道我们想要它把代码拷贝到哪个设备中去执行呢? ? ? ? ? 如何决定使用哪种设备作为启动(ROM)设备呢?具体的可以参考博文最后的几个链接,根据实际项目需要,从芯片读/写速度、擦除速度、寿命、价格等因素进行芯片选型即可。 ? ? ? ? 选择好一款启动设备后该怎么告诉主芯片我们用的是哪种启动设备呢?优先想到的就是使用一个拨码开关,用哪款启动芯片就拨到相应的地址,这样是不是就可以解决怎么告诉主芯片了?事实确实也是这样: ? ? ? ? 从上图中,我们可以了解到 RT1050 系列的芯片是怎样选择启动设备的,是通过 BOOT_CFG1[7:4] 这四位寄存器的值来判断当前的启动设备是哪款。所以实际操作就可以利用四个 IO 管脚来连接一个拨码开关,进而实现多款设备都能切换启动的方式。 ????????介绍完了启动设备,接下来看看启动模式:从 RT1050 的参考手册中,我们可以知道该系列的芯片支持四种启动模式(由 BOOT_MODE0 和 BOOT_MODE1 的启动电平决定):
? ? ? ? 知道了启动设备 / 启动模式相应的寄存器后,那它们对应的 GPIO 管脚又是哪些呢?下面给出一个表格,通过表格,可以知道哪些 GPIO 管脚用来负责启动模式的选择、哪些用来负责启动设备的选择: 三、设备的初始化流程? ? ? ? 现在我们已经知道了 RT1050 这颗 SOC 里有一段固化的代码(boot ROM),也知道了启动模式、启动设备是如何选择的了,哪它们又是怎么联系在一起,它们中间又有什么故事发生呢? ? ? ? ? 一般在内部启动模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备:比如 SD/EMMC、 NAND Flash、Nor Flash、SPI Flash 等)中将代码拷贝出来复制到指定的 RAM 中运行。从 RT1050 参数手册中,我们可以知道 Boot ROM 设备初始化过程中执行了以下的操作:
ROM / RAM 存储器映射:????????从上面两张图我们可以知道,在 Boot ROM 阶段,它映射了 96KByte 的 ROM 空间,用于存放异常向量表、ROM 版本号、ROM Apis 等一些列的操作,也映射了 32 KByte 的 RAM 空间,用于存放 BSS段、RW段、堆栈等一些列的操作;而它们之间的细节会在后面专门讲 ROM / RAM 的章节中详细展开来描述。 硬件单元控制:? ? ? ? ?在系统启动初期,在操作硬件前需要对一系列的硬件控制单元进行初始化/配置才能正常使用,其中包括 CCM、SPI、IOMUX 等系列的硬件单元(具体可以参看上表)。 初期的时钟配置:? ? ? ? ?通过上面的表格,可以看出在设置不同的 BOOT_FREQ 和 LPB_BOOT 值后所得到的 Core 时钟频率也有所不同,更为详细的时钟相关的内容会在后续专门介绍时钟单元的博文中详细介绍。 启用 L1 级的指令/数据缓存:????????在系统启动初期,boot ROM 会去启动 L1 级缓存(指令缓存 / 数据缓存)以提高系统的启动速度,L1 级的指令 cache 在开始下载镜像的时候变开始启动,L1 级的数据 cache 在校验镜像的时候启动。 ? ? ? ? 这时候可能就会有同学问了,那我不想它启用 cache 能不能操作呢?答案是肯定的,用户可以通过编程熔丝寄存器的某些位去禁用 cache。 ????????指令缓存功能由 BT_ICACHE_DISABLE 熔丝控制,数据缓存功能由 BT_DCACHE_DISABLE 熔丝控制。 默认情况下,两个保险丝都没有熔断,这意味着 boot ROM 会使用 ARM 内核的 L1-ICache 和 L1-DCache,提高了 HAB 签名验证软件的性能。 异常处理和中断处理:????????异常向量(中断向量/向量表)表位于 ROM 的开头。在启动阶段,CPU 从异常向量表加载 SP 和 PC 并启动,启动后程序映像可以根据需要重新定位向量表。 ????????在引导过程中不需要特殊的中断处理服务,?所以中断服务在 boot ROM 执行期间被禁用,但可以在 boot ROM 以后的引导中启用。 数据位保持:? ? ? ? 热复位后某些模式下 boot ROM 要求寄存器保持它们的值不发生改变,所以就有了 SRC 通用寄存器去实现该目的,详细的可以参看下面的表格:
四、启动流程? ? ? ? 关于 RT1050 系列的启动流程,通过上图可以看出还是比较清晰、比较简单的,博主画了几根不同颜色的线用于代表不同的启动流程(画的有点丑,不要太介意 ^_^),如果看不清图标可以点击图片放大来看,其中:
????????不同的启动设备(只针对内部设备)所需要配置的信息不同(例如电平的大小不同、读写时序不同等),启动的流程也稍有不同,这里就挑一个 QSPI Nor Flash 作为例子讲解,其它类型的设备就不再赘述。 ? ? ? ? ?从上面的表格可以了解到,对于不同的 spi nor flash 可以配置 Flash Type、Hold time before read 等一系列的参数。 ????????FlexSPI Nor Fash 的启动流程:首先系统会根据 BOOT_CFG1 [7:4] 位的配置,如果都是 0 的话,则 boot ROM 会去初始化 FlexSPI 接口;紧接着 boot ROM 会去读取?Nor Flash 中的前?512 字节的数据(它包含 FlexSPI NOR 配置参数),boot ROM 会使用 BOOT_CFG2[2:0] 指定的读取命令读取这些配置参数,此时串行时钟运行在 30 MHz;最后 boot ROM 会使用从?Nor Flash 读取的配置块中提供的参数配置? FlexSPI1 接口并启动启动程序。 ????????下图是 FlexSPI Nor Fash 的启动流程图: 五、镜像格式? ? ? ? 上图是一张简要的 Image 镜像格式,由于篇幅的原因,不想一篇博文太长,详细的 Image 在后续的博文中再展开来讲。? ? ? ? ? 六、其它参考链接: 1.?NOR FLASH和NAND FLASH基本结构和特点_vincentxj2008的专栏-CSDN博客 3.?EEPROM、FLASH、NOR FLASH、NAND FLASH 区别、关系总结_浅浅0099的博客-CSDN博客 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:29:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |