OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4156|回复: 2

iwdg不能動作

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2017-8-30
在线时间
0 小时
发表于 2017-8-30 10:24:55 | 显示全部楼层 |阅读模式
1金钱
大家好 請問一下 我最近在做看門狗的實驗 但是看門狗一直不起作用 麻煩大家指導一下 以下是我的程式碼

#include "stm32f4xx_hal.h"

IWDG_HandleTypeDef hiwdg;
GPIO_InitTypeDef gpio_init;


void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_IWDG_Init(void);


int main(void)
{

  HAL_Init();
       
  SystemClock_Config();
       
  MX_GPIO_Init();
  MX_IWDG_Init();

        HAL_IWDG_Start(&hiwdg);
       
        while(1)
        {
               
        }
       
}

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* IWDG init function */
static void MX_IWDG_Init(void)
{

  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
  hiwdg.Init.Reload = 500;

        HAL_IWDG_Init(&hiwdg);
       
}


static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
       
        gpio_init.Pin = GPIO_PIN_0;
        gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
        gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
        gpio_init.Pull = GPIO_NOPULL;
       
        HAL_GPIO_Init(GPIOB,&gpio_init);
       
       
}


void Error_Handler(void)
{

  while(1)
  {
  }

}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{


}

#endif



最佳答案

查看完整内容[请看2#楼]

如果初始化没问题, main函数这样就行[/backcolor] [/backcolor] [/backcolor] int main(void)[/backcolor] {[/backcolor] HAL_Init();[/backcolor] [/backcolor] SystemClock_Config();[/backcolor] [/backcolor] MX_GPIO_Init();[/backcolor] MX_IWDG_Init();[/backcolor] while(1)[/backcolor] {[/backcolor] // printf("\n\r Refreshes the IWDG !!!\n\r") ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 10:24:56 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-30 12:42 编辑

如果初始化没问题, main函数这样就行




int main(void)
{

  HAL_Init();
        
  SystemClock_Config();
        
  MX_GPIO_Init();
  MX_IWDG_Init();

        while(1)
        { //      printf("\n\r Refreshes the IWDG !!!\n\r");  //可以加打印,检测运行是否正常

       HAL_IWDG_Refresh(&hiwdg);
       HAL_Delay(800);
     
        }
        
}
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2017-8-30
在线时间
0 小时
 楼主| 发表于 2017-8-30 11:43:31 | 显示全部楼层
huanghan 发表于 2017-8-30 11:18
如果初始化没问题, main函数这样就行


謝謝你 後來解決了 我在HAL_IWDG_Start函數裡__HAL_IWDG_START前面加一段延遲函數就好了


HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg)
{
  /* Process Locked */
  __HAL_LOCK(hiwdg);
  
    /* Change IWDG peripheral state */  
  hiwdg->State = HAL_IWDG_STATE_BUSY;
       
        delay(250000);

  /* Start the IWDG peripheral */
  __HAL_IWDG_START(hiwdg);
  
    /* Reload IWDG counter with value defined in the RLR register */
  __HAL_IWDG_RELOAD_COUNTER(hiwdg);
  
  /* Change IWDG peripheral state */   
  hiwdg->State = HAL_IWDG_STATE_READY;
  
  /* Process Unlocked */
  __HAL_UNLOCK(hiwdg);
  
  /* Return function status */
  return HAL_OK;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 10:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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