给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>; dly--)
{
for(i=; i<; 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=; i<; i++)
{
//点亮LED0和LED2,熄灭LED1和LED3
LED_WriteData(hLED, LED0 | LED2);
DelayNS(); //点亮LED1和LED3,熄灭LED0和LED2
LED_WriteData(hLED, LED1 | LED3);
DelayNS();
}
//关闭LED0~3
LED_Off(hLED, LED0 | LED1 | LED2 | LED3);
LED_On(hLED, LED1); //打开LED1
while();
return();
}
这样我们的软件就编写完成了,接着我们点击键盘的组合键“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
小梅哥
芯航线电子工作室
【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用的更多相关文章
-
给NIOS II CPU增加看门狗定时器并使用
给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...
-
【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
-
【小梅哥SOPC学习笔记】NIOS II工程目录改变时project无法编译问题
解决NIOS II工程移动在磁盘上位置后project无法编译问题 说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代 ...
-
【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置
切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: ...
-
【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件
sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...
-
【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦
SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...
-
【小梅哥SOPC学习笔记】系统时钟的使用
给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
-
【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...
-
【小梅哥SOPC学习笔记】设置Eclipse在编译(build)前自动保存源代码文件
设置Eclipse在编译(build)前自动保存源代码文件 Eclipse 常用设置之让Eclipse在编译(build)前自动保存源代码文件 一.让Eclipse在编译(build)前自动保存源代码 ...
随机推荐
-
数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现
一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...
-
FileStream和StreamWriter配合写数据流时,出现数据写不进去的问题
今天做一个数据导进txt小程序时,发现一个问题,就是没有关闭sw的流,只关闭了fs的,结果写不进去数据,看代码是对的,就是不行,最后就随手填上了sw的关闭后,可以了,反复测试,竟然就是这的问题,有点搞 ...
-
PAT (Basic Level) Practise:1038. 统计同成绩学生
[题目链接] 本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过105的正整数N,即学生总人数.随后1行给出N名学生的百分制整数成绩,中间以空格分隔.最 ...
-
Python 安装mysqldb
切换目录: cd /usr/local/src/ 一.下载资源 wget http://sourceforge.net/projects/mysql-python/files/mysql-python ...
-
Hacker(16)----防范端口扫描与嗅探
端口扫描与嗅探都是黑客常用的招数,其目的是定位目标计算机和窃取隐私信息.为确保自己计算机的安全,用户需要掌握防范嗅探与端口扫描的常见措施,保障个人隐私信息安全. 一.掌握防范端口扫描的常用措施 防范端 ...
-
C++匈牙利命名法
匈牙利命名法 匈牙利命名法是一种编程时的命名规范.基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分.命名要基于容易记忆容易理解的原则.保证 ...
-
SEO-发信息注意的问题
SEO是什么? SEO的全称是Search Engine Optimization,翻译过来就是搜索引擎优化,说到搜索引擎,可能不是特别的清楚.通俗点讲,就是百度,谷歌,雅虎,这些可以直接搜索到你想要 ...
-
[HTTP]POST报文中Content-Type对正文解析的影响
概述 在POST请求中,理论上请求端程序可以发送任意格式报文正文,但是最好在报文头Content-Type字段标明正文的格式,方便接收端根据Content-Type正确处理正文. 传统HTML-for ...
-
1 CRM
一.crm介绍 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...
-
高速LVDS电平简介
一.LVDS简介 1.1.LVDS信号介绍LVDS:Low Voltage Differential Signaling,低电压差分信号.LVDS传输支持速率一般在155Mbps(大约为77MHZ)以 ...