如果说发现官方文档的价值是技术道路上的第一次觉醒,那么学会高效阅读这些文档,就是我们从“入门者”迈向“精通者”的关键转折。当我们面对数百页的技术手册时,新的挑战随之而来:
如何在这片信息的海洋中快速定位需要的知识?
希望本篇能给你一定启示作用。
本篇属于第一部分 万事开头难之入门篇
新芯片的官方文档(下)
技术手册不是要背诵的课文,用不着死记硬背。
不同厂家,不同芯片的手册大同小异,可能有的芯片会把datasheet,reference manual,chip errata三合一或二合一之类的,但万变不离其宗,掌握关键的核心部分,才能做到从从容容、游刃有余。
Introduce(Features/Overview)
芯片的应用场景,关键特性(主频、什么内核架构),关键接口外设以及数量等等。
“我是谁”,像是一份浓缩的个人简历,是市场宣传的主要卖点。如果是选型,瞄一眼就知道对不对眼。确保大方向上,是不是你想要的,满不满足性能要求。如果是应用,建立个基本眼缘,对芯片建立概念认知。
Block Diagram
内核,存储,各个模块(时钟,debug等),外设等之间怎么交互,总线怎么连接。
对芯片架构有个宏观认知,比Features文字描述更直观,表达内容更丰富。有助于理解外设和内核之间数据的交互。信号的传递。观察的维度更高一些。
Electrical Characteristics
工作条件(如温度,电压),电源管理PMU,不同模式功耗值,IO口DC/AC参数,AD参数
前面features可能是让有个概念。这里就是大指标,决定这个芯片性能上、下限到底咋样?
对硬件来说,是设计的核心依据,原理图外围电路怎么设计,设计余量是否足够,统统都要这里的数字指标。
软件不用过度关注电气指标如工作电压、工作发热情况。但低功耗模式,电源管理,这些和软件编程有关系的内容还有芯片可靠性相关的内容都需要有一定了解的。(软件是灵魂。
)
Boot Mode
芯片怎么引导程序启动。
这是成功驱动芯片的关键,芯片会根据引脚配置的boot mode决定以何种方式启动。如果设置的不对,芯片就会卡死在某个地方。
Package Information and Pins Description
封装信息,芯片大小、引脚间距、封装类型等等。
引脚定义,每个引脚叫啥名,供电来源,复位后,默认输入输出状态、默认功能等等。
封装和引脚定义对硬件来说是一般用来设计原理图和layout以及提供机械尺寸给结构。
引脚定义对软件来说,看对应功能,结合Reference Manual用来配置外设寄存器,开启对应复用功能。
Memory Maps
Flash、RAM、ROM、外设、保留地址空间等在地址空间是怎么划分的?
对所有地址有个清晰认知,避免地址越界,保证访问地址准确,编写c代码保证指针操作可靠。
Clock
时钟pll以及晶振,芯片有哪些时钟源,低速、高速,时钟是怎么管理,时钟树或框图是什么样的?怎么配置时钟?
作为数字系统的时基,时钟不对可能导致无法工作或工作异常,如本身想开启GPIO某个功能,结果复用功能的时钟没有打开,或本身想要1ms的定时结果始终有个1us的误差,诸如此类。Interrupts
有哪些中断源?中断的ID号是怎么样的?中断管理器是怎么样的?内核的中断管理器的设计是怎么样的?
作为整个系统能够高效运行、实时响应的“灵魂”。异步处理,能随时打断主程序执行,去执行优先需要响应的事件。一个 SoC 或MCU内部可能有几十甚至上百个外设中断机制负责协调这些模块,中断管理器通过优先级和屏蔽机制,确保各个事件能够得到有序响应。Reset
芯片复位后状态是什么?有哪些复位源(上电复位,外部复位,软件复位,,,,,,)。
对复位异常处理至关重要,比如芯片异常复位可以通过查阅相关寄存器分析复位的类型是什么?还有启动文件的初始化代码。掉电或上电复位时序
主要是介绍外设功能和模式,支持协议类型以及对应协议标准,外设通信时序图时间参数指标,每个外设寄存器地址以及配置信息说明。
这是驱动芯片外设正常工作的基石。涉及软件驱动代码如何编写。怎么保证通信时序可靠。怎么配置寄存器驱动外设,这是内容最多也是最耗费精力的部分。当然不用每个外设都看,用到哪个读哪个,但用的那个一定要精读。
上面这些就是关键部分。不要被手册的页数吓到,带着什么目的按需阅读很重要。
对于i.MX.6ULL来说,我不熟悉这个芯片。那我就以软件的视角结合上面的所说,带着来快速熟悉一下芯片技术参数目的来阅读手册。
打开Datasheet目录,看到有Features、Block Diagram、Electrical Characteristice等等内容。
在Datasheet或Referce Manual均可以看到相关介绍,芯片内核是单核ARM Cortex-A7,带有具有 128 个中断支持的通用中断控制器(GIC),带有各32KB的L1级指令、数据Cache以及Global Timer 、SCU等等。芯片主频792MHz,自身带有96KB的ROM和128KB的RAM,支持各种外设接口,如存储DRAM、NAND标准接口,显示,摄像头,多媒体卡(SDIO,MMC,SD)等等.Block Diagram
从框图,可以看到前面Features描述的芯片内核包含内容,内部存储RAM以及ROM,外设接口,数据总线等等。
Electrical Characteristics 来自Datasheet-> 4Electrical Characteristics在电气特性这里,包含很多内容比如芯片的工作条件、电源要求和限制、内部集成LDO稳压器参数、锁相环电气特性、芯片振荡器、IO DC/AC参数、输出缓冲阻抗、系统模块的时序、多模式DDR控制器、通用媒体接口时序、外设接口参数、A/D转换器信息。对于我来说,i.MX.6ULL是新芯片,我需要尽快熟悉芯片实现bring up,不是芯片选型啥的,像上图这些涉及电气具体参数的内容大部分不需要了解,所以,根据手册目录筛选出如下需要的内容。工作模式包括RUN、Low Power、SNVS、OFF共4种模式,每种模式需要电源供电状态。
电源的不同上电、掉电时序影响芯片工作的可靠性。系统内有软件控制外部电源供电的(如图片纽扣电池给SNVS供电)要按照要求进行上电、掉电。
内部集成LDO稳压器,各种内部电源可以通过内部LDO稳压器上电。在Datasheet让我们到Reference Manual看电源树,但并没有说哪一张章节?Ctrl+F是个效率助手,直接在参考手册Ctrl+F搜索“LDO_ARM”。发现在Chapter 10 Clock and Power Management可以看到Power Tree,如下图所示。
具体寄存器配置则RM在Chapter 39 Power Management Unit (PMU)
时钟的范围和时钟来源,可以看出528MHz PLL、480MHz PLL、Ethernet PLL为固定输出,其余Audio/Video PLL、Arm PLL为频率范围输出。
外部晶振24MHz(内核时钟)和外部低速32K(RTC时钟)。
电气特性其余系统时序,媒体接口暂时用不到先不看。
Boot Mode
BOOT引脚决定引导模式,在BT_FUSE_SEL为0的时候,LCD_DATA00-LCD_DATA23引脚值会覆盖fuse,决定从什么方式启动。细节推荐看RM手册System Boot章节。
Package Information and Pins Description
可以看到芯片的封装引脚尺寸,对软件更重要的是下面这张包含芯片的IO口复位后默认功能、默认模式、默认输入输出状态、默认值,电源供电来源。
接下来就是阅读Reference Manual,打开Reference Manual后,一看4000多页太多了,还是按之前原则看关键部分,先看看目录都有哪些内容。
Introduce
其中有一节访问寄存器的说明,里面说有的寄存器实现了SCT(SET、Clear、Toggle)寄存器组来减少CPU指令周期。一般支持SCT的后面都会追加n,并且寄存器地址map里面也可以看到。
那这样在操作寄存器的时候,如果支持SCT,优选这种来节省时间周期,但也要注意C/S操作非原子操作。(手册都细致地写清楚了)再看Features介绍,内容几乎与Datasheet一样。
Memory Maps 来自Chapter 2 Memory Maps
Boot ROM从地址0开始,也是为啥叫boot rom原因,芯片复位后会从0地址开始执行程序。OCRAM以及别名区地址
0x0092_0000 - 0x0097_FFFF 384 KBOCRAM aliased
0x0090_0000 - 0x0091_FFFF 128 KB OCRAM
AIPS 外设地址0x0200_0000 - 0x022F_FFFFDDR地址为0x8000_0000 - 0xFFFF_FFFF最大为2048 MB,也就是说i.MX.6ULL最大内存不超过2GB。Interrupts 来自Chapter 3 Interrupts and DMA Events
根据截图描述ARM GIC中断控制器前32个中断为私有,没有在表里面列出。NXP表里列的128个中断类型为共享中断。也就是说boot中断真正的ID号是从32开始,从boot对应32依次往后排。关于中断这块与ARM GIC强相关后面还要看GIC手册和ARM架构手册。
Boot Mode 来自Chapter 8 System Boot
在Datasheet看到可以通过BOOT_MODE引脚选择启动模式,在RM里面有了更详细的介绍,有4种模式以及对应FSM流程。
Fuse启动,会忽略GPIO引脚引导设置,让BootROM按照fuse设置启动,如果BT_FUSE_SEL为0,则会直接跳转到串行下载。为1则设置则遵循正常的引导流程,其中ROM尝试从选定的引导设备启动。Fuse方法适合量产产品阶段,不适合开发阶段,一般开发以内部BOOT通过GPIO引脚引导为主。
串行下载,通过USB或UART下载程序到芯片内。
内部BOOT,当BT_FUSE_SEL为1,使用fuse设置来引导程序。当BT_FUSE_SEL为0,则通过GPIO引脚来引导,这种适合开发阶段。
BOOT引脚设备,可以通过BOOT_CFG1[7:4]值区分,见下表。看NXP的引导有点复杂还有一些数据要添加在程序头部,如下图所示,受限于篇幅,等下篇文章结合硬件再分析一下。Clock来自Chapter 10 Clock and Power Management通过框图,清晰看到外部晶振24MHz和32KHz经过振荡器产生时钟后到内部CCM模块,同时也感到时钟对比mcu的复杂。
手册前后细节串联很详细,介绍的一些东西都会推荐读哪个章节。如NXP实现了片上振荡器模块,提示我们可以到Chapter 60 Crystal Oscillator (XTALOSC)查看细节
在第60章节,可以看到集成放大器框图,
另外,可以了解到芯片内部集成了RC振荡器,能满足工作但精度差,功耗低,使用RTC时钟输出作为参考。
对应还有32KHz外部振荡器和内部32KHz介绍。
以上就是关于晶体振荡器在第60章看到的部分内容。从第10章到第60章节跨度有点大,再回来透过初级时钟图,发现共有7个PLL时钟,
PLL1 (ARM_PLL)
PLL2 (System_PLL or 528_PLL)
PLL3 (USB1_PLL)
PLL4 (Audio PLL)
PLL5 (Video PLL)
PLL6 (ENET_PLL)
PLL7 (USB2_PLL)
其中,PLL2和PLL3各有4个PFD(four Phase Fractional Dividers,是完全数字化的设计,没有模拟元件或反馈回路。不仅可以实现比锁相环更快的频率变化,而且还可以在不经过输出时钟禁用/使能过程的情况下安全地“动态”更改配置。),如下图细节所示。
时钟生成和管理子系统的集中组件由CCM (Clock Control Module)和LPCG (Low Power Clock Gating)实现,具体细节在Chapter 18 Clock Controller Module (CCM)时钟树如下图所示。
时钟树主要由3个部分组成,Clock Switcher、Clock Root Generator、System Clocks。从最初的24MHz经过一系列各种倍频、分频,最终到各个外设UART、GPIO等模块时钟。
Reset来自Chapter 51 System Reset Controller (SRC)
SRC控制器负责所有复位信号的生成和引导解码。类型包括POR、WARM、COLD。复位源的输入、输入如下所示。在这一章还介绍了不同复位类型,发生后的优先级等等。BOOT的相关引导信息BOOT_CFG[31:0]会在寄存器SRC_SBMR1体现。现在对芯片的关键内容有个初步概念了,下一步就是用到哪个细读哪一部分。