给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”文件,编写内容如下:

  1. #include "watchdog.h"
  2.  
  3. /******************************************
  4. * 驱动使用的看门狗定时器基地址,独立定义,然后初
  5. * 始化时由用户输入具体基地址名称,避免不同用户对看
  6. * 门狗定时器不同的命名带来的程序移植性问题。
  7. ******************************************/
  8. alt_u32 WTD_BASE;
  9.  
  10. /******************************************************************
  11. * 名 称:WatchDog_Init()
  12. * 功 能:初始化WatchDog,即开启看门狗定时器;
  13. * 需要注意的是,看门狗定时器一旦开启,无法关闭。
  14. * 入口参数:WATCHDOG_BASE :看门狗定时器基地址
  15. * 出口参数:无
  16. ******************************************************************/
  17. void WatchDog_Init(void *MyWatchDog_BASE)
  18. {
  19. //将系统的watchdog基地址传递给驱动使用的基地址
  20. WTD_BASE = MyWatchDog_BASE;
  21. /* 启动 WATCHDOG */
  22. IOWR_ALTERA_AVALON_TIMER_CONTROL(WTD_BASE,
  23. ALTERA_AVALON_TIMER_CONTROL_START_MSK);
  24. }
  25.  
  26. /******************************************************************
  27. * 名 称:WatchDog_Feed()
  28. * 功 能:看门狗喂狗操作,向看门狗寄存器写入任意值即可完成看门狗复位
  29. * 入口参数:无
  30. * 出口参数:无
  31. ******************************************************************/
  32. void WatchDog_Feed(void)
  33. {
  34. IOWR_ALTERA_AVALON_TIMER_PERIODL(WTD_BASE, 0x1234);
  35. }

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

  1. #include "system.h"
  2. #include "altera_avalon_timer_regs.h"
  3. #include "alt_types.h" //Altera定义的数据类型
  4.  
  5. #ifndef WATCHDOG_H_
  6. #define WATCHDOG_H_
  7.  
  8. void WatchDog_Init(void *MyWatchDog_BASE);
  9. void WatchDog_Feed(void);
  10.  
  11. #endif /* WATCHDOG_H_ */

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

  1. /******************************************************************
  2. * 文 件 名:main.c
  3. * 功 能:运行WDT,并控制LED0--LED3显示输出。程序开始先对LED0--LED3进行闪烁控制
  4. * 和喂狗处理;然后只点亮LED1,并进入死循环,等待WDT复位。
  5. * 说 明:
  6. ******************************************************************/
  7. #include <stdio.h>
  8. #include "key.h"
  9. #include "led.h"
  10. #include "uart.h"
  11. #include "string.h"
  12. #include "stdlib.h"
  13. #include "priv/alt_busy_sleep.h"
  14. #include "watchdog.h"
  15.  
  16. //#define USE_WTD 1 //该宏定义决定系统中的看门狗是否被使用
  17.  
  18. /******************************************************************
  19. * 名 称:DelayNS()
  20. * 功 能:长软件延时,具有喂狗功能。
  21. * 入口参数:dly 延时参数,值越大,延时越久
  22. * 出口参数:无
  23. ******************************************************************/
  24. void DelayNS(alt_u32 dly)
  25. {
  26. alt_u32 i;
  27. for(; dly>; dly--)
  28. {
  29. for(i=; i<; i++)
  30. {
  31. #ifdef USE_WTD
  32. WatchDog_Feed(); //喂狗
  33. #endif
  34. }
  35. }
  36. }
  37.  
  38. /******************************************************************
  39. * 名 称:main()
  40. * 功 能:初始I/O口及WDT,然后开始先对LED0--LED3闪烁控制,并进行喂狗处理;
  41. * 然后只点亮LED1,并进入死循环,等待WDT复位。
  42. * 说 明:如果main函数中InitWDT()被使用,则系统会自动复位,现象就是led永远不停的闪烁
  43. * 如果main函数中InitWDT()被屏蔽,则系统无法自动复位,现象就是led闪烁8次后
  44. * 停止下来,led0保持点亮
  45. ******************************************************************/
  46. int main(void)
  47. {
  48. alt_u8 i;
  49.  
  50. LED_HANDLE hLED;
  51. hLED = LED_Init(PIO_LED_BASE);
  52. if (!hLED) {
  53. printf("Failed to init LED\n");
  54. }
  55.  
  56. #ifdef USE_WTD
  57. //屏蔽此句可以禁止使用看门狗,用来测试不使用看门狗时的系统运行情况
  58. WatchDog_Init(WATCHDOG_BASE); // 初始化看门狗
  59. WatchDog_Feed(); // 进行喂狗操作
  60. #endif
  61.  
  62. for(i=; i<; i++)
  63. {
  64. //点亮LED0和LED2,熄灭LED1和LED3
  65. LED_WriteData(hLED, LED0 | LED2);
  66. DelayNS();
  67.  
  68. //点亮LED1和LED3,熄灭LED0和LED2
  69. LED_WriteData(hLED, LED1 | LED3);
  70. DelayNS();
  71. }
  72. //关闭LED0~3
  73. LED_Off(hLED, LED0 | LED1 | LED2 | LED3);
  74. LED_On(hLED, LED1); //打开LED1
  75. while();
  76. return();
  77. }

这样我们的软件就编写完成了,接着我们点击键盘的组合键“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增加看门狗定时器并使用的更多相关文章

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

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  2. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  3. 【小梅哥SOPC学习笔记】NIOS II工程目录改变时project无法编译问题

    解决NIOS II工程移动在磁盘上位置后project无法编译问题 说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代 ...

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

    切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: ...

  5. 【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件

    sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...

  6. 【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦

    SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...

  7. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  8. 【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程

    Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...

  9. 【小梅哥SOPC学习笔记】设置Eclipse在编译(build)前自动保存源代码文件

    设置Eclipse在编译(build)前自动保存源代码文件 Eclipse 常用设置之让Eclipse在编译(build)前自动保存源代码文件 一.让Eclipse在编译(build)前自动保存源代码 ...

随机推荐

  1. sql server 2008 链接到数据库引擎

  2. 关于ie6中绝对定位或浮动的div中既有向左float也有向右float时候如何让外层div自适应宽度的解决方案--

    一个详细的说明请见: http://www.cnblogs.com/yiyang/p/3265006.html 我的问题大约为,如下代码: <!DOCTYPE html PUBLIC " ...

  3. stm32通信概述

    本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...

  4. Spring MVC起步

    1.1跟踪Spring MVC的请求 每当用户在Web浏览器中点击链接或提交表单的时候,请求就开始工作了.对请求的工作描述就像是快递投送员.与邮局投递员或FedEx投送员一样,请求会将信息从一个地方带 ...

  5. 5、数据类型三:hash

    Hash数据类型使用很普遍,它同样是key-value的方式来组织的,只是其value又包含多个field-fieldValue对.想要获取某个fieldValue,可以通过key-field联合来定 ...

  6. Spring Boot tomcat参数

    主题 初学SpringBoot,想要配置一下tomcat的端口,以前tomcat直接在它的XML里配置就好了.现在SpringBoot直接继承了,不知道哪里配置.后来找到解决方法,记录一下. 具体方法 ...

  7. js中function的与众不同

    js中function的与众不同在于可以被调用

  8. CSS隐藏元素 display visibility opacity的区别

    { display: none; /* 不占据空间,无法点击 */ }  { visibility: hidden; /* 占据空间,无法点击 */ }  { position: absolute; ...

  9. react-native init安装指定版本的react-native

    C:\Users\ZHONGZHENHUA\imooc_gp\index.js index.js /** @format */ import React,{ Component } from 'rea ...

  10. 【UVA11419 训练指南】我是SAM 【二分图最小覆盖,最小割】

    题意 给出一个R*C大小的网格,网格上面放了一些目标.可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标.你的任务是计算最少需要多少子弹,各从哪些位置发射,才能把所有目 ...