我写好了整个工程之后回来加入看门狗,发现怎么搞都不能复位,于是拿了个空白的模板来写个简单的小程序跑了一下,也无法复位,弄了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一直亮着,拔掉调试器重新上电也一样,相关各寄存器值如下: |