给NIOS II CPU增加看门狗定时器并使用

给NIOS II CPU增加看门狗定时器并使用

?

配置看门狗定时器:

  1. 设置计时溢出时间为1秒
  2. 计数器位宽为32位
  3. 勾选No Start/Stop control bits
  4. 勾选Fixed period
  5. 不勾选Readable snapshot
  6. 勾选System reset on timeout.(Watchdog)
  7. 不勾选Timeout Pulse (1 clock wide)

这部分配置可以参见"Embedded Peripheral IP User Guide.pdf"中Interval Timer Core章下的Configuration节下的Configuring the Timer as a Watchdog Timer小节相关内容。

添加完成后,将核名字改为watchdog(当然也可以自己定义),然后将clk信号连接到系统clk上,reset与所有reset网络信号相连(不包括clk核的reset_in),将s1连接到nios cpu的data_master上,点击连接irq,将resetrequest连接到所有核的reset输入上。

然后生成QSYS系统。

创建Quartus II工程并编写顶层文件。如果是在上一节实验的基础上增加的看门狗核,则不需要对Quartus II工程做任何更改,直接全编译即可。否则请按照我们提供的示例工程创建Quartus II工程并编写顶层文件。

打开NIOS II 开发软件,切换工作空间到当前工程目录,如果整个工程是直接复制上一个实验的工程得到的,则工作空间中还会有上一个实验的软件工程,这里需要首先删除工作空间中已经有的工程,注意,不要删除工程源文件,因为这时候工程源文件还是指向了上一个工程的源文件所在位置,直接删除源文件会破坏上一个实验的工程。然后在software目录下手动删除原有的工程文件。

接着点击【File】->【New】->【Nios II Application and BSP from Template】打开创建新工程和板级支持包向导。

然后选择sopcinfo文件为本工程目录下的sopcinfo文件(注意,软件总是记住上一次选择sopcinfo文件时的路径,因此这里特别容易出错,我们需要手动重新定位目录,软件自动打开的那个目录下的sopcinfo文件往往都是上一个实验的,不能使用)创建hello world模版工程,命名工程为watchdog_test。然后点击finish即可创建新工程。

复制上一个工程中软件工程中的【hardware】文件夹到本工程下的【watchdog_test】文件夹下,最好直接在电脑的文件管理器中进行(对Eclipse使用非常熟练的,请尽情使用拖拽添加的方式)。复制完成后,选中【watchdog_test】工程,单击右键,选择【Refresh】,就可以在工程中看到【hardware】文件夹了。

接着我们添加【hardware】下的【inc】路径到工程头文件包含路径中来。我们选中【watchdog_test】工程,按下键盘组合键"ATRL + Enter"键打开【Properties】设置界面,选择Nios II Application Properties下的Nios II Application Paths,在右侧的Application include directories下,点击Add按钮,添加hardware/inc到包含路径中。然后在弹出的对话框中点击Yes,即可将此路径添加为我们的头文件包含路径。如果用户之后自己有其他的头文件路径需要添加,也是按照这种方法进行。

接着我们查看下Project References中是否勾选了watchdog_test_bsp工程,如果没有勾选的话,当工程关闭了重新打开时,工程有可能会报各种无法理解的错误(当一个workspace中有多个应用工程时)。这里我们需要确认这个选项被勾选上了。

然后我们再在C/C++ General下的Indexer下,勾选按照下图中所示进行勾选。通过这样勾选后,一般工程不管怎么折腾,都不会出现xxxx ‘xxxx‘ could not be resolved的报错了。

设置完成后,我们点击Apply,然后点击OK退出。

然后我们选中【watchdog_test_bsp】工程,单击右键选择【Nios II】->【BSP Editor】,设置sys_clk_timer为none,(软件会默认搜索工程中存在的定时器外设并添加为sys_clk_timer),因此我们这里可能看到打开时默认将watchdog设置为了sys_clk_timer,所以我们要手工更改为none,如果不更改,系统将不能正常运行。Timestame_timer设置为none。Stdin、stdout、stderr都设置为uart_0。(默认为jtag_uart,但是jtag_uart容易导致Eclipse崩溃,因此我一般不用)。设置完毕后点击generate,然后点击exit退出。

接着我们在hardware/src目录下创建一个"watchdog.c"文件,编写内容如下:


#include "watchdog.h"

?

/******************************************

* 驱动使用的看门狗定时器基地址,独立定义,然后初

* 始化时由用户输入具体基地址名称,避免不同用户对看

* 门狗定时器不同的命名带来的程序移植性问题。

******************************************/

alt_u32 WTD_BASE;

?

/******************************************************************

* 名
称:WatchDog_Init()

* 功
能:初始化WatchDog,即开启看门狗定时器;

* 需要注意的是,看门狗定时器一旦开启,无法关闭。

* 入口参数:WATCHDOG_BASE :看门狗定时器基地址

* 出口参数:无

******************************************************************/

void WatchDog_Init(void
*MyWatchDog_BASE)

{

//将系统的watchdog基地址传递给驱动使用的基地址

WTD_BASE = MyWatchDog_BASE;

/* 启动 WATCHDOG */

IOWR_ALTERA_AVALON_TIMER_CONTROL(WTD_BASE,

ALTERA_AVALON_TIMER_CONTROL_START_MSK);

}

?

/******************************************************************

* 名
称:WatchDog_Feed()

* 功
能:看门狗喂狗操作,向看门狗寄存器写入任意值即可完成看门狗复位

* 入口参数:无

* 出口参数:无

******************************************************************/

void WatchDog_Feed(void)

{

IOWR_ALTERA_AVALON_TIMER_PERIODL(WTD_BASE,
0x1234);

}

?

接着我们在hardware/inc目录下创建一个"watchdog.h"文件,编写内容如下:


#include "system.h"

#include "altera_avalon_timer_regs.h"

#include "alt_types.h" //Altera定义的数据类型

?

#ifndef WATCHDOG_H_

#define WATCHDOG_H_

?

void WatchDog_Init(void
*MyWatchDog_BASE);

void WatchDog_Feed(void);

?

#endif /* WATCHDOG_H_ */

最后我们编写main文件函数如下所示:


/******************************************************************

* 文

名:main.c

* 功
能:运行WDT,并控制LED0--LED3显示输出。程序开始先对LED0--LED3进行闪烁控制

* 和喂狗处理;然后只点亮LED1,并进入死循环,等待WDT复位。

* 说
明:

******************************************************************/

#include <stdio.h>

#include "key.h"

#include "led.h"

#include "uart.h"

#include "string.h"

#include "stdlib.h"

#include "priv/alt_busy_sleep.h"

#include "watchdog.h"

?

//#define USE_WTD 1 //该宏定义决定系统中的看门狗是否被使用

?

/******************************************************************

* 名
称:DelayNS()

* 功
能:长软件延时,具有喂狗功能。

* 入口参数:dly 延时参数,值越大,延时越久

* 出口参数:无

******************************************************************/

void DelayNS(alt_u32 dly)

{

alt_u32 i;

for(; dly>0; dly--)

{

for(i=0; i<1000; i++)

{

#ifdef USE_WTD

WatchDog_Feed();
//喂狗

#endif

}

}

}

?

/******************************************************************

* 名
称:main()

* 功
能:初始I/O口及WDT,然后开始先对LED0--LED3闪烁控制,并进行喂狗处理;

* 然后只点亮LED1,并进入死循环,等待WDT复位。

* 说
明:如果main函数中InitWDT()被使用,则系统会自动复位,现象就是led永远不停的闪烁

* 如果main函数中InitWDT()被屏蔽,则系统无法自动复位,现象就是led闪烁8次后

* 停止下来,led0保持点亮

******************************************************************/

int main(void)

{

alt_u8 i;

?

LED_HANDLE hLED;

hLED = LED_Init(PIO_LED_BASE);

if
(!hLED)
{

printf("Failed to init LED\n");

}

?

#ifdef USE_WTD

//屏蔽此句可以禁止使用看门狗,用来测试不使用看门狗时的系统运行情况

WatchDog_Init(WATCHDOG_BASE);
// 初始化看门狗

WatchDog_Feed();
// 进行喂狗操作

#endif

?

for(i=0; i<8; i++)

{

//点亮LED0和LED2,熄灭LED1和LED3

LED_WriteData(hLED, LED0 | LED2);

DelayNS(300);

?

//点亮LED1和LED3,熄灭LED0和LED2

LED_WriteData(hLED, LED1 | LED3);

DelayNS(300);

}

//关闭LED0~3

LED_Off(hLED, LED0 | LED1 | LED2 | LED3);

LED_On(hLED, LED1);
//打开LED1

while(1);

return(0);

}

这样我们的软件就编写完成了,接着我们点击键盘的组合键"CTRL + B"(或者依次点击【Project】【Build All】)来编译整个工程。

接着我们在Quartus II中打开配置下载窗口将sof文件下载到FPGA中,然后在Eclipse中点击【Run】->【Run Configuration】,在弹出的界面中,双击左侧的【Nios II Hardware】新建一个下载设置,将name更改为Watchdog_test,与工程名保持一致。右侧Project Name选择Watchdog_test,如下图所示:

然后切换到Target Connection选项卡,查看如果Connections下能找到USB Blaster就行,如果不能找到,就点击Refresh Connections,以让软件找到连接。在System ID Checks下勾选忽略System ID和timestamp,如下图所示:

然后点击Apply,再点击Run即可开始下载。下载完成后,我们看到开发板上的4个LED灯闪烁8次后停止下来,这是因为没有使用watchdog的缘故,程序正常运行到while(1)处进入死循环。

接着,我们将"//#define USE_WTD 1"这一行前面的"//"注释标识符取消,然后重新编译工程,并运行下载。这里我们可以看到,开发板上的4个LED灯将持续不停的闪烁。这是因为当程序运行到while(1)死循环中后,不再有喂狗操作,因此看门够计数溢出,然后复位系统,系统重新开始运行,则LED重新开始闪烁,如此持续不断的进行。

如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506

小梅哥

芯航线电子工作室

时间: 2024-10-08 10:17:11

给NIOS II CPU增加看门狗定时器并使用的相关文章

给NIOS II CPU添加一颗澎湃的心——sysclk的使用

给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 ? 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchdog工程复制.粘贴并重命名为08_sysclk_timer.在Quartus II中打开该工程,然后点击Qsys快捷图标打开Qsys组件,如下图所示: 在Qsys中,打开工程目录(08_sysclk_timer)下的mysystem.qsys工程. 打开后,在左侧的IP列表中输入"timer&q

[ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数.如果看门狗减到0就认为程序没有正常工作,强制整个系统复位.因此可以用看门狗防止程序在跑飞的时候回不到正常模式. 看门狗可用于受到电气噪音.

NIOS II CPU复位异常的原因及解决方案

NIOS II CPU复位异常的原因及解决方案 ? 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序.经过分析系统可知,系统的硬件设计和Qsys系统中NIOS II CPU系统的搭建都是没有任何问题的.那么为什么会存在这样的问题呢,这里我先简单介绍下我的系统: 我的系统主要由NIOS II最强板CPU,SDRAM.预留系统定时器.预留时间

【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: 2. 我们创建了正确的NIOS II软件工程并能够正常运行 3. 由于某种需求(如SRAM内存不够用了,需要换成内存更大的SDRAM),我们在面在QSYS中将NIOS II CPU的复位地址和异常地址修改为SDRAM 4. 我们需要继续使用之前创建的NIOS II软件工程. 这里,如果我们更改后直接

s3c2440看门狗定时器

S3C2440A 的看门狗定时器是用于当其由于噪声和系统错误引起的故障干扰时恢复控制器的工作.它也可以被用作普通 16 位内部定时器来请求中断服务.看门狗定时器产生 128 个 PCLK 周期的复位信号. 看门狗比较简单 ,在2440文档上才2页介绍. 看门狗定时器只使用 PCLK 作为其时钟源.预分频 PCLK 频率来产生相应看门狗定时器时钟,再将其结果频率分频. 看到了,跟前面的timer一样也是利用PCLK作为时钟源,可以使用以下等式来计算看门狗定时器的频率和每个定时器时钟周期的持续时间:

S5PV210时钟,看门狗定时器

晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开关配置(MUX_apll),倍频的配置(APLL),分频的配置(DIV_apll)) 更具体可参看arm,007笔记 -------------------------------------------------------------------------------------------

LPC1768的看门狗定时器使用

void wwdg_init(void) { LPC_SC->PCLKSEL0 |= (3<<0);//分频数为八分频 LPC_WDT->WDCLKSEL &= ~(3<<0); LPC_WDT->WDCLKSEL |= (1<<0);//设置wdt时钟为apb LPC_WDT->WDCLKSEL |= (1<<31);//锁定时钟源 LPC_WDT->WDTC = 0xffff;//设定重载值 LPC_WDT->

看门狗驱动程序

看门狗是当CPU进入错误状态后,无法恢复的情况下,使计算机重新启动 由于计算机在工作时不可避免的受到各种各样的因素干扰,即使再优秀的计算机程序也可能因为这种干扰使计算机进入一个死循环,更严重的就是导致死机. 有两种办法来处理这种情况: 一是:采用人工复位的方法 二是:依赖于某种硬件来执行这个复位工作.这种硬件通常叫做看门狗(Watch Dog,WD) 看门狗,就像一只狗一样,在那看着们,计算机中通常用定时器来处理这种周期性的动作 看门狗实际上是一个定时器,其硬件内部维护了一个定时器,每当时钟信号

基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读

本文将介绍看门狗驱动的实现. 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行"喂狗",如果不这样做,定时器溢出后则将复位CPU. 因此,看门狗通常用于对处于异常状态的CPU进行复位. 具体的概念请自行百度. 2. S3C2440看门狗 s3c2440的看门狗的原理框图如下: 可以看出,看门狗定时器的频率由PCLK提供,其预分频器最大取值为255+1:另外,通过MUX,可以进一步降低频率