使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为看门狗的使用。

1 新建项目

  • 建立wdt项目

在PIO的Home页面新建项目,项目名称wdt,选择开发板为 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;

  • 项目建立完成后在src目录下新建main.c主程序文件;
  • 修改下载和调试方式,这里开发板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:
1
2
upload_protocol = cmsis-dap
debug_tool = cmsis-dap

2 编写程序

2.1 看门狗基本使用方法
  • 设置看门狗周期
1
iwdg_set_period_ms(600); 

比如设置600ms周期;最大为32768ms;

  • 使能看门狗
1
iwdg_start();

一般在初始化工作都完成后开始启动看门狗;

  • 在看门狗周期内进行喂狗
1
iwdg_reset();

这个函数必须保证在看门狗周期内进行执行,如上面设置周期为600,这个函数就必须在600ms之内调用,如每500ms调用一次;

2.2 使用例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* @file main.c
* @author MakerInChina (makerinchina.cn)
* @brief watch dog tutorial
* @version 0.01
* @date 2022-09-18
*
* @copyright Copyright (c) 2022
*
*/

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/iwdg.h>
#include <libopencm3/cm3/systick.h>

#define LED_1_RCC RCC_GPIOC
#define LED_1_PORT GPIOC
#define LED_1_PIN GPIO12

static void systick_setup(void)
{
/* clock rate / 1000 to get 1mS interrupt rate */
systick_set_reload(64000);
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
systick_counter_enable();
/* this done last */
systick_interrupt_enable();
}

volatile uint32_t tick_counter = 0;

void sys_tick_handler(void)
{
tick_counter++;
}

uint32_t millis(void)
{
return tick_counter;
}

int main(void)
{
rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);

rcc_periph_clock_enable(LED_1_RCC);

gpio_mode_setup(LED_1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,LED_1_PIN);

systick_setup();

//if reset led blink fast for 10 times
int x = 0;
uint32_t lastTime = millis();
while(1){
if( (millis() - lastTime) > 100) {
lastTime = millis();
gpio_toggle(LED_1_PORT,LED_1_PIN);

if(x++ > 10){
break;
}
}
}

//set wdt
iwdg_set_period_ms(600);

iwdg_start();

lastTime = millis();
while(1){

if( (millis() - lastTime) > 500) {
lastTime = millis();

gpio_toggle(LED_1_PORT,LED_1_PIN);

iwdg_reset();
}

}

while(1){}

return 0;
}

以上为看门狗的基本使用实例,设置600ms的看门狗周期,然后每个500ms时间内进行喂狗,如果大于600ms没有喂狗就会导致复位;