【Linux】ARM篇七--WDT看门狗实验



一、前言

本篇使用华清远见的FS4412开发板,进行WDT开门狗实验,知识包含看门狗介绍,开门狗使用原理,看门狗代码编写、看门狗实验。


二、准备工作

  • FS4412开发板,我用的是华清远见的FS4412开发板
  • ubuntu下linux操作系统(包含交叉编译工具
  • serial-com8程序烧入执行工具
  • 开发板电路原理图、芯片手册
  • 开发程序模板

开发板资料、交叉编译工具、程序烧入工具下载(包含教程)
开发板可选择到华清远见官网进行租赁。
工程模板文件下载


三、看门狗简介

Watch Dog Timer即看门狗定时器,其主要作用是当发生软件故障时可产生复位信号使芯片复位,其本质是一个计数器。
在这里插入图片描述
因此在使用看门狗时,需要每隔一段时间给计数器设定值,以防止计数器减到0,跟现实生活中,给狗加狗粮的行为类似。

Exynos 4412 芯片中看门狗包括的功能:

  • 支持正常间隔定时器模式中断请求
  • 如果定时器计数值达到0(超时),激活内部复位信号。
  • 支持级触发中断机制

四、看门狗寄存器介绍

1、看门狗结构

在这里插入图片描述
可以看出控制看门狗的寄存器主要是WTDCON寄存器


2、看门狗寄存器

在这里插入图片描述


3、WTCON寄存器

在这里插入图片描述

  • 一级分频器分频数在1~256,而我们写0~255,内部寄存器自动+1

4、WTCNT寄存器

在这里插入图片描述

  • 看门狗计数器,使用看门狗时,该寄存器自动递减
  • 计数范围是0~65535

五、看门狗代码编写

1、程序

#include "exynos_4412.h"

/**
 * @description: 延时函数 
 * @param {int} i- 延时计数
 * @return {*}
 */
void delay(int i)
{
	while(i--);
}

/**
 * @description: 看门狗初始化
 * @param {*}
 * @return {*}
 */
void WDT_Init()
{
	/* 设置一级分频 156 = 0x9B+1*/
	WDT.WTCON = WDT.WTCON & (~(0xFF<<8)) | (0x9B<<8);

	/* 设置二级分频 64- 10 */
	WDT.WTCON |= (0x2<<3);

	//看门狗频率为100000000/156/64 约等为10000Hz
	
	/* 关闭中断 */
	WDT.WTCON &= (~(0x1<<2));

	/* 打开产生复位信号 */
	WDT.WTCON |= 1;

	/* 设置计数器计数值 */
	WDT.WTCNT = (5*10000);  //5秒

	/* 使能看门狗 */
	WDT.WTCON |= (0x1<<5);
}

int main()
{
	WDT_Init();

	while(1)
	{
		printf("WDT.WTCNT = %d\n", WDT.WTCNT); //打印计数器值
		delay(100000);
	}
	return 0;
}

2、程序烧入步骤

1.输入make生成.bin文件
在这里插入图片描述


2.将.bin文件复制到共享文件夹

在这里插入图片描述

在这里插入图片描述

输入:

cp ARM_LED.bin /mnt/hgfs/cca

将文件复制到cc文件夹


3.打开serial-com8,连接开发板(COM2接口),烧入程序
①查看端口
在这里插入图片描述
②打开serial-com8设置
在这里插入图片描述
在这里插入图片描述
③接通开发板电源,迅速按enter键,使其快速进入裸机模式。
在这里插入图片描述
④烧入程序
在这里插入图片描述
输入:

loadb 40008000
在这里插入图片描述

选择可执行文件烧入
在这里插入图片描述
烧入成功:
在这里插入图片描述


⑤执行程序
输入:

go 40008000


六、实验现象

在这里插入图片描述
计数器递减,到0时:
在这里插入图片描述
开发板复位。


到这里就结束啦!
在这里插入图片描述

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是一个简单的Rt-thread看门狗程序的示例: ``` #include <rtthread.h> #define WATCHDOG_TIMEOUT (5000) // 5秒超时时间 /* 定义看门狗设备对象 */ static rt_device_t watchdog_dev; /* 定义看门狗线程 */ static rt_thread_t watchdog_thread = RT_NULL; static void watchdog_thread_entry(void* parameter) { rt_uint32_t timeout; while (1) { /* 表示没有任务需要看门狗保护 */ if (rt_thread_self()->stat == RT_THREAD_CLOSE) { rt_kprintf("No task to watch!\n"); break; } /* 看门狗开始计时 */ timeout = rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_START, (void*)WATCHDOG_TIMEOUT); /* 如果返回0,则表示看门狗时间到达 */ if (timeout == 0) { rt_kprintf("Watchdog timeout\n"); rt_hw_reset(); // 通过硬件复位系统 } rt_thread_mdelay(WATCHDOG_TIMEOUT / 2); // 线程等待WATCHDOG_TIMEOUT / 2毫秒 } } int watchdog_init(void) { watchdog_dev = rt_device_find("wdt"); // 找到看门狗设备 /* 如果找不到看门狗设备,则返回错误 */ if (watchdog_dev == RT_NULL) { rt_kprintf("Watchdog device not found!\n"); return -1; } /* 控制看门狗的设备注册为看门狗模式 */ rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, (void*)WATCHDOG_TIMEOUT); rt_device_control(watchdog_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); // 看门狗计时开始 /* 创建看门狗线程 */ watchdog_thread = rt_thread_create("watchdog", watchdog_thread_entry, RT_NULL, 1024, 25, 10); if (watchdog_thread != RT_NULL) { rt_thread_startup(watchdog_thread); rt_kprintf("Watchdog thread create success!\n"); return 0; } rt_kprintf("Watchdog thread create fail!\n"); return -1; } /* 注册看门狗初始化函数到Rt-thread */ INIT_APP_EXPORT(watchdog_init); ``` 这个看门狗程序中,我们使用了Rt-thread提供的看门狗接口来实现计时功能并防止系统因为某个线程的执行超时而崩溃的情况发生。当超时时间到达时,看门狗会向外部硬件发送一个复位信号,从而复位整个系统。这个看门狗程序需要在初始化的时候调用 watchdog_init() 函数来完成注册到Rt-thread内核的初始化过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值