WDT メソッドを使用する

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはみんな、私は私のプログラムでwdtを使用しようとすると問題が発生しました。 ホームページからコード例を見つけましたが、wdtを有効にした後、プログラムは常にMCUを初めてリセットします。 私が望むのは、wdtの期間リセット時間を設定し、通常の実行中は割り込みを機能させないようにすることです。 しかし今 CAN私は私の要件を満たすために例を変更 CAN 、誰かがコード例を変更する方法を教えてくれますか?

添付ファイルのコード例を参照してください。

/*****************************************************************************
* File Name: main.c
*
* Version: 1.00
*
* Description: This code example demonstrates how to use Watchdog Timer (WDT)
* to reset the device and to periodically generate interrupts. It also shows
* how to use the ILO compensate APIs to improve the WDT interrupt period 
* accuracy.
*
* Related Document: Code example CE210192.pdf
*
* Hardware Dependency: See code example CE210192
*
******************************************************************************
* Copyright (2016), Cypress Semiconductor Corporation.
******************************************************************************
* This software is owned by Cypress Semiconductor Corporation (Cypress) and is
* protected by and subject to worldwide patent protection (United States and
* foreign), United States copyright laws and international treaty provisions.
* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable
* license to copy, use, modify, create derivative works of, and compile the
* Cypress Source Code and derivative works for the sole purpose of creating
* custom software in support of licensee product to be used only in conjunction
* with a Cypress integrated circuit as specified in the applicable agreement.
* Any reproduction, modification, translation, compilation, or representation of
* this software except as specified above is prohibited without the express
* written permission of Cypress.
*
* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH
* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* Cypress reserves the right to make changes without further notice to the
* materials described herein. Cypress does not assume any liability arising out
* of the application or use of any product or circuit described herein. Cypress
* does not authorize its products for use as critical components in life-support
* systems where a malfunction or failure may reasonably be expected to result in
* significant injury to the user. The inclusion of Cypress' product in a life-
* support systems application implies that the manufacturer assumes all risk of
* such use and in doing so indemnifies Cypress against all charges. Use may be
* limited by and subject to the applicable Cypress software license agreement.
*****************************************************************************/
#include 

/* LED States */
#define ON                      0u
#define OFF                     1u

#define RESET_FLAG_ACTIVE       1u
#define SET                     1u
#define CLEAR                   0u

/* Define desired interrupt delay in milliseconds to calculate ilo match count */
#define WAKEUP_PERIOD_IN_MS        500u

/* Define desired delay in microseconds */
#define DESIRED_DELAY           500000u

/* Calculate ILO match count to get wdt periodic updates */
#define ILO_MATCH_COUNTS        ((WAKEUP_PERIOD_IN_MS * CY_SYS_CLK_ILO_DESIRED_FREQ_HZ)/ 1000)

uint32  resetFlag;
uint32  interruptFlag;
uint32  iloMatchCounts = ILO_MATCH_COUNTS;

/* The prototype of the WDT ISR */
CY_ISR_PROTO(WdtIsr);

int main()
{
    uint32  tempIloCounts = 0u;
    
    /* Turn on Red LED for 2 seconds if reset caused by WDT */
    if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT))
    {
        /* Update flag in order to clear WDT */
           resetFlag = RESET_FLAG_ACTIVE;
        
        /* Turn off Blue LED */
           LED_Reset_Write(OFF);
        
        /* Toggle with Red LED to indicate WDT reset */
           LED_WdtReset_Write(ON);
           CyDelay(2000u);
           LED_WdtReset_Write(OFF);
        
        /* Make sure that interrupt is forwarded to the CPU */
            CySysWdtUnmaskInterrupt();
    }
    else
    {
        /* Turn on Blue LED */
        LED_Reset_Write(ON);
        
        /* Configure WDT to be 15-bit wraparound up-counter - 1 MSb is ignored */
        CySysWdtSetIgnoreBits(1);
    }
    
    /* Configure WDT ISR */
    WdtIsr_StartEx(WdtIsr);
    
    /* Start the WDT */
    CySysWdtEnable();

    /* Starts the ILO accuracy/Trim measurement */
    CySysClkIloStartMeasurement();
   
    /* Enabling global interrupts */
    CyGlobalIntEnable;
    
    for(;;)
    {
        /* If the interrupt has occurred in the ISR */
        if(SET == interruptFlag)
        {
        /* Clear the watchdog interrupt */
           CySysWdtClearInterrupt();
        
        /* Enable WDT interrupt */
           CySysWdtUnmaskInterrupt();
        
        /* WDT match value is updated in order to obtain periodic interrupts */
           CySysWdtWriteMatch(CySysWdtReadMatch() + iloMatchCounts);
        
        /* Clear the software interrupt flag */
           interruptFlag = CLEAR;
        }
        /* Get the ILO compensated counts i.e. the actual counts for the desired ILO frequency 
            Trimming is done to improve ILO accuracy using IMO; ILO default accuracy is +/- 60% */
        if(CYRET_SUCCESS == CySysClkIloCompensate(DESIRED_DELAY, &tempIloCounts))
        {
            iloMatchCounts = (uint32)tempIloCounts;

            /* Once the counts are ready - stop the ILO measurement and put the device to deepsleep */
            CySysClkIloStopMeasurement();
                
            if(CLEAR == interruptFlag)
            {
                /* Device will wakeup through WDT ISR */
                CySysPmDeepSleep();
            }    
            /* Start the ILO measurement after wake up */
               CySysClkIloStartMeasurement();
        }
    }
}

CY_ISR(WdtIsr)
{
    /* Clear WDT only after device reset caused by WDT */
    if(RESET_FLAG_ACTIVE == resetFlag)
    {
        LED_WdtInt_Write(!(LED_WdtInt_Read()));

        /* To make sure WDT ISR does not trigger again till the WDT interrupt is 
           cleared in main(). This is done to make sure WDT clear (for WDT reset)
           happen in main() and not in ISR. */
        /* Disable WDT interrupt */
           CySysWdtMaskInterrupt();
        
        /* Update the flag in order to clear WDT interrupt in while (1) */
           interruptFlag = SET;
    }
}
/* [] END OF FILE */
0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

1:"uint32リセットフラグ= 1;uint32 interruptFlag=1;". その後、チップはリセットされません。

2:通常の状態では、次のようにwdtにフィードしてリセットを無効にする必要があります。

/* 定期的な割り込みを取得するために WDT 一致値が更新されます */
CySysWdtWriteMatch(CySysWdtReadMatch() + iloMatchCounts);

3: wdt 割り込みを処理する場合は、次の 2 つの API に注意してください。

/* WDT 割り込みを有効にします */
CySysWdtUnmaskInterrupt();

/* WDT 割り込みを無効にします */
CySysWdtMaskInterrupt();

4:お役 CAN いただければ~

 

 

元の投稿で解決策を見る

0 件の賞賛
4 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

1:"uint32リセットフラグ= 1;uint32 interruptFlag=1;". その後、チップはリセットされません。

2:通常の状態では、次のようにwdtにフィードしてリセットを無効にする必要があります。

/* 定期的な割り込みを取得するために WDT 一致値が更新されます */
CySysWdtWriteMatch(CySysWdtReadMatch() + iloMatchCounts);

3: wdt 割り込みを処理する場合は、次の 2 つの API に注意してください。

/* WDT 割り込みを有効にします */
CySysWdtUnmaskInterrupt();

/* WDT 割り込みを無効にします */
CySysWdtMaskInterrupt();

4:お役 CAN いただければ~

 

 

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

ご協力いただきありがとうございます!それは本当に大いに役立ちます!

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは LinglingG_46

 

ウォッチドッグの設定について別の質問がありました。 割り込み時間を500msから5msに変更したいので、このマクロで変更しました」

#define WAKEUP_PERIOD_IN_MS        500u

"

500Uから5Uまで。

しかし、割り込み時間はまだ500msです。 どうしてか知りません。

この問題を理解するのを手伝っていただけませんか?

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

ILOトリム&メジャーの関連コードをコメントアウトしてみてください

0 件の賞賛