This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F2274:使用定时器 B1、上行模式来生成一个中断

Guru**** 2553450 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/597030/msp430f2274-using-timer-b1-up-mode-to-generate-an-interrupt

器件型号:MSP430F2274

简单地说、我要尝试的是使用计时器来提供异步单次触发。  我已经阅读了十几次"家庭用户指南"相关章节。  通过实验、我成功使用了 TA0和 TB0 (向上计数模式)。  两者都生成所需的中断。  我还设法(使用 slac123i 中的测试代码)在连续模式下获得具有 TB 的 TB1中断(因此我了解 TBIV 代码结构)。  但我需要在向上计数模式下运行计时器、虽然 TA0和 TB0都运行正常、但在3天后、TA0和 TBX 顽固地拒绝中断。  此外、我未能找到以类似于 TB0的方式运行 TB1的任何代码示例。  在理想情况下、我可以将 TimerB 设置为向上计数模式、将值单独插入 TBCCR0和 TBCCR1、并获取 CCIFG 中断(定时器内部为0、TBIV 为1)。  我的坚持点是不清楚 TBR。  我不清楚哪些因素会影响 TBR 计数。  它是否自由运行?  然后 TBCCRx 写入会有某种隐藏的数学运算。  它是否设置为 TBCCRx 值?  这一点没有明确说明(至少对我来说)、但它会解释为什么每个外设模块只有一个(独立)计时器。

足够了。 我能否在 TimerB 模块中运行2个独立的单次触发定时器(通过将 TBCCRx 更改为零在 ISR 中停止)?  对为什么不这样做作出任何澄清都是有益的。  有关获取 TBCCR1 CCIFG 中断的任何想法也可能有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    术语点:TB1是指 F2274上不存在的第二个 TIDerB 模块。 我假设您实际上是指这里的 TBCCR1 (最近称为 TB0CCR1)。

    (此外、当应用于引脚时、TB1是指与 TB[0] CCR1关联的引脚、这是一个不幸的时钟错误-后来的器件将该引脚称为 TB0.1。)  

    TBR 是自由运行的、但是-在向上或向上/向下计数模式-当它与 TBCCR0进行相等的比较时改变(复位或反转)。 不能使用 TBCCR1/2来影响向上计数模式。

    在向上计数模式中、如果你将 TBCCR1设置为一个小于 TBCCR0的值、当 TBR 达到该值时、你将触发 TBCCTL1:CCIFG (如果你将 CCIE 设置为一个中断)。 如果 TBCCR1 > TBCCR0、则不会得到中断、因为它永远不会等于 TBR。  

    Ergo、您不能使用您一直使用的向上计数模式方法创建第三次单次触发。  

    我的建议:使用连续模式、并为每次单次触发设置 TBCCRx = TBR +增量。 您可以将 CCR0与 CCR1/2一起使用、但不要忘记 CCR0中断使用了不同的矢量。  这将在单个计时器上为您提供全部三次单次触发(您可以使用 TimerA 执行其他操作)。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、

    最棒的!  谢谢。  两个注释:

    1 -一方面、我猜测您说的任何内容都不在 TI 文档的涵盖范围内-这对大多数读者来说可能是显而易见的。  另一方面,您的措辞,特别是"TBR 是自由运行的,但--在向上或向上/向下计数模式下--改变(复位或反转)",为我清除了全部内容。  也许您应该编写 TI 技术文档?  :-)

    2 -我想我现在理解您关于连续模式的结束建议。  如果我这么做、那么完全异步操作将需要与提供的代码段不同的编码。  示例代码和用户指南都指示 TxCCRx 被写入中断中(如果使用单个值、建议一个固定周期)。  如果我需要异步一次性(实时启动)、我需要做的是-读取 TxR;添加增量;写入 TxCCRx。  对您而言、这是对的吗?

    我将假定我理解(可能很危险)并将其标记为已回答。  再次感谢您的清晰!