TMS320DM355作为一款面向数字媒体应用的SoC芯片,其定时器子系统设计体现了工业级嵌入式系统的典型架构。我在多个电机控制项目中实际使用过这款芯片,发现其定时器模块的灵活性和精度完全能满足大多数实时控制需求。
DM355集成了四个独立的定时器模块,其中Timer 0、1、3为通用定时器,Timer 2专用于看门狗功能。这三个通用定时器最突出的特点是支持三种计数模式:
实际项目中,我常用链式模式实现多级定时。例如在工业烤箱控制系统中,用Timer0作1ms基础定时,Timer1累计秒级计时,这种级联方式比软件计数更可靠。
Timer3相比其他定时器多了几个关键功能,这些在数据手册中容易忽略的细节往往决定系统设计成败:
外部时钟输入:通过GPIO000-003引脚接入外部时钟源
事件捕获功能:可记录外部信号边沿的精确时刻
周期重载模式:定时结束后自动加载新周期值
定时器的时钟选择直接影响系统实时性。DM355提供两种时钟源:
c复制// 时钟源配置示例(基于TI官方驱动库)
TimerConfigure(TIMER_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP);
TimerClockSourceSet(TIMER_BASE, TIMER_CLOCK_SYSTEM); // 选择内部系统时钟
// 或 TIMER_CLOCK_EXTERNAL 选择外部时钟
三种基本工作模式对应的配置代码:
单次模式:定时结束自动停止
c复制TimerLoadSet(TIMER_BASE, TIMER_A, 0xFFFFFFFF); // 设置初始值
TimerControlLevel(TIMER_BASE, TIMER_A, true); // 高电平触发
TimerEnable(TIMER_BASE, TIMER_A); // 启动定时器
连续模式:周期结束后自动重置
c复制TimerConfigure(TIMER_BASE, TIMER_CFG_PERIODIC);
带重载的连续模式(仅Timer3):
c复制TimerLoadSet(TIMER3_BASE, TIMER_A, initialLoad);
TimerMatchSet(TIMER3_BASE, TIMER_A, matchValue);
TimerControlEvent(TIMER3_BASE, TIMER_A, TIMER_EVENT_POS_EDGE);
定时器事件可通过两种方式通知CPU:
中断方式:直接触发ARM中断
EDMA方式:通过事件触发DMA传输
c复制EDMA3ParamSetup(hEdma, paramId,
EDMA3_PARAM_OPT_TRIG_MODE_EVENT,
srcAddr, dstAddr,
elementSize, frameCount);
关键提示:Timer3的输出事件可直接连接到RTO模块,这个特性在需要精确同步多个外设时非常有用。我在多轴运动控制器中就利用这个功能实现了所有电机驱动信号的纳秒级同步。
DM355的PWM模块本质上是一个带比较器的定时器,但其设计有几个独特之处:
PWM模块的时钟树配置需要特别注意:
code复制PWM_CLK = SYSTEM_CLK / (PWMCLKDIV + 1)
其中PWMCLKDIV取值范围0-255,这意味着最低输出频率受限于:
code复制Fmin = SYSTEM_CLK / (2^32 * 256)
通过分析PWM模块的寄存器映射,有几个关键位域影响输出特性:
| 寄存器 | 位域 | 功能描述 | 典型值 |
|---|---|---|---|
| PWMCON | BIT0 | 使能位 | 1 |
| PWMPRD | 31:0 | 周期值 | 0x0000FFFF |
| PWMDUT | 31:0 | 占空比值 | 0x00007FFF |
| PWMFLG | BIT3 | 周期中断标志 | 自动清零 |
| PWMRLD | 7:0 | 重复计数 | 0x00 |
配置示例:
c复制// 初始化PWM0,输出1kHz,50%占空比
PWMPRD = 24000 - 1; // 24MHz/1kHz
PWMDUT = 12000; // 50%占空比
PWMCTL |= 0x01; // 使能PWM
这是最常见的应用模式,配置步骤:
在数字电源设计中,我常用此模式实现:
通过CCD VSYNC信号触发PWM序列,这是DM355的特色功能。典型配置流程:
在工业相机应用中,我用这个特性精确控制:
根据数据手册,PWM输出需满足以下时序要求:
| 参数 | 符号 | 条件 | 典型值 |
|---|---|---|---|
| 高电平时间 | tw(PWMH) | 24MHz时钟 | 41.6ns |
| 低电平时间 | tw(PWML) | 24MHz时钟 | 41.6ns |
| 上升时间 | tr(PWM) | 10pF负载 | <2ns |
| 输出延迟 | td(CCDC-PWMV) | VSYNC触发 | <10ns |
实测中发现,当驱动大容性负载时,需要:
DM355的定时器/PWM与ARM926EJ-S核通过两种机制交互:
中断机制:
c复制void Timer0_ISR(void) {
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
// 处理代码
...
}
内存映射访问:
c复制volatile uint32_t *pwmReg = (uint32_t*)0x01C22000;
pwmReg[PWMDUT/4] = dutyCycle;
当PWM用于DAC应用时,配合EDMA可实现波形实时更新:
配置EDMA参数表:
c复制EDMA3_RM_ShadowPaRAM_set(
hEdma, chNum,
srcAddr, // 波形数据地址
PWM_DUTY_ADDR, // PWMDUT寄存器地址
elementCnt, // 每个波形点数
frameCnt, // 重复帧数
EDMA3_OPT_TCINTEN // 传输完成中断
);
触发方式选择:
在音频应用中,这种方案可以实现:
通过实测总结的省电技巧:
时钟门控:
c复制PowerDomainControl(PD_PERIPH, POWER_ON);
ClockModuleControl(CLOCK_MODULE_TIMER, ENABLE);
动态频率调整:
寄存器保留状态:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 定时不准 | 时钟源配置错误 | 检查TimerClockSourceSet参数 |
| 中断不触发 | 中断未使能 | 检查TimerIntEnable和ARM INTC配置 |
| 计数停止 | 工作模式错误 | 确认是否为单次模式 |
| 寄存器写入无效 | 外设未上电 | 检查PowerDomainControl调用 |
案例1:输出波形抖动
排查步骤:
根本原因:开关电源噪声耦合到时钟线
解决方案:增加LC滤波,改用线性稳压
案例2:占空比精度差
在电机驱动项目中遇到的典型EMI问题及对策:
高频辐射超标:
传导干扰:
地弹噪声:
通过合理配置Timer和PWM模块,DM355可以满足大多数嵌入式实时控制需求。实际项目中,建议先用评估板验证关键参数,再设计定制PCB。对于需要更高精度的应用,可以考虑外接专业PWM控制器(如DRV8323),用DM355的PWM模块作为基准信号源。