TMS320C6743外设时序深度解析:eHRPWM、I2C、UART与Timer实战指南

1. 项目概述与核心价值

在嵌入式系统,尤其是基于TMS320C6743这类高性能DSP的硬件开发中,最让人头疼的往往不是算法实现,而是如何让各个外设“听话”地、稳定地协同工作。你是否遇到过PWM输出在关键时刻“卡顿”,I2C通信时好时坏,或者UART莫名其妙地丢数据?很多时候,问题的根源并非代码逻辑错误,而是隐藏在芯片数据手册电气特性章节里的那些时序参数没有被正确理解和配置。这些参数,比如eHRPWM的td(TZ-PWM)HZ(故障触发到PWM高阻态的延迟时间)、I2C的tsu(SDA-SCLH)(数据建立时间),就像是每个外设与生俱来的“生理特性”和“反应速度”,不摸清它们,系统就永远在临界状态徘徊。

本文的目的,就是带你深入TMS320C6743的外设“内脏”,把那些枯燥的时序表格和寄存器位域,翻译成硬件工程师和驱动开发者能直接用的“实战手册”。我们不会停留在简单的寄存器地址罗列,而是聚焦于eHRPWM、Timer、I2C和UART这四个最常用也最易出问题的外设,拆解其关键时序参数背后的物理意义、对系统稳定性的影响,以及如何在软件配置和硬件设计上满足这些要求。无论是正在画原理图、做PCB布局,还是在编写底层驱动、进行系统联调,理解这些内容都能让你避开无数深坑,从“能跑”进化到“跑得稳、跑得准”。接下来,我们就从最考验实时性的eHRPWM开始。

2. eHRPWM模块:高精度与安全性的时序博弈

eHRPWM(Enhanced High-Resolution Pulse Width Modulator)是C6743用于电机控制、数字电源等场景的核心利器。它的“增强”和“高分辨率”特性,使其在精度和灵活性上远超普通PWM,但随之而来的时序约束也更为复杂。其核心时序逻辑围绕着精准的波形生成快速的安全响应两条主线展开。

2.1 核心时序参数深度解读

数据手册中的时序表格(如Table 6-64, 6-65)是设计的金科玉律,但直接看MIN/MAX值容易让人迷惑。我们需要结合应用场景来理解。

1. 基础输出时序tw(PWM)参数tw(PWM)(Pulse duration)定义了PWM输出高电平或低电平的最小脉冲宽度,其典型值为20ns(最小值)。这个参数决定了PWM能够输出的最高理论频率。例如,一个占空比为50%的方波,其半周期必须大于等于tw(PWM)。因此,理论最高频率Fmax = 1 / (2 * tw(PWM))。当tw(PWM)=20ns时,Fmax = 1 / (40e-9) = 25 MHz。但这只是芯片引脚驱动能力的极限,实际最高频率还受限于eHRPWM模块的时钟源(TBCLK)频率和分辨率。如果你配置出的PWM频率接近这个极限,波形失真(边沿变缓)的风险会急剧增加。

2. 同步信号时序tw(SYCIN)tw(SYNCOUT)同步功能用于让多个eHRPWM模块的时基计数器对齐,实现多路同步输出。

  • tw(SYCIN):同步输入脉冲的最小宽度。手册要求,无论同步信号对于TBCLK是同步还是异步,其脉宽都必须大于等于2 * tc(SCO)。这里的tc(SCO)是系统低速时钟OSCIN的周期。假设OSCIN为20MHz(周期50ns),则同步脉冲宽度至少需要100ns。在设计同步信号源(如来自另一个eHRPWM或GPIO模拟)时,必须保证脉冲宽度满足此要求,否则可能无法可靠触发同步。
  • tw(SYNCOUT):同步输出脉冲的宽度,固定为8 * tc(SCO)个周期。这是一个输出特性,告诉你同步信号会持续多长时间,方便你设计下游电路的捕获逻辑。

3. 关键安全响应时序:Trip-Zone这是eHRPWM设计中最需要关注的时序,直接关系到系统的安全性和可靠性。Trip-Zone(TZ)是故障保护引脚,当外部电路检测到过流、过压等故障时,会拉低TZ引脚,eHRPWM必须立即响应,将PWM输出强制置为安全状态(高、低或高阻态)。

  • td(TZ-PWM)HZ:从TZ故障输入有效到PWM输出变为高阻态的延迟时间。手册给出最大值为25ns(无额外可编程延迟时)。这个参数意味着,从故障发生到PWM功率管被安全关断,存在一个最大25ns的“盲区”。在这段时间内,故障可能仍在持续。因此,外部硬件保护电路(如比较器、驱动芯片的DESAT保护)的响应速度必须快于这个时间,或者能承受这25ns的过载。在布局时,TZ信号线应尽可能短,远离噪声源,以确保该延迟的确定性。
  • tw(TZ):TZ输入信号需要保持有效的最小脉宽。异步模式下为1 * tc(SCO),同步模式下为2 * tc(SCO)。如果故障信号是一个窄毛刺,其宽度小于此值,eHRPWM模块可能会忽略它。这既是抗扰度的要求(避免噪声误触发),也要求你的故障检测电路能产生足够宽的有效信号。

实操心得:TZ引脚的硬件设计要点

  1. 上拉电阻:TZ引脚内部通常无上拉,外部必须接一个上拉电阻(如10kΩ)至VDD,确保空闲时为无效高电平,避免因引脚悬空导致误保护。
  2. 滤波电路:对于噪声较大的环境,可在TZ引脚增加一个RC低通滤波器(如100Ω + 100pF),但需重新计算滤波后的脉宽,确保仍能满足tw(TZ)的要求。
  3. 优先级与恢复:TZ动作的优先级最高。一旦触发,即使TZ信号恢复,PWM输出也不会自动恢复,必须由软件清除TZ标志位并重新使能PWM输出。这个“软件恢复”机制是安全设计的一部分,防止故障未排除时自动重启。

2.2 高分辨率(MEP)的时序考量

eHRPWM的高分辨率模式通过微边沿定位(MEP)技术,在传统的计数器比较点之间插入更精细的步进,从而实现皮秒(ps)级的延时调整,提升有效PWM分辨率。

关键参数是MEP步进尺寸(MEP step size),典型值为200ps。但这个值不是固定的,它会随温度和电压漂移:

  • 高温、低电压:MEP步进尺寸会增大。这意味着同样的MEP控制值产生的延时变长,可能导致边沿位置偏离预期。
  • 低温、高电压:MEP步进尺寸会减小

这对设计意味着什么?如果你的应用对PWM边沿的绝对精度要求极高(例如某些精密电源拓扑),就不能依赖MEP的绝对时间值。更可靠的做法是:

  1. 闭环校准:在系统启动或定期运行时,通过一个高精度的时间测量电路(如ECAP模块)来实际测量PWM边沿,并反向校准MEP系数。
  2. 降额使用:在计算PWM最小占空比或死区时间时,考虑MEP步进在最坏情况(最大步进尺寸)下的误差,留出足够余量。
  3. 关注相对精度:对于电机控制等更关注波形对称性和频率稳定性的应用,MEP的温度漂移影响相对较小,因为所有通道的漂移趋势一致。

2.3 寄存器配置与时钟树关联

时序的实现最终落脚于寄存器配置。以配置一个对称向上-向下计数、带死区的PWM为例,关键寄存器包括TBCTL(时基控制)、CMPA/CMPB(比较值)、AQCTLA/AQCTLB(动作限定)、DBCTL(死区控制)

这里有一个极易忽略的细节:时基时钟TBCLK的来源。TBCLK通常由系统时钟SYSCLKOUT分频而来。SYSCLKOUT的频率(例如456MHz)和分频比直接决定了PWM时基的计数频率,进而决定了PWM的时间分辨率。计算公式为:PWM_Time_Resolution = 1 / (SYSCLKOUT / HSPCLKDIV / CLKDIV)其中HSPCLKDIVCLKDIV是TBCTL中的分频器位域。你必须根据所需的PWM频率和分辨率,反推出合适的分频值。一个常见的错误是分频过小,导致计数器溢出过快,无法生成低频率的PWM;或者分频过大,导致分辨率过低。

注意事项:死区时间的计算死区时间由DBRED(上升沿延迟)和DBFED(下降沿延迟)寄存器值决定。其实际时间 =寄存器值 * TBCLK周期。例如,TBCLK=100MHz(周期10ns),DBRED=50,则死区时间为500ns。务必确保计算出的死区时间大于功率器件(如MOSFET、IGBT)的开启/关断时间,并留有一定余量,否则会导致上下桥臂直通短路。

3. Timer模块:精准定时的基石

TMS320C6743的Timer64P模块功能强大,可配置为64位或2个独立的32位定时器,支持输入捕获、比较匹配和看门狗等功能。其时序参数相对简单,但理解其边界条件对实现精准定时至关重要。

3.1 输入捕获时序要求

当Timer配置为捕获模式,用于测量外部脉冲宽度或频率时,需要关注输入信号TM64Px_IN12的时序要求(Table 6-69)。

  1. 最小周期tc(TM64Px_IN12):输入信号的最小周期为4P,其中POSCIN时钟的周期。假设OSCIN为20MHz(P=50ns),则输入信号最小周期为200ns,即最高输入频率为5MHz。这是由内部同步电路决定的,超过此频率的信号可能无法被正确捕获。
  2. 高低脉冲宽度tw(TINPH)/tw(TINPL):要求高电平和低电平的脉宽均在周期C的45%到55%之间。这意味着输入信号的占空比必须在45%~55%范围内,才能被可靠识别为一个周期。对于占空比变化很大的信号(如PWM),直接用作定时器时钟输入可能不满足此要求,需要先通过外部电路(如施密特触发器、比较器)整形成方波。
  3. 边沿转换时间tt(TM64Px_IN12):输入信号的上升/下降沿时间必须小于0.25P或10ns中的较小者。以P=50ns为例,0.25P=12.5ns,与10ns取小,则要求边沿时间小于10ns。缓慢变化的边沿(例如来自RC电路的信号)会引入定时不确定性,甚至无法触发内部边沿检测电路。解决方案是在信号进入Timer引脚前,使用一个高速比较器或施密特触发器(如SN74LVC1G17)进行整形。

3.2 输出比较与PWM模式时序特性

当Timer配置为比较模式或PWM输出模式时,关注输出引脚TM64P0_OUT12的特性(Table 6-70)。

参数tw(TOUTH)tw(TOUTL)定义了输出高/低电平的最小脉冲宽度,均为4P。同样以OSCIN=20MHz(P=50ns)为例,则最小脉宽为200ns。这决定了Timer自身产生的PWM信号最高频率。对于需要更高频率PWM的应用,应优先使用专用的eHRPWM模块。

3.3 寄存器配置与实战要点

Timer的灵活性体现在其丰富的寄存器集上,如TIM12/TIM34(计数器)、PRD12/PRD34(周期)、CMP0-CMP7(比较)、CAP12/CAP34(捕获)。

一个关键配置:时钟源与预分频。Timer的计数时钟可以来自内部OSCINPLL0_SYSCLK2或外部引脚TM64Px_IN12。通过TGCR(Timer Global Control Register)中的TIMMODETIM12RS/TIM34RS等位进行配置。常见的坑是忽略了预分频器。即使你选择了高速的SYSCLK2作为源,如果不设置合适的预分频值(PSC字段),计数器会飞速溢出,导致无法实现毫秒或秒级的定时。定时周期的计算公式为:定时周期 = (PRD寄存器值 + 1) * (PSC分频系数 + 1) / 输入时钟频率

输入捕获模式下的滤波: Timer的输入捕获通道通常带有数字滤波器(通过CTL寄存器配置),可以滤除指定宽度的毛刺。例如,设置滤波器宽度为5个采样时钟周期,那么宽度小于5个时钟周期的脉冲将被忽略。在噪声环境中,合理设置滤波器能极大提高捕获的可靠性,但也会引入额外的延迟,在测量高频信号时需要权衡。

4. I2C接口:可靠通信的时序约束

I2C是一种简单却对时序极其敏感的两线制串行总线。C6743的I2C模块支持标准模式(100kbps)和快速模式(400kbps)。数据手册中的Table 6-72和6-73详细规定了在各种模式下的时序参数,这是总线可靠性的“宪法”。

4.1 关键时序参数与硬件设计

理解这些参数,才能设计出可靠的上下拉电阻和布局。

  1. 总线速度与周期tc(SCL)

    • 标准模式:最大10μs,即最小100kHz。
    • 快速模式:最大2.5μs,即最小400kHz。注意:这是标准规定的最大值。实际配置的时钟频率(通过ICCLKICCLKH寄存器计算)必须小于等于此值。通常我们会留有一定余量,例如在快速模式下配置为380kbps。
  2. 建立时间tsu(SDA-SCLH)与保持时间th(SDA-SCLL)

    • tsu(SDA-SCLH):数据(SDA)在SCL时钟上升沿到来之前必须保持稳定的时间。快速模式下最小为100ns。
    • th(SDA-SCLL):数据(SDA)在SCL时钟下降沿之后必须继续保持稳定的时间。快速模式下最小为0ns(标准I2C),但C6743要求最大0.9μs。这两个时间是I2C通信稳定的核心。它们主要由主设备的时钟驱动能力和从设备的采样窗口决定。在软件上,我们通过配置ICCLKLICCLKH寄存器来产生满足要求的SCL时钟。在硬件上,过大的总线电容(Cb,最大400pF)和过弱的上拉电阻会导致SDA/SCL信号边沿变缓,从而吃掉宝贵的建立和保持时间。
  3. 上升/下降时间trtf: 快速模式下,要求trtf最大为(20 + 0.1*Cb) ns,且不超过300ns。Cb是总线电容。这个公式直接指导我们如何选择上拉电阻Rp。 根据RC充电公式,上升时间tr ≈ 2.2 * Rp * Cb。假设总线电容Cb为200pF,要求tr < 20 + 0.1*200 = 40ns。则Rp < tr / (2.2 * Cb) = 40e-9 / (2.2 * 200e-12) ≈ 90.9Ω。 这个计算值非常小!实际上,考虑到驱动器的下拉强度,上拉电阻不能太小,否则会导致低电平电压VOL超标。因此,在快速模式下,必须严格控制总线布线,减小寄生电容(Cb),才能使用阻值合理的上拉电阻(通常为1kΩ~3.3kΩ)。对于长导线或多设备总线,可能必须使用专用的I2C缓冲器或集线器。

4.2 寄存器配置与时钟计算

I2C模块的时钟配置是软件工作的重点。输入时钟I2C_CLK通常来源于PLL0_SYSCLK2。目标SCL时钟频率由ICCLK(预分频)和ICCLKL/ICCLKH(低/高电平分频)寄存器共同决定。

时钟计算步骤(以配置400kHz快速模式为例):

  1. 确定I2C_CLK频率,例如CLK = 24 MHz
  2. 设置预分频器ICPSC,使得I2C_CLK / (ICPSC+1)后的时钟I2C_PSC_CLK在7-12MHz范围内(推荐)。若CLK=24MHz,取ICPSC=1,则I2C_PSC_CLK = 24 / (1+1) = 12 MHz
  3. 计算ICCLKLICCLKH。目标SCL周期Tsc1 = 1 / 400kHz = 2500 nsI2C_PSC_CLK周期Tpsc = 1 / 12MHz ≈ 83.33 ns
    • ICCLKL寄存器值决定了SCL低电平时间:Tlow = (ICCLKL + 5) * Tpsc
    • ICCLKH寄存器值决定了SCL高电平时间:Thigh = (ICCLKH + 5) * Tpsc通常设置对称占空比,即Tlow ≈ Thigh ≈ Tsc1 / 2 = 1250 ns。 则ICCLKL = ICCLKH = (1250 / 83.33) - 5 ≈ 15 - 5 = 10
  4. 验证:Tsc1_calc = (10+5 + 10+5) * 83.33 = 30 * 83.33 ≈ 2500 ns,符合要求。

常见问题:I2C通信失败排查

  1. 波形畸形,边沿缓慢:首先用示波器测量SDA和SCL波形。边沿圆滑通常是上拉电阻过大或总线电容过大导致。尝试减小上拉电阻(如从4.7kΩ换为2.2kΩ)或检查布线,移除不必要的并联电容。
  2. ACK信号被拉低但主设备收不到:检查从设备地址是否正确,以及从设备是否处于忙状态(如EEPROM正在写内部存储)。测量SDA线在ACK位期间的电压,看是否被从设备正确拉低。
  3. 随机性错误:可能是噪声干扰。确保SDA/SCL线远离高频噪声源(如开关电源、电机驱动线),并尽量使用双绞线。可以在信号线上串联一个几十欧姆的小电阻(如22Ω-100Ω),与线缆电容构成低通滤波器,抑制振铃。
  4. 软件卡在BUSY状态:检查总线上是否有设备(包括主设备自身)在异常情况下拉低了SDA线,导致总线死锁。实现一个超时恢复机制,在超时后尝试发送多个SCL时钟脉冲(9个以上)并释放SDA,以“清理”总线状态。

5. UART接口:异步串行的时序容错

UART是异步通信,没有时钟线,其可靠性完全依赖于收发双方对波特率的一致性和对数据帧格式的严格遵守。C6743的UART模块支持高达3Mbps的波特率,其时序参数主要围绕波特率容错和数据位采样展开。

5.1 波特率生成与误差分析

UART的波特率由输入时钟UART_CLK(通常为PLL0_SYSCLK2)和两个分频寄存器DLL(Divisor LSB Latch)和DLH(Divisor MSB Latch)共同决定。公式为:波特率 = UART_CLK / (16 * 分频因子)波特率 = UART_CLK / (13 * 分频因子),取决于过采样模式(OSM_SEL位,x16或x13)。

关键点在于分频因子的计算和误差控制。分频因子 =DLH:DLL组成的16位值。例如,UART_CLK = 24 MHz,目标波特率Baud = 115200,采用x16模式。 理论分频因子N = 24,000,000 / (16 * 115200) ≈ 13.0208。 取整后N = 13。 实际波特率Baud_actual = 24,000,000 / (16 * 13) ≈ 115384.6。 波特率误差Error = (115384.6 - 115200) / 115200 ≈ 0.16%

误差要求:通常,异步通信要求收发双方的波特率累积误差小于2.5%(对于8N1格式,在10位帧内误差不超过1/4个位时间)。上述0.16%的误差完全可接受。如果误差过大(例如使用非标准晶振频率),会导致采样点逐渐偏移,最终造成帧错误。在选择系统时钟和配置分频器时,务必计算实际波特率及其误差

5.2 接收时序要求与抗干扰设计

UART接收端对输入信号RXDn的时序有明确要求(Table 6-75):

  • tw(URXSB):起始位脉宽必须在0.96U1.05U之间(U为位时间)。即起始位必须在理论宽度的±4%以内。这要求发送端的波特率必须准确。
  • tw(URXDB):数据位脉宽同样必须在0.96U1.05U之间。

这些参数是UART模块内部采样判决的依据。为了对抗噪声和毛刺,UART采用了过采样技术(x16或x13)。以x16模式为例,它在每个位时间内采样16次,通常取第7、8、9次采样的多数值作为该位的最终值。这种机制可以容忍信号线上一定程度的抖动和噪声。

硬件设计注意事项:

  1. 电平转换:如果连接的是RS-232电平设备(如PC串口),必须使用MAX3232等电平转换芯片。直接连接TTL电平会损坏接口。
  2. 长距离传输:对于超过1米的传输距离,应考虑使用RS-485差分标准,并添加终端匹配电阻(120Ω)。
  3. 隔离通信:在工业噪声环境或需要电气隔离的场合,应使用光耦(如6N137)或数字隔离器(如ADuM1201)对UART的TX、RX信号进行隔离。注意选择高速光耦以满足高波特率要求,并设计好隔离两侧的独立电源。

5.3 寄存器配置与FIFO使用

除了基本的LCR(线控寄存器,配置数据位、停止位、奇偶校验)、DLL/DLH(波特率)寄存器外,FCR(FIFO控制寄存器)的配置对性能影响巨大。

C6743的UART包含16字节的发送和接收FIFO。

  • 接收FIFO触发级别:可以设置为1、4、8或14字节。当接收FIFO中的数据达到设定阈值时,会触发接收中断或DMA请求。合理设置此值可以有效减少中断频率,降低CPU负载。例如,在115200波特率下,接收一个字节约需87μs。如果每收到一个字节就产生一次中断,CPU负担很重。设置为8字节触发,则约700μs才中断一次,效率更高。
  • 自动流控(仅UART0支持):通过MCR寄存器使能RTS/CTS硬件流控。当接收FIFO快满时,自动拉高RTS通知对方暂停发送;当空闲时,拉低RTS通知对方继续。在多任务或高速通信中,启用硬件流控是防止数据丢失的关键

实操心得:UART调试技巧

  1. 环回测试:在软件初始化后,首先将MCR寄存器中的环回位(Loopback)置1,然后自发自收。这是验证UART底层驱动和波特率配置是否正确的最快方法。
  2. 示波器测量:用示波器测量TX引脚波形,测量一个位的时间(例如115200波特率下应为8.68μs),验证波特率是否准确。观察起始位是否为低电平,数据位是否符合发送数据,停止位是否为高电平。
  3. 中断与DMA选择:对于低波特率(< 9600)或非连续通信,使用中断模式即可。对于高波特率(> 115200)或连续数据流(如GPS模块、蓝牙模块),强烈建议使用DMA进行收发,可以彻底解放CPU,避免因中断响应延迟导致FIFO溢出。
  4. 超时处理:在接收数据时,除了FIFO触发中断,还应启用接收超时中断(或软件计时)。当收到部分数据但未达到FIFO触发阈值,且一段时间内无新数据时,超时中断能让你及时处理已接收的不完整数据包。

6. 外设时钟与电源管理(PSC)的关联

所有外设的时序都建立在正确的时钟和电源基础上。TMS320C6743的Power and Sleep Controller (PSC)模块负责管理各模块的时钟开关和复位状态。如果忽略了PSC配置,即使寄存器写得正确,外设也可能无法工作。

6.1 模块状态与初始化流程

PSC为每个模块(如UART0、I2C1、eHRPWM0)定义了几种状态(Table 6-80),最常见的是:

  • SwRstDisable:软件复位禁用状态。这是大多数外设上电后的默认状态。在此状态下,模块时钟关闭,复位信号有效。你无法访问该模块的寄存器
  • Enable:使能状态。模块时钟开启,复位释放。这是外设正常工作的状态。

因此,初始化任何外设的第一步必须是:通过PSC模块将其状态从SwRstDisable切换到Enable。具体操作是:

  1. 找到该外设在PSC中的模块编号(LPSC NUMBER,见Table 6-78, 6-79)。例如,UART2在PSC1的LPSC 13。
  2. 配置对应的MDCTL(Module Control Register)寄存器,将NEXT字段设置为0x3(Enable状态)。
  3. PTCMD(Power Transition Command)寄存器对应位写1,发起状态切换命令。
  4. 轮询PTSTAT(Power Transition Status)寄存器,直到对应位变为0,表示状态切换完成。
  5. 轮询该外设的MDSTAT(Module Status Register)寄存器,确认STATE字段变为0x3(Enable)。

一个真实的坑:工程师常常在调试时发现,写入外设的配置寄存器毫无效果。十有八九是忘了通过PSC使能该模块。务必把“PSC使能”作为外设初始化函数的第一条指令。

6.2 时钟源与分频树

外设的时序性能上限由其时钟源决定。你需要查阅芯片的时钟树图(Clock Tree),理清目标外设的时钟路径。 例如,eHRPWM的时钟TBCLK可能来源于SYSCLKOUT经过HSPCLKDIV分频。而SYSCLKOUT又来源于某个PLL的输出。因此:

  1. 系统上电后,需要先配置PLL控制器,将晶振频率倍频到所需的系统频率(如456MHz)。
  2. 然后,根据eHRPWM所需的分辨率和频率,计算HSPCLKDIV的分频值。
  3. 最后,在eHRPWM的TBCTL寄存器中配置该分频值。

时序问题的连锁反应:如果PLL没有锁定,或者系统时钟配置错误,那么所有基于此时钟的外设时序计算都将错误。在调试任何外设时序问题前,先用示波器或读取寄存器的方式,确认其源时钟频率是否符合预期。

7. 常见问题排查与实战技巧实录

将理论应用于实践总会遇到各种问题。下面是我在多个项目中总结出的关于C6743外设时序的典型问题与解决方法。

问题现象可能原因排查步骤与解决方案
eHRPWM输出无波形或频率不对1. PSC未使能eHRPWM模块。
2. eHRPWM时基时钟TBCLK配置错误(分频过大/过小)。
3. 动作限定器(AQCTL)未配置或配置错误。
4. 输出引脚未通过GPIO多路复用器映射到PWM功能。
1. 检查PSC1的LPSC17(eHRPWM0/1/2)状态是否为Enable
2. 计算TBCLK频率:SYSCLKOUT / (HSPCLKDIV * CLKDIV)。用示波器测量一个已知周期(如TBPRD设为1000)的PWM周期,反推实际TBCLK
3. 检查AQCTLA/B寄存器,确保比较匹配时设置了正确的动作(置高、置低、翻转)。
4. 检查PINMUX寄存器,将对应引脚功能设置为PWM输出。
I2C通信能发起起始信号,但收不到ACK或后续数据错乱1. 从设备地址错误或从设备未就绪。
2. 总线电容过大,导致上升沿太慢,违反tr/tf要求。
3. 上拉电阻过大,低电平压降不够或高电平上升太慢。
4. 软件配置的时钟ICCLKL/H不满足从设备时序要求。
1. 用逻辑分析仪确认发送的地址字节是否正确。检查从设备电源、复位是否正常。
2. 用示波器测量SDA/SCL波形,看上升/下降沿时间。标准模式应<1000ns,快速模式应<300ns。若过长,尝试减小上拉电阻或移除总线上的容性负载。
3. 测量SDA线在低电平期间的电压VOL,应低于0.4V(对于3.3V系统)。若过高,说明上拉电阻太小或从设备驱动能力不足。
4. 核对从设备数据手册的时序要求,特别是tsuth,确保主设备(C6743)配置的时钟满足其最严苛要求。
UART接收数据出现大量帧错误或奇偶校验错误1. 收发双方波特率不一致(误差过大)。
2. 线路噪声干扰严重。
3. 地线未连接好,导致共模干扰。
4. 软件读取FIFO速度过慢,导致溢出。
1. 用示波器精确测量发送端一个位的时间,计算实际波特率。检查双方时钟源精度(晶振误差)。
2. 观察RX引脚波形,看是否有毛刺或振铃。增加线上串联电阻(22-100Ω)或在引脚对地加小电容(10-100pF)滤波。
3. 确保收发双方有可靠的地线连接。对于长距离,使用差分标准(如RS-485)。
4. 提高接收中断优先级,或改用DMA方式接收。检查是否因关中断时间过长导致FIFO溢出。
Timer输入捕获值不稳定,跳动大1. 输入信号边沿不陡峭(tt参数超标)。
2. 输入信号含有高频噪声毛刺。
3. Timer的输入捕获滤波器未启用或设置不当。
4. 中断响应延迟导致捕获值读取不及时。
1. 用示波器观察输入信号边沿,应干净利落。如边沿缓慢,在前级增加施密特触发器整形。
2. 启用Timer输入通道的数字滤波器,设置合适的滤波宽度(如5个时钟周期)。
3. 如果测量频率,建议使用Timer的计数模式,在固定闸门时间内计数脉冲个数,比测量单个周期精度更高。
4. 对于高频率信号,考虑使用DMA将捕获寄存器值直接搬运到内存,避免中断延迟影响。
外设(如UART、I2C)偶尔不工作,复位后恢复1. PSC模块状态因某些原因(如低功耗模式切换)被意外改变。
2. 外设时钟源(如PLL)因噪声等原因暂时失锁。
3. 寄存器被其他任务或DMA意外修改。
1. 在应用代码中,定期或在关键操作前,检查并确认PSC中外设模块的状态是否为Enable
2. 监控PLL状态寄存器,确认锁相环是否稳定。在PCB设计上,确保PLL滤波电路(环路滤波器)的布局布线符合推荐设计。
3. 检查是否有多个任务或中断服务程序访问同一外设寄存器,造成冲突。必要时使用互斥锁保护外设配置区。

最后一点经验:数据手册中的时序参数是在特定测试条件下(电压、温度)给出的最值。在实际产品中,尤其是环境复杂的工业场合,必须为这些参数留出足够的设计余量(Margin)。例如,计算I2C上拉电阻时,不要卡着300ns的边沿极限去算,而是按照更严格的要求(如150ns)来设计,这样当温度变化、器件老化或电源波动时,系统依然能稳定工作。硬件设计,本质上是与不确定性做斗争,而充分的余量是我们最可靠的武器。