打印
[Atmel]

Atmel SAMC21 清看门狗时间长,怎么办?

[复制链接]
2538|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
清看门狗时间将近2.8ms,时间长,问题已找到,只是不知道怎么修改,请大家指点~测试程序如下:
#include <asf.h>
void configure_wdt(void);
void configure_wdt(void)
{
        struct wdt_conf config_wdt;
        wdt_get_config_defaults(&config_wdt);
        config_wdt.always_on      = false;
#if !((SAML21) || (SAMC21) || (SAML22))
        config_wdt.clock_source   = GCLK_GENERATOR_4;
#endif
        config_wdt.timeout_period = WDT_PERIOD_64CLK;
        wdt_set_config(&config_wdt);
}
int main(void)
{
        system_init();
        delay_init();


        //! [setup_init]
        configure_wdt();
        //! [setup_init]
        port_pin_set_output_level(PIN_PA22,0);
        wdt_reset_count();
        while (true) {
        //! [main_3]
        //port_pin_set_output_level(PIN_PA22,1);
        //wdt_reset_count();
       
        port_pin_set_output_level(PIN_PA22, 1);
        port_pin_set_output_level(PIN_PA22, 0);
        wdt_reset_count();
        port_pin_set_output_level(PIN_PA22, 1);
        port_pin_set_output_level(PIN_PA22, 0);
        port_pin_set_output_level(PIN_PA22, 1);
        port_pin_set_output_level(PIN_PA22, 0);
        delay_ms(5);
        }
        //! [main]
}
wdt_reset_count函数如下:
void wdt_reset_count(void)
{
        Wdt *const WDT_module = WDT;

        /* Disable the Watchdog module */
        WDT_module->CLEAR.reg = WDT_CLEAR_CLEAR_KEY;

        while (wdt_is_syncing()) {
                /* Wait for all hardware modules to complete synchronization */
        }//while循环等待时间过长,接近2.8ms,这段代码不要会不会有问题?或是怎样修改又不会占用很多时间,How to do???
}


请大家帮忙一起看看,谢谢各位~
同时今天祝女同胞们节日快乐!O(∩_∩)O哈哈~




相关帖子

沙发
serenade753|  楼主 | 2016-3-8 13:41 | 只看该作者
示波器图片

QQ图片20160308133816.jpg (427.33 KB )

清看门狗时间长2.8ms

清看门狗时间长2.8ms

使用特权

评论回复
板凳
ddllxxrr| | 2016-3-8 21:21 | 只看该作者
把看门狗时钟调快,应能快些,对程序稳定来讲,最好不要省。但也不是一定的,如果就有程序要处理,去处理也是可以的

使用特权

评论回复
地板
ayixitielu| | 2016-3-9 11:15 | 只看该作者
字好大啊

使用特权

评论回复
5
serenade753|  楼主 | 2016-3-23 15:52 | 只看该作者
ddllxxrr 发表于 2016-3-8 21:21
把看门狗时钟调快,应能快些,对程序稳定来讲,最好不要省。但也不是一定的,如果就有程序要处理,去处理也 ...

后来是这么改的, wdt_reset_count函数中,屏蔽了等待硬件同步的部分;
在主程序中,不断的查询wdt_is_syncing()==false,判断同步是否完成,如果完成再清除看门狗计数;
void wdt_reset_count(void)
{
        Wdt *const WDT_module = WDT;


        /* Disable the Watchdog module */
        WDT_module->CLEAR.reg = WDT_CLEAR_CLEAR_KEY;


        //while (wdt_is_syncing()) {
                /* Wait for all hardware modules to complete synchronization */
        //}                  //屏蔽掉这个while循环
}


主程序中,进行以下操作
if (wdt_is_syncing()==false)
{
    wdt_reset_count();       
}

需要注意的是,硬件同步未完成,如果又清看门狗计数,会存在问题!!!慎重!



使用特权

评论回复
6
ddllxxrr| | 2016-3-23 19:50 | 只看该作者
serenade753 发表于 2016-3-23 15:52
后来是这么改的, wdt_reset_count函数中,屏蔽了等待硬件同步的部分;
在主程序中,不断的查询wdt_is_sy ...

谢谢分享

使用特权

评论回复
7
ji7411| | 2016-3-25 14:52 | 只看该作者
这样的解决方法,感觉还是容易出问题啊。

使用特权

评论回复
8
hahaha123000| | 2016-3-25 16:46 | 只看该作者
不是很懂,顶,楼主问题解决了吗

使用特权

评论回复
9
serenade753|  楼主 | 2016-3-28 13:47 | 只看该作者
ji7411 发表于 2016-3-25 14:52
这样的解决方法,感觉还是容易出问题啊。

暂时没有发现问题,哈哈

使用特权

评论回复
10
serenade753|  楼主 | 2016-3-28 13:47 | 只看该作者
hahaha123000 发表于 2016-3-25 16:46
不是很懂,顶,楼主问题解决了吗

规避了清看门狗时间长的问题,算是解决了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

18

帖子

0

粉丝