打印

求助,stm32f103的看门狗无法复位芯片...

[复制链接]
12648|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我写好了整个工程之后回来加入看门狗,发现怎么搞都不能复位,于是拿了个空白的模板来写个简单的小程序跑了一下,也无法复位,弄了2天了,资料看了几十遍,网上查帖看了N多还是没找到解决办法,一个看门狗搞了我这么久快疯了.....
我用的IAR5.5, J-link, STM32F103ZE,可以观察到有IWDG复位标志,但是系统没有复位....

模板程序如下:
int main(void)
{
  uint32_t i;

  SystemInit();
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
                         RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
  //select all pin
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //SET LED
  //set GPIOC
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOC, GPIO_Pin_8);
  for(i=0;i<0x5fffff;i++)
    ;
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
  RCC_LSICmd(ENABLE);
  for(i=0;i<0xfffff;i++)
    ;
  /* Enable write access to IWDG_PR and IWDG_RLR registers */
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

  /* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */
  IWDG_SetPrescaler(IWDG_Prescaler_16);

  /* Set counter reload value to 349 */
  IWDG_SetReload(50);

  /* Reload IWDG counter */
  IWDG_ReloadCounter();

  /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  IWDG_Enable();
  /* Infinite loop */
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable);
  while (1)
  {
  }
}


如果有看门狗复位,应该可以看到LED闪动,可是LED一直亮着,拔掉调试器重新上电也一样,相关各寄存器值如下:

1.jpg (77.29 KB )

1.jpg

2.jpg (9.61 KB )

2.jpg

3.jpg (46.72 KB )

3.jpg
沙发
windrarara|  楼主 | 2011-4-29 11:14 | 只看该作者
换了一块板,还是不行....:Q

使用特权

评论回复
板凳
LDTEST| | 2011-4-30 09:17 | 只看该作者
本来想说 你频率太快了 肉眼看不到,不过又因你寄存器为0,不好判断,如果不在 复位后立刻中断,倒也是看不到寄存器的值,故直接贴代码

//独立看门狗应用于对时间精度要求不高的场合
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低12位有效.
//时间计算(大概):Tout=40K/((4*2^prer)*rlr)值.
void IWDG_Init(unsigned char prer,unsigned short rlr)
{
   //LSI 时钟使能  等待运行
   RCC->CSR|=0x01;
   while(!((RCC->CSR>>1)&0x01));
   //使能对IWDG->PR和IWDG->RLR的写
   IWDG->KR=0X5555;
   //LSI/32=40Khz/4*2^pre
   IWDG->PR=prer;
   //从加载寄存器 IWDG->RLR
   IWDG->RLR=rlr;
   //重载计数值
   IWDG->KR=0xAAAA;
   //使能看门狗
   IWDG->KR=0xCCCC;
}

使用特权

评论回复
地板
LDTEST| | 2011-4-30 09:20 | 只看该作者
如果任然不明,参考STM32 不完全手册。

另 狗最长的时间是 二十几秒

使用特权

评论回复
5
windrarara|  楼主 | 2011-4-30 09:46 | 只看该作者
不是啊

  for(i=0;i<0x5fffff;i++)
    ;
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
  RCC_LSICmd(ENABLE);
  for(i=0;i<0xfffff;i++)
    ;

实测这段跑完有2秒了,如果被复位了肯定能看到LED闪的,问题是现在RCC_CSR的IWDGRSTF位已经是1了,应该是发生了复位,但是我没看到CPU复位,也不是调试器的问题,我把调试器拔了照样如此,我又试了窗口看门狗WWDG,一样是这样,WWDGGRST也是1,但是仍然没有发生cpu复位,后来我干脆改了选项字节启动硬件看门狗,照样没有复位,把做好的工程写进去,不喂狗整个程序都跑得很好,快疯了....

使用特权

评论回复
6
windrarara|  楼主 | 2011-4-30 15:04 | 只看该作者
我了个去,我终于找到问题了,试过IWDG复位不行,WWDG复位也不行,NVIC_SystemReset();软件复位也失败之后,把目光从软件投向硬件,然后....


发现芯片内部产生的复位都要经过一个20us的脉冲发生器,我把NRST脚切断,终于可以了,看来是输入不匹配的问题,我的NRST引脚是直接连接到IMP708的,看来要加上个电阻才行了,马上试试....

使用特权

评论回复
7
windrarara|  楼主 | 2011-4-30 15:51 | 只看该作者
弄了个4.7k的可以了,不影响外部复位,内部也可以复位了,唉,搞了这么久,以前是用lpc跟pic的就没遇过这种问题....

使用特权

评论回复
8
1085674553| | 2014-5-20 11:09 | 只看该作者
楼主帮了大忙了 ,解决了!

使用特权

评论回复
9
orange69103997| | 2014-7-14 13:47 | 只看该作者
确实是,楼主帮大忙了!谢谢!F0就没有这个问题,看来F1最先出来有点小BUG啊!文档了都没有说明啊!纳闷!

使用特权

评论回复
10
香水城| | 2014-7-14 14:00 | 只看该作者
这哪里是bug?每个STM32系列的芯片,包括STM32F1的芯片文档说的很清楚:系统复位信号会输出到NRST引脚。

使用特权

评论回复
11
wateras| | 2017-11-22 16:52 | 只看该作者
谢谢分享

使用特权

评论回复
12
一路向北lm| | 2017-11-22 22:16 | 只看该作者
看门狗的配置如果正确的话,把时间调短一下试试。

使用特权

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

本版积分规则

1

主题

12

帖子

1

粉丝