
1. 项目概述与CAN总线核心价值在汽车电子、工业自动化这些对实时性和可靠性要求近乎苛刻的领域控制器局域网CAN总线几乎是嵌入式工程师的“必修课”。它不像UART那样简单点对点也不像以太网那样复杂庞大CAN总线以其多主、仲裁、高可靠的特质在嘈杂的电气环境中构建了一条稳定、高效的数据高速公路。我接触过不少项目从新能源车的电池管理系统BMS到伺服驱动器的网络化控制CAN都是那个在背后默默支撑关键数据交换的“老黄牛”。TMS320F2838x这款TI的明星DSP其内置的DCAN模块功能相当完整支持CAN 2.0B协议速率可达1Mbps并提供了32个灵活配置的消息对象也就是常说的邮箱。但功能强大也意味着配置复杂尤其是那一大堆寄存器初次接触很容易让人眼花缭乱。很多工程师习惯于直接调用TI提供的DriverLib库函数这当然快捷但一旦遇到时序问题、通信异常或者需要深度优化时不了解寄存器层面的运作机制调试就会像在黑暗中摸索。本文的目的就是带你穿透库函数的封装直抵TMS320F2838x CAN模块的寄存器核心特别是那些关乎配置安全和模块初始化的关键寄存器比如你提供的资料中提到的SDCOMP4LOCK。我们将从CAN的基本原理切入详细拆解F2838x的CAN模块架构、寄存器映射、位时序计算并最终落实到可实操的配置步骤和避坑指南上。无论你是正在评估F2838x的CAN功能还是正在调试通信故障相信这篇深入寄存器级的剖析都能给你带来直接的帮助。2. TMS320F2838x CAN模块架构深度解析要玩转寄存器首先得在心里有一张清晰的模块架构图。F2838x的DCAN模块并非一个黑盒它由几个协同工作的核心部件构成理解它们之间的关系是进行精准配置的前提。2.1 CAN核心与消息处理机制模块的核心是CAN Core它严格遵循ISO 11898-1协议负责最底层的位时序处理、帧的组装与解析、CRC校验、错误帧的发送与识别等。你可以把它想象成一个严格遵守交通规则的“交警”和“道路施工队”确保每一个数据位都能正确地被发送和接收。但交警不负责管理具体的车辆数据帧。管理车辆的任务落在了Message Handler消息处理器上。这是一个状态机它是CPU/内存与CAN Core之间的桥梁。其核心职责包括接受过滤根据预先配置好的标识符ID和掩码Mask判断总线上收到的帧是否是自己需要关心的。这就像小区的门禁系统只放行登记过的车辆消息。数据搬运负责将CAN Core接收移位寄存器里的数据搬运到指定的Message RAM消息RAM位置反之也将Message RAM中待发送的数据搬运到CAN Core的发送移位寄存器。中断与DMA控制根据配置在消息成功发送/接收、或发生错误时触发中断或DMA请求通知CPU。而Message RAM就是这片架构中的“停车场”。F2838x提供了32个车位每个车位就是一个Message Object。每个车位消息对象不仅存放车辆数据帧本身最多8字节数据还存放着这辆车的“通行证”信息29位或11位ID、车辆类型数据帧/远程帧、以及管理规则如是否允许自动回复远程帧。2.2 寄存器访问窗口IFx接口寄存器直接操作Message RAM是危险且低效的因为可能存在CPU和CAN Core同时访问同一内存区域的风险。为此DCAN模块设计了精巧的接口寄存器机制。你可以把IF1、IF2、IF3这三组寄存器看作通往Message RAM这个“停车场”的三个服务窗口。IF1 / IF2寄存器组这是主要的“读写服务窗口”。CPU需要通过它们来配置消息对象或读写消息数据。操作流程是首先将要操作的消息对象编号、以及是读还是写等命令写入IFx命令寄存器然后将具体的配置数据如ID、数据、控制位写入IFx的消息缓冲寄存器最后通过一个“触发”操作Message Handler会安全地将窗口中的数据同步到Message RAM中对应的“车位”上反之亦然。IF3寄存器组这是一个“只读观察窗口”。主要用于在不干扰Message Handler正常工作的前提下实时查看某个消息对象的内容对于调试特别有用。这种间接访问机制保证了数据的一致性是DCAN模块稳定性的重要基石。你提供的资料中的Table 28-97正是TI提供的DriverLib库函数与这些底层寄存器操作的映射关系。例如SDFM_getFilterData函数其底层本质上就是通过IFx寄存器去读取SDDATAx寄存器对应的Message RAM区域。2.3 关键模块关联SDFM与CAN你提供的资料片段始于SDFMSigma-Delta滤波器模块的SDCOMP4LOCK寄存器。这里需要厘清一个概念在F2838x中SDFM和CAN是两个独立的外设。SDFM常用于电机控制中用于处理来自Σ-Δ型ADC调制器的高速比特流将其滤波成可用的数据。SDCOMP4LOCK是SDFM模块中一个用于锁定比较器事件滤波器配置的写保护寄存器。它的作用非常关键当该寄存器的COMP位或SDCOMP4CTL位被写入1后对应的配置寄存器将被锁定只有系统复位才能解锁。这防止了程序跑飞或意外写操作破坏已经精密调整好的滤波器参数在强调安全性和稳定性的实时控制系统中是必备机制。虽然它不属于CAN模块但这种“配置锁定”的设计思想在CAN模块中同样存在例如某些测试模式寄存器理解它有助于我们建立对TI芯片外设安全设计模式的整体认知。3. CAN模块寄存器详解与配置逻辑现在让我们把焦点完全收回到CAN模块本身。配置CAN通信本质上就是配置几类关键的寄存器。3.1 控制与状态寄存器组这是CAN模块的“大脑”和“仪表盘”。CAN_CTL (控制寄存器)这是总开关。最重要的位包括INIT初始化位。置1使模块进入初始化模式此时停止总线活动可以安全配置位时序寄存器CAN_BTR需同时设置CCE位。配置完成后清零模块开始尝试同步总线。CCE配置改变使能位。只有INIT和CCE同时为1时才能写CAN_BTR寄存器。DAR禁用自动重传位。默认为0启用自动重传。在某些严格的网络容错测试中可以置1以禁用这样任何发送错误都会导致发送失败而不重试。ABO自动总线开启位。置1后当模块因错误过多进入总线关闭状态时会自动在延迟后尝试恢复无需软件干预。CAN_ES (错误与状态寄存器)这是诊断窗口。需要关注的状态位BOff总线关闭状态位。为1表示发送错误计数器溢出模块已与总线断开。这是严重的错误状态。EWarn错误警告位。为1表示发送或接收错误计数器之一超过了警告阈值通常为96。RxOk/TxOk成功接收/发送一帧后置位读该寄存器清零。可用于轮询式通信。LEC上次错误代码。指示最后一次在总线上检测到的错误类型位错误、填充错误、CRC错误等是线上故障排查的第一手资料。3.2 位时序寄存器与波特率计算这是CAN通信的“心跳”配置也是最容易出错的地方。CAN_BTR寄存器的配置直接决定了通信波特率和采样点的准确性不合理的置会导致通信不稳定甚至完全失败。CAN总线的一个位时间被划分为4个段同步段固定为1个时间份额用于总线同步。传播时间段用于补偿网络上的物理延迟。相位缓冲段1用于补偿边沿的相位误差可延长。相位缓冲段2用于补偿边沿的相位误差可缩短。采样点位于相位缓冲段1结束的位置。一个通用的经验法则是在波特率较高如500kbps、1Mbps或网络较长时采样点应设置在位时间的75%-80%左右。配置CAN_BTR需要计算两个关键参数BRP和TSEG1、TSEG2。时间份额(BRP 1) / Fcan_clk。其中Fcan_clk是CAN模块的输入时钟频率。位时间(TSEG1 TSEG2 1)个时间份额。假设系统时钟SYSCLK为200MHz我们想配置500kbps的波特率目标采样点在80%。计算位时间Tbit 1 / 500kbps 2 µs。选择时间份额通常希望时间份额在8-25ns之间。若取BRP 4则时间份额 (41)/200MHz 25ns。计算位时间包含的时间份额数2 µs / 25 ns 80。分配各段同步段固定为1。剩余79个份额分配给传播段和两个相位缓冲段。根据采样点80%TSEG1结束的位置应在80 * 80% 64个份额处。因此TSEG1 (采样点份额数 - 同步段) 64 - 1 63。TSEG2 总份额 - 同步段 -TSEG1 80 - 1 - 63 16。验证TSEG1TSEG2且TSEG2 2IP核要求条件满足。写入寄存器的值为TSEG1 62寄存器值为段长-1TSEG2 15SJW同步跳转宽度通常设为TSEG2和4中的较小值这里取2。注意上述计算是理想情况。实际中Fcan_clk可能来自分频后的系统时钟或外部晶振。务必查阅数据手册确认时钟源和精度。CAN协议要求波特率误差小于1%使用片内振荡器时在高波特率下可能无法满足此时必须使用外部高精度晶振。3.3 消息对象配置详解32个消息对象是CAN通信的实体。每个对象通过一组寄存器在Message RAM中通过IFx接口访问进行配置主要包含MSGID消息标识符。决定帧的优先级值越小优先级越高和过滤条件。支持标准帧11位和扩展帧29位。DLC数据长度代码。0-8表示数据场字节数。数据场最多8字节的用户数据。控制场包含关键的控制位MsgVal消息对象有效位。必须置1该邮箱才参与接收过滤或发送调度。TxIE/RxIE发送/接收中断使能。置1则在对应事件发生时产生中断。IntPnd中断挂起位。当发生中断事件时由硬件置1软件通过IFx命令寄存器的ClrIntPnd位清零。UMask使用标识符掩码位。置1后本消息对象将使用CAN_IFnMSK寄存器中的全局掩码或自身专用的掩码如果支持进行过滤。Dir方向位。0接收1发送。NewDat新数据位。对于接收对象收到新帧时置1对于发送对象软件写入新数据后置1发送成功后由硬件清零。配置一个接收邮箱的典型流程是通过IF1寄存器设置Arb和Dir为接收写入目标MSGID和MASK设置MsgVal1和RxIE1然后触发写入Message RAM。4. 从零开始CAN模块初始化与收发实战理解了原理我们来看如何一步步让CAN模块跑起来。以下代码基于TI的DriverLib库但我会同步解释其背后的寄存器操作。4.1 初始化步骤与代码实现#include driverlib.h #include device.h // 假设使用CAN-A GPIO配置为CAN功能 #define CANA_BASE CANA_BASE #define CANA_RX_PIN GPIO_PIN_0 #define CANA_TX_PIN GPIO_PIN_1 #define CANA_RX_PIN_CONFIG GPIO_0_CANA_RX #define CANA_TX_PIN_CONFIG GPIO_1_CANA_TX void CANA_Init(uint32_t sysClkFreq, uint32_t bitRate) { // 步骤1: 使能CAN模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA); // 步骤2: 配置GPIO引脚为CAN功能 // 先配置GPIO Mux寄存器再配置Mux寄存器避免毛刺 GPIO_setPinConfig(CANA_RX_PIN_CONFIG); GPIO_setPinConfig(CANA_TX_PIN_CONFIG); // 设置输入异步模式禁用上拉CAN收发器通常有终端电阻 GPIO_setQualificationMode(CANA_RX_PIN, GPIO_QUAL_ASYNC); GPIO_setPadConfig(CANA_RX_PIN, GPIO_PIN_TYPE_STD); GPIO_setPadConfig(CANA_TX_PIN, GPIO_PIN_TYPE_STD); // 步骤3: 软件复位CAN模块 (可选上电后默认在复位状态) CAN_initModule(CANA_BASE); // 步骤4: 进入初始化模式并允许配置位时序 CAN_setMode(CANA_BASE, CAN_MODE_INIT); while(!CAN_isInitModeEnabled(CANA_BASE)) {} // 等待进入初始化模式 CAN_enableConfigChange(CANA_BASE); // 设置CCE位 // 步骤5: 配置位时序寄存器 (以200MHz系统时钟目标1Mbps为例) // 计算参数BRP1, TSEG15, TSEG22, SJW1 // 位时间 (1521) * (11)/200MHz 9 * 10ns 90ns - 约11.11Mbps (需调整) // 更实际的1Mbps配置BRP9, TSEG16, TSEG21, SJW1 // 时间份额 (91)/200MHz 50ns // 位时间 (1611) * 50ns 450ns - 约2.22Mbps (仍然不对) // **注意这是演示实际必须根据时钟精确计算** // 假设我们使用25MHz外部晶振作为CAN时钟源配置500kbps // Fcan_clk 25MHz // 目标位时间 Tbit 2us // 选择时间份额 Tq 25ns (BRP0) // 总时间份额数 2us / 25ns 80 // 设采样点75%则TSEG1结束于 80*0.7560, TSEG1 60-159, TSEG280-1-5920 // SJW min(4, TSEG2) 4 // 寄存器值BRP0, TSEG158, TSEG219, SJW3 CAN_BIT_TIMING_PARAMS bitTiming; bitTiming.bitRatePrescaler 0; // BRP bitTiming.timeSegment1 58; // TSEG1 (寄存器值段长-1) bitTiming.timeSegment2 19; // TSEG2 (寄存器值段长-1) bitTiming.synchronizationJumpWidth 3; // SJW (寄存器值宽度-1) CAN_setBitTiming(CANA_BASE, sysClkFreq, bitRate, bitTiming); // 步骤6: 退出初始化模式开始总线同步 CAN_disableConfigChange(CANA_BASE); CAN_setMode(CANA_BASE, CAN_MODE_NORMAL); while(CAN_isInitModeEnabled(CANA_BASE)) {} // 等待退出初始化模式 }4.2 配置一个发送与接收消息对象// 配置一个发送邮箱消息对象1 void CANA_SetupTxMailbox(uint32_t msgId, bool isExtendedId) { // 使用IF1寄存器组进行配置 CAN_IF_CMD_MASK_REG cmdMaskReg; CAN_IF_OBJ_CONTROL_REG ctrlReg; CAN_IF_OBJECT_REG msgObjReg; // 1. 设置命令掩码选择消息对象1写所有数据清除中断挂起位设置TxRqstNewDat cmdMaskReg.bits.MSG_NUM 1; // 操作邮箱1 cmdMaskReg.bits.DATA_B 1; // 写数据字节0-3 cmdMaskReg.bits.DATA_A 1; // 写数据字节4-7 cmdMaskReg.bits.CLR_INTPND 1; // 清除可能存在的IntPnd cmdMaskReg.bits.TXRQST_NEWDAT 1; // 对于发送邮箱此位置1表示请求发送 cmdMaskReg.bits.WR_RD 1; // 写操作 cmdMaskReg.bits.ARB 1; // 写仲裁区ID cmdMaskReg.bits.CONTROL 1; // 写控制区 // 2. 设置控制寄存器邮箱有效方向为发送使能发送中断 ctrlReg.bits.MsgVal 1; // 邮箱有效 ctrlReg.bits.Dir 1; // 方向发送 ctrlReg.bits.TxIE 1; // 使能发送中断 ctrlReg.bits.NewDat 0; // 新数据位初始为0 ctrlReg.bits.IntPnd 0; // 中断挂起位初始为0 // 3. 设置消息对象寄存器标识符和掩码 msgObjReg.bits.ID msgId; // 设置消息ID if(isExtendedId) { msgObjReg.bits.Xtd 1; // 扩展帧 } else { msgObjReg.bits.Xtd 0; // 标准帧 } msgObjReg.bits.Mask 0x1FFFFFFF; // 对于发送掩码通常全为1不用于过滤 // 4. 通过DriverLib函数写入配置 CAN_writeMsgObject(CANA_BASE, 1, msgObjReg, ctrlReg, cmdMaskReg, 0); } // 配置一个接收邮箱消息对象2使用标识符掩码 void CANA_SetupRxMailboxWithMask(uint32_t msgId, uint32_t mask, bool isExtendedId) { CAN_IF_CMD_MASK_REG cmdMaskReg; CAN_IF_OBJ_CONTROL_REG ctrlReg; CAN_IF_OBJECT_REG msgObjReg; cmdMaskReg.all 0; cmdMaskReg.bits.MSG_NUM 2; cmdMaskReg.bits.WR_RD 1; cmdMaskReg.bits.ARB 1; cmdMaskReg.bits.CONTROL 1; cmdMaskReg.bits.UMASK 1; // 关键使用标识符掩码 ctrlReg.all 0; ctrlReg.bits.MsgVal 1; ctrlReg.bits.Dir 0; // 方向接收 ctrlReg.bits.RxIE 1; // 使能接收中断 ctrlReg.bits.UMask 1; // 使用掩码 msgObjReg.all 0; msgObjReg.bits.ID msgId; msgObjReg.bits.Mask mask; // 设置接收掩码 if(isExtendedId) { msgObjReg.bits.Xtd 1; msgObjReg.bits.MXtd 1; // 掩码扩展标识符位 } CAN_writeMsgObject(CANA_BASE, 2, msgObjReg, ctrlReg, cmdMaskReg, 0); }4.3 发送与接收数据// 发送一帧数据 bool CANA_SendData(uint8_t mailboxNum, uint8_t *data, uint8_t dlc) { if(dlc 8) return false; CAN_IF_CMD_MASK_REG cmdMaskReg; cmdMaskReg.all 0; cmdMaskReg.bits.MSG_NUM mailboxNum; cmdMaskReg.bits.DATA_A 1; cmdMaskReg.bits.DATA_B 1; cmdMaskReg.bits.TXRQST_NEWDAT 1; // 请求发送并标记新数据 cmdMaskReg.bits.WR_RD 1; // 准备数据注意数据在寄存器中的存储顺序 uint32_t dataLow *(uint32_t*)data; uint32_t dataHigh *(uint32_t*)(data4); // 使用IF2寄存器组发送数据避免与可能正在进行的IF1操作冲突 CAN_sendData(CANA_BASE, mailboxNum, cmdMaskReg, dataLow, dataHigh, dlc); return true; } // 在中断服务例程中读取接收到的数据 __interrupt void CANA_ISR(void) { uint32_t intStatus CAN_getInterruptCause(CANA_BASE); if(intStatus 0x8000) { // 状态改变中断或错误中断读取CAN_ES寄存器处理 uint32_t esReg CAN_getErrorStatus(CANA_BASE); // ... 处理错误或状态变化 CAN_clearErrorStatus(CANA_BASE, esReg); // 清除状态位 } else if(intStatus 1 intStatus 32) { // 消息对象中断intStatus即为邮箱号 uint8_t mailboxNum (uint8_t)intStatus; uint8_t rxData[8]; uint32_t dataLow, dataHigh; uint16_t dlc; // 使用IF1寄存器组读取数据并清除IntPnd位 CAN_readMsgObject(CANA_BASE, mailboxNum, dataLow, dataHigh, dlc, true); *(uint32_t*)rxData dataLow; *(uint32_t*)(rxData4) dataHigh; // 处理接收到的数据 rxData[0..dlc-1] // ... // 注意CAN_readMsgObject 的最后一个参数为 true 时会自动清除 IntPnd } // 清除PIE中断标志 CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9); // CAN-A属于PIE组9 }5. 高级功能与调试技巧5.1 测试模式的应用你提供的资料中详细说明了环回、静默等测试模式。这些模式在开发阶段极其有用。内部环回模式用于模块自检无需外部连接。配置方法CAN_enableTestMode(CANA_BASE, CAN_TEST_LBACK);在此模式下发送的帧会被内部接收可用于验证软件配置和中断逻辑是否正确。注意此模式下会忽略应答错误因为是自己发给自己。静默模式用于监听总线而不干扰。配置方法CAN_enableTestMode(CANA_BASE, CAN_TEST_SILENT);这在分析现有CAN网络流量、排查总线冲突时非常有用。模块只接收不发送任何显性位包括ACK位。环回静默模式结合两者用于在不连接真实总线的情况下完全模拟通信流程进行集成测试。5.2 错误处理与总线恢复可靠的CAN通信必须包含完善的错误处理。监控错误计数器可以通过CAN_getErrorCount函数读取发送和接收错误计数器。当任一个计数器值超过127时EWarn标志置位发送错误计数器超过255时模块进入BOff状态。总线关闭恢复如果启用了ABO自动总线开启模块会在等待CAN_BTR中配置的恢复时间后自动尝试恢复。否则需要软件检测到BOff后手动执行“进入初始化模式 - 清零错误计数器 - 退出初始化模式”的流程。if(CAN_getErrorStatus(CANA_BASE) CAN_STATUS_BOFF) { // 1. 进入初始化模式 CAN_setMode(CANA_BASE, CAN_MODE_INIT); // 2. 可选等待或延时 DEVICE_DELAY_US(1000); // 3. 退出初始化模式开始恢复序列等待129个总线空闲位 CAN_setMode(CANA_BASE, CAN_MODE_NORMAL); }5.3 使用DMA提升效率对于高吞吐量应用频繁的CAN中断可能成为CPU负担。F2838x的CAN模块支持DMA可以将特定邮箱的收发事件与DMA通道绑定实现数据的自动搬运。配置大致流程使能CAN模块的DMA请求在相关控制寄存器中配置。配置DMA控制器将源地址设为CAN的IFx数据寄存器或Message RAM的特定区域目的地址设为应用程序的数据缓冲区。在CAN邮箱控制寄存器中设置DMA使能位。 这样当指定邮箱成功发送或接收时会触发DMA请求自动完成数据搬运大大减轻CPU中断负载。6. 常见问题排查与实战心得在多年的项目实践中我总结了一些CAN调试的常见“坑点”和解决思路。6.1 通信失败排查清单现象可能原因排查步骤完全无通信无波形1. 模块未初始化2. GPIO配置错误3. 外部收发器故障或未供电4. 终端电阻缺失120Ω1. 检查INIT位是否已清零。2. 用示波器或逻辑分析仪检查CAN_TX引脚是否有波形。若无检查GPIO Mux配置。3. 检查收发器VCC、接地测量CANH/CANL差分电压。4. 在总线两端测量电阻应为60Ω左右。能发送无法接收1. 接收邮箱未正确配置或未使能2. 标识符或掩码不匹配3. 接收中断未使能或未处理4. 总线仲裁失败发送的帧被覆盖1. 确认接收邮箱的MsgVal1Dir0。2. 检查发送ID与接收邮箱ID及掩码是否匹配。使用环回模式测试。3. 检查RxIE位和PIE中断配置。4. 检查发送优先级ID值。偶发性通信错误错误计数器增长1. 波特率不匹配或精度不足2. 采样点设置不合理3. 总线布线问题过长、分支、阻抗不连续4. 电磁干扰1. 用示波器测量位时间与理论值对比。确保所有节点波特率、采样点一致。2. 调整TSEG1、TSEG2将采样点设置在75%-80%。3. 检查总线拓扑确保是菊花链结构两端有终端电阻。4. 检查屏蔽层接地远离干扰源。进入总线关闭状态1. 持续硬件错误如短路2. 软件频繁发送错误帧3. 波特率严重失配1. 检查物理层。2. 检查发送逻辑避免在总线繁忙时持续请求发送。3. 核对所有节点的CAN_BTR配置。6.2 关键调试技巧善用环回模式在硬件连接前先用环回模式验证整个软件栈配置、发送、中断接收是否正常。这是隔离软硬件问题的第一步。逻辑分析仪是利器投资一个支持CAN协议解码的逻辑分析仪如Saleae。它能直观地展示总线上的每一帧、每一个位包括ID、数据、错误帧是分析时序、仲裁、错误原因不可替代的工具。关注LEC寄存器发生错误时第一时间读取CAN_ES寄存器中的LEC字段。它能告诉你最后出错的类型位错误、填充错误、CRC错误等极大缩小排查范围。初始化顺序很重要一定要先进入初始化模式INIT1再使能配置改变CCE1才能配置CAN_BTR。配置完成后先清零CCE再清零INIT。这个顺序不能乱。消息对象配置后要“激活”通过IFx寄存器配置好一个邮箱后必须确保MsgVal位被置为1并且通过正确的命令掩码触发了一次对Message RAM的写操作这个邮箱才真正生效。仅仅配置IFx寄存器而不触发传输是无效的。最后再分享一个关于SDCOMP4LOCK这类写保护寄存器的心得在复杂的系统或安全关键应用中对于关键的外设配置如CAN的位时序、电机驱动的PWM死区、ADC的采样窗口在系统初始化完成后将其对应的锁定位置1是一种有效的防软件跑飞干扰的“加固”手段。虽然F2838x的CAN核心寄存器没有提供类似的硬件锁定但我们在软件设计上可以借鉴这种思想例如将关键配置放在一个独立的、受保护的初始化函数中并在完成后不再提供修改这些配置的接口。