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.

[参考译文] MSP430F5529:生成两个延迟函数,而不使用计时器A或B,但不使用RTC_A

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/630281/msp430f5529-to-generate-two-delay-functions-without-using-timer-a-or-b-but-rtc_a

部件号:MSP430F5529

晚上好,我已经找了一段时间来了解如何解决我的问题,很可能真的很容易解决。 但直到现在,我还没有发现任何类似的问题。

背景:我正在使用所有14个PWM输出,这意味着所有TxxCCR0都是固定的,以匹配PWM周期。

问题:我需要在触发命令后以延迟时间打开输出(作为输入变量固定,因此不能使用__DELAY周期(xxx)),然后MCU允许PWM打开,能够处理USB中断并遵循主程序, 但经过一段时间后,关闭PWM输出。 因此我需要测量用户作为变量给出的两个延迟时间;首先是触发器和开之间的延迟时间,其次是开和关之间的延迟时间。 这两种时间都不同,在执行主软件期间,这两种时间都可以变化,但在PWM操作期间,这两种时间都不会变化。

我想使用RTC_A中断,但我不知道如何在计数器模式下配置它来执行这两个延迟,它们应该是数百毫秒的时间,而我使用的是SMCLK = 8MHz。

如果您能给我一些想法,让我知道如何解决这一问题,而不是进行循环,从而产生一些遗漏功能,以防来自USB/CDC端口的消息可能到达并需要som MCU活动。我将不胜感激。

谢谢你

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

    《用户指南》的22.2 第1节说:

    用于增加计数器的时钟可以来自ACLK,SMCLK或ACLK或SMCLK的预校准版本。 ACLK或SMCLK的预校准版本来自预分禾器(RT0PS和RT1PS)。 RT0PS和RT1PS输出/2,/4,/8,16,/32, 分别为ACLK和SMCLK的/64,/128和/256版本。 RT0PS的输出可以与RT1PS级联。 级联输出可用作32位计数器的时钟源输入。

    四个单独的8位计数器级联以提供32位计数器。 这提供了计数器时钟的8位,16位,24位或32位溢出间隔。

    如果为/1配置两个预分频器,则将8 MHz时钟输入到32位计数器中;8位溢出将导致256 / 8 MHz =32 µs的中断间隔。 通过增加一个或两个预分禾器,您可以重复增加这一时间,最多可增加约2.1 s

    如果所需的延迟与您能达到的时间之一不匹配(131/262/524/1049/2097 ms)2097 ms),则必须使用较短的时间间隔,并计算中断数。

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

    是的,我查看了手册,其中关于如何将实时时钟用作计数器的说明非常小,您只能在CCS云中找到一个超级基本的示例。 我一直在寻求更灵活的方式。

    Clemens Ladisch 说:
    如果所需的延迟与您能达到的时间之一不匹配(131/262/524/1049/2097 ms)2097 ms),则必须使用较短的间隔并计算中断次数。[/QUOT]

    是的,这是我试图避免的,就是在中断时需要有一个计数器变量和If-else进程,但要对计时器执行类似的操作,这样您就可以修改CCR0并为您的确切延迟时间修复CCRx 需要,并且一次只执行一个操作,因为我需要一种通用方法来修改这些奖励,因为我不知道用户将选择哪一个延迟时间,并且使用此分隔器(预分页)看起来很严格。 但是,看起来更符合逻辑的解决方案是选择最小的中断间隔并计数,直到它通过乘法达到延迟

    延迟= 32e-6*number_of_in从。

    是否不可能修复小于8位溢出的AM中断? 为了每隔10或20次中断一次? 在这种情况下,倍数将更四舍五入。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过减少预分禾器,您可以获得32 µs的任意二次幂倍数。

    (嗯,日历模式有报警寄存器。 但是没有秒的报警寄存器,因此对于8 MHz (运行244.14 时间太快),最小间隔约为250 ms。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对不起,我没有讨论250毫秒的最小间隔,244.14 时间太快是什么意思?

    我正在重新检查所有手册,如果我不犯一个错误 ,我可以举例使用SMCLK = 8MHz,三个计数器1等于8 MHz,2个计数器各等于4 MHz, 所以,对于第一个,我每32个人就可以中断一次,而对于其他人,每64个人就可以中断一次, 正确屏蔽它们(这意味着不同时使用它们)我可以有三个中断处理程序,现在的问题是知道 每个处理程序的进程将持续多长时间,它需要简单快速地执行,然后才能在下一次中断(32/64 us)之前执行。

    ....
    #include "driverlib.h"....
    
    RTC_a_initCounter (RTC_a_base,RTC_ACLOCKSELECT_SMCLK,RTC_A_COUNTRSIE_8位);
    RTC_a_initCounterPrescale (RTC_a_base,RTC_a_prescale_0, RTC_ACLOCKSELECT_SMCLK,RTC_A_PSDIVIDER_2);
    RTC_a_initCounterPrescale (RTC_a_base,RTC_a_prescale_1,RTC_ACLOCKSELECT_SMCLK, RTC_A_PSDIVIDER_2);
    
    //作为接收条件变量
    的函数...
    IF (条件#1){
    RTC_a_clearIterrupt (RTC_a_base,RTCTEVIFG);
    RTC_a_HoldClock(RTC_a_base);
    enable_a_CounterValue (RTC_a_base, 0);
    enable_RTC_a_Base RTCTEVIE);
    RTC_a_startClock(RTC_a_base);
    —如果(条件#2){
    RTC_a_clearIterrupt (RTC_a_base,RTC_a_prescale_TIMER0_interrupt);
    RTC_a_HoldCounterPrescalale (RTC_a_base,RTC_a_base);
    rtc_a_prescale_0,0);
    rtc_a_enableInterrupt (rtc_a_base,rtc_a_prescale_TIMER0_interrupt);
    rtc_a_startCounterPrescale (rtc_a_base, rtc_a_prescale_0);
    }else{
    rtc_a_clearIterrupt (rtc_a_base,rtc_a_prescale_Timer1_interrupt);
    rtc_a_holdCounterPrescale (rtc_a_base,rtc_a_prescale_1);
    RTC_a_setPrescaleValue (RTC_a_base,RTC_a_prescale_1,0);
    RTC_a_enableInterrupt (RTC_a_base,RTC_a_prescale_Timer1_interrupt);
    rtc_a_startCounterPrescale(RTC_a_base,rtc_a_prescale_1);
    }.....
    
    
    //in interruption handler
    ..
    switch (__偶 数_in_range (RTCIV,16))
    {
    案例0:中断;
    案例2:中断;
    案例4://RTCEVIFG.
    n_d斩 件1++;
    IF (n_interrupions1 == desderedValue1){
    RTC_a_DisableInterrupt (RTC_a_base,RTCTEVIE);
    //做一些事情
    制动器;
    }
    制动器;
    案例6:制动器;
    案例8://RT0PSIFG
    n_d斩 件2++;
    IF (n_interrupions2 == desderedValue2){
    rtc_a_disableInterrupt (rtc_a_base,rtc_a_prescale_TIMER0_interrupt);
    //执行其他操作
    制动器;
    }
    制动器;
    案例10://RT1PSIFG
    n_d斩 件3++;
    IF (n_interruptions3 == desderedValue3){
    rtc_a_disableInterrupt (rtc_a_base,rtc_a_prescale_Timer1_interrupt);
    //也执行其他操作
    制动器;
    }
    Brake;
    default:break;
    }.//end
    of handler 

    我认为这样的方法可以起作用,但我并不完全确定,特别是 中断处理程序中是否有IF进程。

    感谢您的耐心,我知道RTC的主要目标是用作时钟,而不是计数器,但这次机会让我不能做出其他选择。  

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

    244.14 Times太快意味着什么?

    RTC设计用于日历模式下的32.768 kHz晶体。 8 MHz / 32.768 kHz≈244.14。

    您需要调用rtc_a_definePrescaleEvent()。

    请注意,您可能无法处理速度过快的中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于我只是增加了一个计数器,大多数中断都是真实的,如果验证变为真实,则可以停止进一步中断,这很好,我得到了灵活的延迟和某种程度的准确。 感谢导游。