1. 项目概述:从手册到实战,解读MC9S12P的“电气心脏”
如果你和我一样,常年泡在汽车电子或者工业控制的项目里,那对飞思卡尔(现在是NXP的一部分)的MC9S12系列单片机肯定不会陌生。这个系列以其高可靠性、丰富的片上资源和在严苛环境下的稳定表现,成了很多BMS(电池管理系统)、车身控制器和电机驱动项目的“老熟人”。最近在做一个车载传感器数据采集的升级项目,主控用的就是MC9S12P128。为了把ADC的精度榨干,确保十年后数据还能稳稳地存在Flash里,我又一次翻开了那本厚厚的参考手册,特别是“电气特性”附录部分。
手册里那些密密麻麻的表格和公式,比如ATD转换性能表、NVM时序方程,第一次看确实头大。但这些东西恰恰是决定你产品性能上限和长期可靠性的“地基”。ADC的DNL、INL指标直接关系到你采集的电压、电流值是不是“准”;NVM的擦写周期、数据保持时间则决定了你的参数标定、故障记录能不能“活得”和整车一样久。很多人调程序只关心功能实现,寄存器配对了就行,但忽略了芯片数据手册里这些电气和时序参数的深层含义,结果就是产品批量后出现一致性差、偶尔数据出错等玄学问题,排查起来能要了老命。
这篇内容,我就结合手册里的硬核参数和实际调试中的踩坑经验,带你深入MC9S12P的ADC和NVM模块。我们不只讲“是什么”,更重点剖析“为什么”以及“怎么用”。我会把那些冰冷的参数表,翻译成你在画原理图、写驱动、做系统设计时能直接用的设计准则和避坑指南。无论你是正在评估MC9S12P系列,还是已经在用它做开发,希望这些从手册和实战中提炼出的细节,能帮你把芯片的潜力充分发挥出来,做出更稳定、更可靠的产品。
2. 核心细节解析与实操要点
2.1 ADC精度参数:不只是几个数字
手册里关于ADC(ATD)精度的部分,核心是几张表(Table A-16, A-17)和一堆定义。很多人看一眼“Typ”那一栏的典型值就觉得OK了,其实“Min”和“Max”才是保证你产品在任何情况下都不出错的底线。
2.1.1 DNL与INL:理解误差的来源
微分非线性(DNL)和积分非线性(INL)是描述ADC“线性度”的核心指标。你可以这样理解:
- DNL:好比一把尺子,理想情况下每毫米的刻度间隔应该是均匀的。DNL描述的就是实际刻度间隔与理想1毫米之间的最大偏差。手册里以“counts”(LSB的个数)为单位。例如,在5V范围、10位模式下,DNL的典型值是±0.5 LSB,最大不超过±1 LSB。这意味着,相邻两个数字码对应的实际电压差,最多可能比理想值多出或少掉1个最小分辨率(5mV)。
- INL:可以看作是这把尺子从起点到任意一点的累积误差。它是所有DNL的累加和,反映了整个量程范围内,实际转换曲线偏离理想直线的最大程度。同样在10位模式下,INL典型值为±1 LSB,最大±2 LSB。
关键提示:DNL误差会影响ADC的“单调性”。理论上,输入电压增加,输出数字码必须增加或保持不变。如果DNL误差小于-1 LSB,就可能出现输入电压增加,输出码反而减少的“非单调”情况,这在闭环控制系统中是灾难性的。MC9S12P的规格保证了DNL > -1 LSB,从而确保了单调性。
2.1.2 绝对误差(AE):系统精度的总和
绝对误差(AE)是量化误差、偏移误差、增益误差和INL误差的综合体现。手册注明,这个值已经包含了固有的1/2 LSB量化误差。对于10位模式、5V量程,AE最大为±3 LSB(即±15mV)。这意味着,任何一个采样值,其与真实电压的最大偏差可能达到15mV。
2.1.3 输入前端设计:手册没明说,但能坑死你的细节
Table A-15的电气特性参数,是保证ADC达到上述精度指标的前提条件,但最容易被忽视。
- 最大输入源电阻(RS ≤ 1 kΩ):这是硬性规定。如果信号源内阻(比如传感器输出阻抗加上你的串联电阻)超过1kΩ,采样电容就无法在指定的采样时间内充到稳定的电压,导致精度严重下降。实操心得:对于高阻抗传感器(如热电偶、某些压力传感器),必须使用运放构建电压跟随器进行阻抗变换,确保驱动能力。
- 输入电容与内部电阻:模拟输入引脚有寄生电容(非采样时典型值10pF,采样时16pF)和内部电阻(典型5kΩ,最大15kΩ)。它们与外部源电阻构成了一个RC网络。计算示例:假设源电阻为允许的最大值1kΩ,内部电阻取典型值5kΩ,采样电容16pF,则时间常数 τ = (1kΩ + 5kΩ) * 16pF ≈ 96ns。你需要确保采样时间(由ATDCTL4中的PRS和SMP位控制)远大于这个时间常数,通常需要5τ以上(即>480ns)才能达到99.3%的稳定度。如果驱动能力弱或布线引入额外电容,这个时间需要更长。
- 电流注入与耦合比:手册提到了“破坏性模拟输入电流”(±2.5mA)和正/负电流注入耦合比(Kp, Kn)。这警告我们,要避免模拟引脚在采样期间被外部电路灌入或拉出过大电流,尤其是在与数字IO复用的引脚上。当相邻的数字引脚发生剧烈跳变时,通过衬底耦合可能干扰ADC精度。布局建议:确保模拟电源(VDDA、VSSA)与数字电源有效隔离,模拟信号走线远离高频数字信号,并用地线包围。
2.2 NVM操作时序:时间就是逻辑
NVM(Flash)的编程和擦除不是瞬间完成的,需要精确的时钟和时间控制。手册A.3.1节给出了一系列公式,不是用来吓人的,而是让你计算和规划操作流程的。
2.2.1 时钟源与分频:一切计时的基础
NVM操作的时间基准来源于总线时钟(fNVMBUS),并通过FCLKDIV寄存器分频产生NVM操作时钟(fNVMOP)。这里有两条生命线:
- fNVMOP范围:必须在0.8MHz到1.05MHz之间(见表A-18)。超出此范围,编程/擦除结果不可靠。
- 分频计算:
FCLKDIV[FDIV5:FDIV0]设置分频因子PRDIV。fNVMOP = fNVMBUS / (PRDIV + 1)。你必须根据系统总线频率计算并设置正确的PRDIV值,使fNVMOP落入有效范围。例如,总线频率为32MHz,则PRDIV至少为32 / 1.05 ≈ 30.5,取31,得到fNVMOP = 32/(31+1) = 1.0 MHz,符合要求。
2.2.2 关键时序参数解读与计算
手册的时序公式以总线周期(tcyc = 1/fNVMBUS)和NVM操作周期为单位。我们以最常用的“擦除一个P-Flash扇区”和“编程一个P-Flash短语(Phrase)”为例。
P-Flash扇区擦除典型时间(tpera):
tpera ≈ 20020 * (1 / fNVMOP) + 700 * (1 / fNVMBUS)代入 fNVMOP = 1MHz, fNVMBUS = 32MHz:tpera ≈ 20020 * 1us + 700 * 31.25ns ≈ 20.02ms + 21.875us ≈ 20.04ms这个值(约20ms)与表A-18中的典型值吻合。最大时间公式中第二项为1400个总线周期,所以最坏情况会稍长一点。P-Flash短语编程典型时间(tppgm):
tppgm ≈ 164 * (1 / fNVMOP) + 2000 * (1 / fNVMBUS)代入同样频率:tppgm ≈ 164 * 1us + 2000 * 31.25ns ≈ 164us + 62.5us ≈ 226.5us这也与手册表格中的226us典型值一致。
避坑指南:在编写Flash驱动时,绝对不能使用简单的延时循环来等待操作完成。必须通过查询
FSTAT寄存器中的CCIF(命令完成中断标志)位,或者使能CCIE中断,来确认操作结束。因为实际时间可能因工艺、电压、温度而略有波动,且擦除时间会随着Flash单元老化而增加(手册提到D-Flash扇区擦除时间可从5ms延长到20ms)。依赖固定延时会导致在极端条件下操作失败。
2.3 NVM可靠性:产品的“保质期”
对于汽车和工业产品,数据存储的可靠性是重中之重。表A-19的“NVM可靠性特性”是设计寿命的数学依据。
2.3.1 擦写周期(Endurance)
- P-Flash(程序Flash):保证最少10,000次擦写周期,典型值可达100,000次。这意味着,如果你设计一个在线标定功能,每天对某个参数扇区进行10次重新编程,那么最少能保证
10,000 / 10 = 1000天,约2.7年的数据安全。典型值下则可达27年。 - D-Flash(数据Flash):保证最少50,000次,典型值500,000次。显然,D-Flash是为频繁更新的数据(如故障码、里程、磨损均衡数据)准备的。
2.3.2 数据保持时间(Data Retention)
这是指在断电情况下,Flash中的数据能保存多久。手册给出的条件是:在结温(TJ)平均85°C下,达到指定擦写次数后。
- P-Flash:在10k次擦写后,保证数据保持20年,典型值100年。
- D-Flash:分了三档,擦写次数越多,保持时间越短。在50k次擦写后保证5年,10k次后保证10年,少于100次则保证20年。
核心设计启示:这个参数直接决定了你的产品存储策略。对于几乎不变的应用程序代码(P-Flash),可靠性很高。对于频繁更新的数据,必须使用磨损均衡算法,将写操作均匀分布到D-Flash的不同扇区,避免单个扇区过早达到擦写上限。同时,对于关键数据(如车辆VIN码),应考虑在D-Flash中存储多份副本,并定期校验。
2.3.3 温度的影响
所有NVM的可靠性参数都与温度强相关。手册注脚提到,典型值是在25°C下评估,并通过阿伦尼乌斯方程推导到高温。实际应用中,芯片结温越高,数据保持能力越差。在发动机舱等高温环境中,必须为芯片提供良好的散热,并可能在系统设计中为关键数据增加额外的EEPROM或FRAM备份。
3. 实操过程与核心环节实现
3.1 ADC精度保障的硬件设计实战
理解了参数,我们来看如何落实到硬件设计上。目标是确保ADC输入信号在进入MCU引脚时,满足手册规定的所有条件。
3.1.1 信号调理电路设计
假设我们需要采集一个0-5V的传感器信号,传感器输出阻抗为500Ω。
- 阻抗匹配:传感器阻抗500Ω < 1kΩ,理论上可直接连接。但为了增强抗干扰能力和提供过压保护,通常会加入RC滤波。
- RC滤波网络计算:
- 目的:滤除高频噪声。
- 设计:在ADC输入引脚前,串联一个100Ω电阻(R_s),并接一个100pF电容(C_f)到模拟地。这构成一个低通滤波器。
- 分析:此时驱动ADC的源电阻为传感器阻抗(500Ω)加上串联电阻(100Ω),共600Ω,仍小于1kΩ。滤波电容(100pF)远大于引脚输入电容(16pF),因此主导的RC时间常数为
600Ω * 100pF = 60ns。我们需要确保ADC的采样时间远大于此值。
- 采样时间配置:
- ADC时钟(fATDCLK)典型为8MHz,周期125ns。
- 采样时间由
ATDCTL4寄存器的PRS[4:0](预分频)和SMP[2:0](采样周期数)共同决定。总采样时间 = (PRS * SMP) 个ATD时钟周期。 - 为了稳定采集,我们至少需要5倍RC常数,即
5 * 60ns = 300ns。这需要至少300ns / 125ns = 2.4个时钟周期。考虑到余量,设置SMP=4(即4个采样周期),则采样时间为4 * 125ns = 500ns,足够稳定。 - 代码示例(C语言):
// 设置ATD时钟预分频和采样时间 // 假设总线时钟16MHz,希望ATDCLK=8MHz,则预分频系数 = 16/8 -1 = 1 // PRS[4:0] = 1, SMP[2:0] = 4 (对应100b,具体查手册位定义) ATDCTL4 = 0x01 | (0x04 << 3); // 假设SMP位在bit5-3,实际需查寄存器定义
3.1.2 参考电压与电源去耦
ADC的精度极度依赖参考电压的纯净和稳定。
- 参考源选择:MC9S12P可以使用内部的VDDA作为参考,也可以使用外部更精准的基准源(如REF5040)。对于精度要求高于10位的应用,强烈建议使用外部低噪声、低温漂的基准源。
- 去耦设计:在VREFH和VREFL引脚、VDDA和VSSA引脚,必须就近放置高质量的陶瓷去耦电容(如100nF X7R)和一个更大的钽电容或电解电容(如10uF)。布局上,这些电容的回路要尽可能小。
3.2 NVM驱动编写与时序管理实战
编写一个健壮的Flash驱动,关键在于严格遵循手册的编程序列和时序要求。
3.2.1 Flash初始化与时钟配置
在操作Flash前,必须先配置好时钟。
void Flash_Init(void) { // 1. 检查并等待当前无Flash操作 while(!(FSTAT & FSTAT_CCIF_MASK)); // 2. 配置Flash时钟分频器 (FCLKDIV) // 假设总线时钟fNVMBUS = 32MHz,目标fNVMOP = 1MHz // 分频因子 PRDIV = 32/1 - 1 = 31 // 同时需要清除FDIVLD标志位来允许写入 FCLKDIV = 0x00; // 先写入0清除FDIVLD(如果已置位) FCLKDIV = 31; // 设置分频值,写入后硬件会自动计算并锁存,FDIVLD置位 // 等待时钟稳定或直接检查FDIVLD位 while(!(FCLKDIV & FCLKDIV_FDIVLD_MASK)); }3.2.2 P-Flash扇区擦除流程
擦除是编程的前提,必须以扇区(512字节)或块为单位进行。
#define SECTOR_START_ADDR 0x8000 // 假设要擦除的扇区起始地址 uint8_t Flash_EraseSector(uint32_t addr) { // 0. 确认地址对齐到512字节边界 (可选,硬件要求) if(addr & 0x1FF) { return ERR_ADDR_ALIGN; } // 1. 等待上次命令完成 while(!(FSTAT & FSTAT_CCIF_MASK)); // 2. 清除错误标志 (ACCERR, FPVIOL) FSTAT = FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK; // 3. 填写命令代码和地址到FCCOB寄存器组 // 擦除P-Flash扇区命令: 0x0A // 地址是24位,高8位在FCCOBHI,低16位在FCCOBLO FCCOBIX = 0; // 选择CCOB寄存器组0 FCCOBHI = 0x0A; // 命令字 FCCOBLO = (uint8_t)(addr >> 16); // 地址高字节 (A23-A16) FCCOBIX = 1; FCCOBHI = (uint8_t)(addr >> 8); // 地址中字节 (A15-A8) FCCOBLO = (uint8_t)(addr); // 地址低字节 (A7-A0) // 4. 启动命令 (向FSTAT写1清除CCIF位) FSTAT = FSTAT_CCIF_MASK; // 5. 等待命令完成 while(!(FSTAT & FSTAT_CCIF_MASK)); // 6. 检查操作结果 if(FSTAT & (FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK)) { // 处理错误: 访问违规或保护冲突 return ERR_ERASE_FAILED; } return SUCCESS; }时序管理注意:上述代码第5步的while循环,就是我们在2.2.2节强调的必须使用的查询机制。实际等待时间就是手册计算的tpera(约20ms),在此期间CPU可以进入低功耗模式或处理其他任务。
3.2.3 P-Flash短语编程流程
编程必须以“短语”(Phrase,4个字,8字节)为单位进行。
uint8_t Flash_ProgramPhrase(uint32_t addr, uint32_t *data) { // data指向包含8字节数据(2个32位字)的数组 // 1. 等待上次命令完成 while(!(FSTAT & FSTAT_CCIF_MASK)); // 2. 清除错误标志 FSTAT = FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK; // 3. 填写编程命令和地址数据 // 编程P-Flash命令: 0x06 FCCOBIX = 0; FCCOBHI = 0x06; // 命令 FCCOBLO = (uint8_t)(addr >> 16); FCCOBIX = 1; FCCOBHI = (uint8_t)(addr >> 8); FCCOBLO = (uint8_t)(addr); FCCOBIX = 2; FCCOBHI = ((uint8_t*)data)[3]; // 注意字节序!MC9S12是大端模式(Big-Endian) FCCOBLO = ((uint8_t*)data)[2]; FCCOBIX = 3; FCCOBHI = ((uint8_t*)data)[1]; FCCOBLO = ((uint8_t*)data)[0]; FCCOBIX = 4; FCCOBHI = ((uint8_t*)data)[7]; FCCOBLO = ((uint8_t*)data)[6]; FCCOBIX = 5; FCCOBHI = ((uint8_t*)data)[5]; FCCOBLO = ((uint8_t*)data)[4]; // 4. 启动命令 FSTAT = FSTAT_CCIF_MASK; // 5. 等待命令完成 (耗时约tppgm, 226us) while(!(FSTAT & FSTAT_CCIF_MASK)); // 6. 检查错误 if(FSTAT & (FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK)) { return ERR_PROGRAM_FAILED; } return SUCCESS; }字节序陷阱:MC9S12是大端(Big-Endian)处理器,即高字节存储在低地址。在向FCCOB填充多字节数据(如32位地址或编程数据)时,必须注意字节顺序。上面的代码示例展示了如何从一个小端格式(PC上常见)的
data数组中,按大端顺序提取字节。这是驱动开发中最常见的错误之一。
3.3 系统级可靠性设计策略
将ADC和NVM的电气特性融入整个系统设计。
3.3.1 电源与接地设计
- 模拟与数字分离:使用独立的LDO为VDDA(模拟电源)和VDD(数字核心电源)供电,即使它们电压相同。在PCB上使用磁珠或0Ω电阻进行单点连接。模拟地和数字地也应在MCU下方单点连接。
- 去耦电容布局:每个电源引脚(VDD、VDDA、VREFH)到其对应地引脚(VSS、VSSA、VREFL)的路径必须尽可能短,去耦电容(通常为100nF)必须紧贴引脚放置。
3.3.2 数据存储与维护策略
基于NVM的可靠性参数,制定软件策略:
- 磨损均衡:为D-Flash设计一个简单的循环队列或索引表。每次更新数据时,写入下一个空闲位置,并更新索引。当写满一圈后,擦除最早的扇区。这能将50k次的擦写寿命分摊到整个存储区,极大延长使用寿命。
- 数据校验与备份:对存储在Flash中的关键数据(如标定参数),计算并存储其CRC或校验和。每次上电或读取时进行校验。对于极其重要的数据(如安全密钥),可以在D-Flash的不同物理位置存储2-3个副本,实现冗余。
- 定期刷新:对于长期存储但很少改写的数据,可以考虑在系统空闲时,定期(如每年一次)读取、校验并重新写入(需先擦除)到新的位置。这可以缓解数据保持能力随时间(尤其是高温下)的衰减,但会消耗擦写次数,需权衡。
4. 常见问题与排查技巧实录
在实际项目中,即使完全按照手册设计,也可能遇到各种问题。这里分享几个典型的“坑”和解决方法。
4.1 ADC采样值跳动大、不准
- 现象:输入一个稳定的直流电压,ADC采样结果在几个LSB范围内无规律跳动。
- 排查思路:
- 检查硬件:用示波器直接测量MCU的ADC输入引脚。观察波形是否干净、稳定。很可能存在高频噪声或电源纹波。重点检查模拟电源(VDDA)的纹波,应在mV级别。
- 检查参考电压:测量VREFH引脚的电压是否稳定。如果使用内部参考,其精度和温漂相对较差。对于高精度要求,务必换用外部基准源。
- 检查采样时间:根据3.1.1节的方法,重新计算外部RC网络的时间常数,并增加
ATDCTL4中的采样周期数(SMP位)。很多时候是采样时间不足导致电容充电不充分。 - 检查软件滤波:硬件无法完全滤除噪声时,需要在软件端进行数字滤波。常用的有滑动平均滤波、中值滤波等。对于缓慢变化的信号,增加采样次数求平均能有效抑制随机噪声。
- 我的教训:曾遇到一个案例,ADC采样值偶尔会有几十个LSB的突变。最后发现是PCB布局问题,ADC输入走线平行于一个PWM输出走线,且距离过近,导致开关噪声耦合。重新布线后问题解决。
4.2 Flash编程/擦除失败,ACCERR或FPVIOL标志置位
- 现象:调用Flash驱动函数后,返回错误,检查
FSTAT寄存器发现访问错误(ACCERR)或保护违规(FPVIOL)标志为1。 - 排查思路:
- FPVIOL(保护违规):
- 原因:试图擦写受保护的Flash区域。保护由
FPROT寄存器控制。 - 解决:检查目标地址是否在受保护的扇区内。如果是应用程序区,需要在编程前通过特定的解锁序列(可能涉及后门密钥)解除保护。如果是关键的保护区域(如中断向量表),则不允许擦写。
- 原因:试图擦写受保护的Flash区域。保护由
- ACCERR(访问错误):
- 原因:Flash命令序列执行不正确。这是最常见的原因。
- 检查清单:
- 时钟配置:
FCLKDIV寄存器配置是否正确?FDIVLD位是否为1?fNVMOP是否在0.8-1.05MHz范围内?这是新手最容易出错的地方。 - 命令序列:是否严格按照“等待CCIF -> 清除错误标志 -> 写入FCCOB -> 启动命令 -> 等待CCIF”的顺序?顺序错一步就会导致ACCERR。
- FCCOB填充:命令码、地址、数据的字节顺序(大端)是否正确?FCCOBIX索引是否按0,1,2...顺序递增写入?
- 地址对齐:擦除地址是否对齐到扇区边界(512字节)?编程地址是否对齐到短语边界(8字节)?
- 操作状态:是否试图在Flash忙(CCIF=0)时发起新操作?或者是否在代码正在运行的Flash区域执行擦写操作(需要将驱动代码复制到RAM中执行)?
- 时钟配置:
- FPVIOL(保护违规):
- 我的教训:早期调试时,曾因为忘记在每次操作前等待
CCIF标志,连续发送两个命令,导致第二个命令立即触发ACCERR。另一个坑是,在计算FCLKDIV分频值时,直接用fNVMBUS / fNVMOP作为PRDIV,而忘了公式是PRDIV = fNVMBUS / fNVMOP - 1,导致时钟频率超范围,操作不稳定。
4.3 数据存储一段时间后读取出错
- 现象:产品在高温环境或运行数月后,存储在Flash中的数据出现个别位翻转或大面积错误。
- 排查思路:
- 擦写次数超限:检查出错数据所在的扇区是否已经接近或超过了手册保证的擦写次数(P-Flash 10k次, D-Flash 50k次)。如果没有实现磨损均衡,频繁更新的数据区会很快损坏。
- 环境应力:检查产品的工作环境温度。过高的结温会显著加速Flash单元的老化,缩短数据保持时间。确保芯片散热良好。
- 电源完整性:在Flash编程/擦除瞬间,芯片电流会有一个脉冲。如果电源设计不良,可能导致电压跌落,从而影响编程/擦除的可靠性,甚至损坏存储单元。用示波器捕获编程操作时的电源引脚波形。
- 软件策略不足:是否只存了一份数据?是否没有校验机制?
- 解决方案:实施3.3.2节提到的策略:磨损均衡 + CRC校验 + 多副本冗余。对于生命周期内更新次数可能超限的数据,考虑使用外置的EEPROM或FRAM。
4.4 ADC与数字IO复用引脚的干扰
- 现象:当某个与ADC复用的引脚配置为数字输出并频繁切换时,即使不用于ADC,其他ADC通道的采样值也受到干扰。
- 原因:数字输出的快速边沿会通过电源、地或衬底耦合到模拟电路部分。
- 解决:
- 布局隔离:在PCB布局阶段,就将模拟信号路径远离高速数字信号。
- 软件隔离:在进行高精度ADC采样期间,通过寄存器临时将相邻的、未使用的复用数字IO引脚设置为高阻输入模式,减少开关噪声。
- 采样时机:避免在PWM、SPI等高速数字接口活动的高峰期进行ADC采样。可以利用定时器触发ADC,在数字系统相对安静的间隙进行采样。
最后,我想强调的是,阅读数据手册的电气特性章节,绝不是一件可有可无的事情。它像是芯片的“体检报告”和“使用说明书”。MC9S12P手册里那些关于ADC精度、NVM时序和可靠性的数字,是你产品设计目标的数学化体现。理解它们,才能在成本、性能和可靠性之间找到最佳平衡点。每次设计新电路或编写底层驱动时,把这些参数和公式再过一遍,很多潜在的问题在设计阶段就被消灭了。嵌入式开发,细节决定成败,而数据手册就是这些细节的权威字典。