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.

[参考译文] CCS/MSP430F5529:WDT 中断间隔

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/948763/ccs-msp430f5529-wdt-interrupt-interval

器件型号:MSP430F5529

工具/软件:Code Composer Studio

我希望每0.5ms 提出一次 WDT 中断。  我知道要设置间隔时间、我只需在 main 中添加一行、如下所示:  WDTCTL = WDT_MDLY_32 这会将时间间隔设置为32ms。  没有这样的命令可将其设为0.5ms、因此我想知道如何实现这一点。  感谢您提前观看。

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

    WDT 不是通用计时器、但它确实为2个时钟提供了8倍分频器。  

    如果右键单击->转至定义,您将看到预定义 WDT 时间的设置。 需要注意的是 WDTIS 位、它引用了用户指南(SLAU208Q)表16-2、其中显示了可用的分频值。 预定义仅使用4个可用的分频值。

    2^19约为524K、因此如果 SMCLK 以1MHz (可能是)运行、则 WDTSSEL=SMCLK 和 WDTIS=3应该为您提供0.524秒。

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

    那么、如果我想在 C 中实现这个、我可以执行以下操作?

    WDTIS = 6;

    WDTSSEL = SMCLK;

    这将使2^9 = 512/1MHz =大约0.5毫秒。  我在 C 语言中找不到很多使用这种方法的示例、因此我只想仔细检查语法。

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

    实际上、我可以使用头文件中定义的内容、如下所示:

    WDTCTL = WDT_MRST_0_5; //将间隔设置为0.5ms

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

    它将是"WDTCTL = WDTPW | WDTSSEL_SMCLK | WDTIS__512"。

    检查头文件中是否有要使用的相应符号。 请勿忘记密码或立即重置。

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

    哦、谢谢、我现在看到了。  我想、我即将完成这项工作。  不过、出于某种原因、我的中断标志不会被抛出。

    #include 
    
    volatile unsigned int i = 0;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTSSEL_SMCLK | WDTIS__512;// WDT 间隔0.5ms
    _EINT(); //启用中断
    SFRIE1 |= WDTIE; //启用 WDT 中断
    
    P4DIR |= BIT7; // LED2到输出
    P4OUT &=~BIT7; // LED2最初关闭
    
    P2DIR &=~BIT1; //将 P2.1设置为输入(SW1)
    P2REN |= BIT1; //启用上拉电阻器
    P2OUT |= BIT1; //正确的 IO 所需
    P2IE |= BIT1; //在 P2.1上启用中断
    P2IES |= BIT1; //为中断启用 hi->lo 边缘
    P2IFG &=~BIT1; //清除任何错误的中断标志
    
    volatile unsigned int i = 0;
    
    while (1)//在这里等待中断
    {
    if (i >= 1000)
    {
    P2IFG |= BIT1;
    I = 0;
    }
    }
    
    
    #pragma vector = WDT_vector //WDT ISR
    __interrupt void watchdog_timer (void)
    {
    i++;
    }
    
    #pragma vector = port2_vector //SW1 ISR
    __interrupt void port2_ISR (void)
    {
    P2IFG &=~BIT1;//清除标志
    
    P4OUT ^= BIT7;//切换 LED2
    }
    

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

    WDT ISR 永远不会发生、并且我永远不会递增。

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

    除非您将看门狗置于计时器模式、否则看门狗会生成复位。