查看: 3385|回复: 6

[求助] K10 watchdog 中断不能使用?!

[复制链接]

该用户从未签到

3

主题

7

帖子

0

新手上路

Rank: 1

积分
21
最后登录
1970-1-1
发表于 2013-11-11 09:47:33 | 显示全部楼层 |阅读模式
  以下是我测试看门狗的代码,系统会不断复位,但复位后没有打印“wdog_isr”。 没有调用到中断处理函数wdog_isr. 不知何故?
 
 

void wdog_isr(void)
{
    UART_printf("wdog_isr\n");
}

//test wdog
void test_wdog(void)
{
    int cnt = 0;
    int cnt2 = 0;
   
    wdog_init(10000,wdog_isr);   //10s timeout
   
    PIT_Init(0, 1/*ms*/, (uint32_t) pit_isr, 15);
               
   UART_printf("============test_wdog============\n");
   
    .........

    UART_printf("2. do not feed dog . system will reset in 10sec:\n");
    cnt = 0;
    while(1) {
        if(g_SysTimerMs > 1000) {
            UART_printf(" %d",cnt++);
            g_SysTimerMs = 0;
        }
    }
}







/////////////////////////////////////////////
void wdog_init(uint16_t timeOutMs /*ms*/,void (*timeout_isr)(void))
{
    uint32_t Value;
    uint16_t timeOutValueH;
    uint16_t timeOutValueL;

    /* First unlock the watchdog so that we can write to registers */
    //修改控制寄存器,先写入钥匙。 xzf:两个写操作必须在20 个总线周期内完成,必须关闭中断    p520
    wdog_unlock();
   
    int_disable();
   
    Value = ((g_periph_clk_khz/8)*timeOutMs);  //XZF. 必须在busclock 初始化之后
    timeOutValueH = (uint16_t)((Value&0xFFFF0000)>>16);
    timeOutValueL = (uint16_t)(Value&0x0000FFFF);
   
    //xzf: wait one bus clock cycle?

    //默认选择BusClock  设置分频器,设置值为8
    /* WDOG_STCTRLH: ??=0,DISTESTWDOG=0,BYTESEL=0,TESTSEL=0,TESTWDOG=0,??=0,STNDBYEN=1,WAITEN=1,STOPEN=1,DBGEN=0,ALLOWUPDATE=1,WINEN=0,IRQRSTEN=0,CLKSRC=1(alternate clock),WDOGEN=0 */
      //WDOG_BASE_PTR->STCTRLH = (uint16_t)(0x01D3u);  //no need DBGEN = 1??
    WDOG_BASE_PTR->STCTRLH = (uint16_t)(0x09F7u);    

    WDOG_BASE_PTR-&gtRESC = WDOG_PRESC_PRESCVAL(7);  //wdog clock = g_periph_clk_khz/(7+1).   
    //p536:the watchdog clock must be at least five times slower than the system bus clock at all times.
     
     
    WDOG_BASE_PTR->TOVALH = timeOutValueH;
    WDOG_BASE_PTR->TOVALL = timeOutValueL;
   
   
    int_enable();
 
   
    if(timeout_isr != NULL) {
        //WDOG_BASE_PTR->STCTRLH |= WDOG_STCTRLH_IRQRSTEN_MASK;
       
        irq_set_isr(22,(uint32_t)timeout_isr);   //22:  wdog irq idx. use macro
        irq_set_priority(22,0);
        irq_enable(22);
    }
}

////////////////////////////////////////////
void irq_set_isr(uint8_t irq, uint32_t isr_addr) {
    uint32_t isr_pos = 0;
    if (irq > MAX_IRQ) {
        UART_printf("\nERR! Invalid IRQ value passed to irq function!\n");
        return;
    }
    isr_pos = (SCB_VTOR + (irq + 16)*4 );
    //DisableInterrupts;
    *((volatile int*)isr_pos)  =  isr_addr;
    //__VECTOR_RAM[(irq + 14)*4] = isr_addr;          //use
    //EnableInterrupts;
}

void irq_enable (uint8_t irq)
{
    uint8_t div;
   
    /* Make sure that the IRQ is an allowable number. Right now up to 91 is
     * used.
     */
    if (irq > MAX_IRQ) {
        //UART_printf("\nERR! Invalid IRQ value passed to enable irq function!\n");
        return;
    }
   
    /* Determine which of the NVICISERs corresponds to the irq */
    div = irq/32;
   
    switch (div)  {
        case 0x0:
              NVICICPR0 |= 1
我知道答案 目前已有6人回答
回复

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2013-11-12 09:42:03 | 显示全部楼层

回复:K10 watchdog 中断不能使用?!

有没有在中断向量表中注册watchdog的中断服务函数wdog_isr呢?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

7

帖子

0

新手上路

Rank: 1

积分
21
最后登录
1970-1-1
 楼主| 发表于 2013-11-15 10:05:08 | 显示全部楼层

回复:K10 watchdog 中断不能使用?!

回复第 2 楼 于2013-11-12 09:42:03发表:
有没有在中断向量表中注册watchdog的中断服务函数wdog_isr呢? 

irq_set_isr(22,(uint32_t)timeout_isr);   //22:  wdog irq idx. use macro
 
这个函数是在中断向量表中设置ISR 的.
回复 支持 反对

使用道具 举报

该用户从未签到

51

主题

307

帖子

0

高级会员

Rank: 4

积分
651
最后登录
2020-9-4
发表于 2016-4-11 14:22:38 | 显示全部楼层
xiuzhifang 发表于 2013-11-15 10:05
回复第 2 楼 于2013-11-12 09:42:03发表:
有没有在中断向量表中注册watchdog的中断服务函数wdog_isr呢? 
...

我也正研究看门狗怎样用起来的问题.现在您的能运行吗?
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24871
最后登录
2025-7-18
发表于 2016-4-11 17:16:46 | 显示全部楼层
翱翔太空-423505 发表于 2016-4-11 14:22
我也正研究看门狗怎样用起来的问题.现在您的能运行吗?

你好,有问题,可以重新发一个问题贴出来,我会在你新的问题贴中回答你。
回复 支持 反对

使用道具 举报

该用户从未签到

51

主题

307

帖子

0

高级会员

Rank: 4

积分
651
最后登录
2020-9-4
发表于 2016-4-12 16:56:45 | 显示全部楼层
小恩GG 发表于 2016-4-11 17:16
你好,有问题,可以重新发一个问题贴出来,我会在你新的问题贴中回答你。 ...

void WDOG_Feed(void)
{
     WDOG_REFRESH = 0xA602;
     WDOG_REFRESH = 0xB480;   //喂狗
}
//关闭和开启看门狗
void WDOG_Close(void)
{
     WDOG_UNLOCK = 0xC520u;
     WDOG_UNLOCK = 0xD928u;
     WDOG_STCTRLH &= ~0x0001; //关闭看门狗 WDOTEN 0
}
void WDOG_Open(void)
{
     WDOG_UNLOCK = 0xC520;
     WDOG_UNLOCK = 0xD928;
     WDOG_STCTRLH |= 0x0001;  //打开看门狗 WDOTEN 1
}
void WDOG_Init(void)
{
     WDOG_UNLOCK = 0xC520;      
     WDOG_UNLOCK = 0xD928;               //解锁看门狗寄存器(重新写入前必须解锁)两次写入不能超过20个时钟周期

    WDOG_PRESC = 0x0700;  //(7+1)分频

    WDOG_TOVALH = 0x1110;    //看门狗超时时间设置为3s
     WDOG_TOVALL = 0x5E90;
  //    WDOG_STCTRLH |= 0x0001;  //打开看门狗 WDOTEN 1
       // 2秒
//    WDOG_TOVALH = 0x01C9;
//     WDOG_TOVALL = 0xC380;
//     // 使能总线,静止窗口模式,禁止看门口中断,开启开门狗
     WDOG_STCTRLH = 0x37;
}


void  main(void)
{
//   DisableInterrupts;
     WDOG_Init();      //初始化看门狗  
     LED_init();
   //  EnableInterrupts;

   //  WDOG_Open();     //开启看门狗            

     time_delay_ms(1500);
     
    while(1)
    {
        led(LED0, LED_ON);                 //LED0 亮

        time_delay_ms(500);                //延时500ms

        led(LED0, LED_OFF);                //LED0 灭

        time_delay_ms(500);                //延时500ms
      //  WDOG_Feed();
    }
}
帮忙看看,有没有问题.
在启动程序中已经把对看门狗操作的程序已经屏蔽掉了.只有在main中对看门狗操作
还需要对其他地方进行修改吗
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24871
最后登录
2025-7-18
发表于 2016-4-12 17:13:22 | 显示全部楼层
翱翔太空-423505 发表于 2016-4-12 16:56
void WDOG_Feed(void)
{
     WDOG_REFRESH = 0xA602;

你重新发一个问题贴,是新建一个问题贴。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 00:11 , Processed in 0.100682 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表