1. 项目概述:深入MPC5xx的定时器心脏
在嵌入式开发,尤其是汽车电子和工业控制领域,飞思卡尔(现恩智浦)的MPC5xx系列微控制器因其强大的性能和丰富的外设而备受青睐。其中,MIOS14(模块化输入/输出子系统)堪称其定时器功能的集大成者,它不是一个单一的定时器,而是一个由多个功能各异、可灵活配置的子模块组成的“工具箱”。今天,我们不谈泛泛的概念,而是聚焦于这个工具箱里一把极其锋利且多功能的“瑞士军刀”——MDASM,即双动作子模块。
如果你曾为如何精确测量一个脉冲的宽度、如何生成一个边沿位置可编程的单次脉冲,或者如何实现一个高分辨率且无需CPU频繁干预的PWM输出而头疼,那么MDASM正是为你准备的解决方案。它本质上是一个集成了两个16位比较/捕获通道(A和B)、一个输出触发器以及复杂控制逻辑的硬件单元。其“双动作”的精髓在于,它允许硬件在软件介入之前,自主完成最多两个相关联的事件操作,比如捕获一个脉冲的上升沿和下降沿,或者比较并输出一个脉冲的起始和结束边沿。这种硬件自治能力极大地减轻了CPU的中断负载,为实时性要求苛刻的应用提供了保障。
本文将带你彻底拆解MDASM,从它的内部架构、六种工作模式(DIS, IPWM, IPM, IC, OCB/OCAB, OPWM)的运作机制,到每个寄存器比特位的具体含义与配置技巧,进行一场深度的实战剖析。无论你是正在调试一块MPC561/563的电路板,还是希望深入理解高级定时器设计思想,这篇文章都将提供可直接“抄作业”的配置步骤和避坑指南。
2. MDASM核心架构与工作原理拆解
要驾驭MDASM,必须先理解它的“五脏六腑”。参考手册中的框图是起点,但我们需要将其翻译成更直观的工程师语言。
2.1 模块组成与数据流
MDASM的核心部件可以概括为“两通道、两寄存器、一触发器、一选择器”。
两个16位定时通道(Channel A & B) :这是模块的运算核心。每个通道都包含一个16位比较器和一个16位数据寄存器。但这里有个关键细节:通道B内部实际上隐藏着两个数据寄存器——B1和B2。这个设计是MDASM实现“双动作”和缓冲区功能的关键。在输入模式下,B1作为临时锁存器,B2作为软件可读的稳定值;在PWM输出模式下,B1是软件写入的目标寄存器,B2是当前参与比较的活跃寄存器,实现了双缓冲,避免PWM波形更新时的毛刺。
一个输出触发器(Output Flip-Flop) :这是模块的“手”,直接驱动外部引脚的电平。在输出模式下,比较器A匹配会将其置位(输出高或低,取决于极性),比较器B匹配会将其复位。
一个输入边沿检测器(Input Edge Detect) :这是模块的“眼睛”,负责侦测外部输入信号的有效边沿(上升沿、下降沿或两者),并触发捕获动作。
一个16位计数器总线选择器(Counter Bus Select) :这是模块的“心跳”来源。MDASM本身不包含计数器,它需要从外部“借用”一个计数基准。MIOS14内部通常有多个16位计数器总线(可能由其他子模块如MCPSM或MMCSM提供),MDASM通过 BSL[1:0] 位选择其中之一作为自己的时间基准。这意味着多个MDASM可以同步于同一个计数器,方便实现协同操作。
状态与控制寄存器(MDASMSCR) :这是模块的“大脑”,所有功能的配置开关都集中于此,包括模式选择、边沿极性、标志位、强制输出等。
核心理解 :你可以把MDASM想象成一个拥有两个“闹钟”(比较器A和B)和一台“秒表”(输入捕获)的设备。它自己不产生时间,而是盯着一个公共的、不断走动的“主时钟”(计数器总线)。你可以设置闹钟在几点响(输出比较),或者记录秒表在事件发生时主时钟的读数(输入捕获)。
2.2 寄存器映射与访问要点
MDASM的寄存器空间非常精简,每个子模块实例只有4个16位的地址位置,但这4个位置对应着5个物理寄存器(因为B通道有B1/B2)。
- 数据寄存器A(MDASMAR) :地址偏移
0x0。始终对应通道A的寄存器,可读可写。 - 数据寄存器B(MDASMBR) :地址偏移
0x2。这是一个“窗口”寄存器,软件读写它时,访问的到底是B1还是B2,完全由当前的工作模式决定。这是配置时需要特别注意的第一点。- 输入模式(IPWM, IPM, IC) :读操作返回B2的值,写操作会同时写入B1和B2。因为此时B2是稳定的捕获值,B1是内部暂存器。
- 输出比较模式(OCB, OCAB) :读/写操作都针对B2。B1虽然也被写入相同值,但不参与比较。
- PWM输出模式(OPWM) :读/写操作都针对B1!B2是内部缓冲寄存器,对软件不可见。这是实现PWM无毛刺更新的关键。
- 状态/控制寄存器副本(MDASMSCRD) :地址偏移
0x4。 这是一个“陷阱”地址! 手册用大写的WARNING明确警告:用户软件不应直接写入这个地址。它的存在纯粹是为了支持RCPU(RISC CPU)进行32位对齐的原子访问(例如,一次32位操作同时读写MDASMAR和MDASMSCR)。为了未来的软件兼容性,我们永远只使用MDASMSCR。 - 状态/控制寄存器(MDASMSCR) :地址偏移
0x6。所有控制和状态位都在这里。这是我们配置和交互的主寄存器。
实操心得一:地址计算与实例选择 手册中的地址(如
0x30 6058)是MDASM11的基地址。MPC561/563中有多个MDASM实例(如11, 12, ..., 28)。在实际编程中,我们通常通过芯片头文件中的宏定义来访问,例如MIOS14.MDASM[11].MDASMAR。如果没有,你需要根据模块基地址和实例索引手动计算。务必确认你操作的是正确的MDASM实例,它映射到你所期望的物理引脚(如MDA11, MDA12等)。
3. 六种工作模式深度解析与配置实战
MDASM的六种模式是其灵活性的体现。下面我们逐一切入,不仅讲


449


被折叠的 条评论
为什么被折叠?



