安德鲁

[笔记].怎样使用Nios II中的watchdog_timer?.[Nios II][SOPC Builder]

0
阅读(2534)

本文简单描述如何使用watchdog_timer服务,并给出一个简单范例。

使用环境:Altera Quartus 9.1 SP1 + Nios II  9.1 Software Build Tools for Eclipse SP1

步 骤1 在SOPC Builder中例化Interval Timer核:

1. 在SOPC Builder中例化Interval Timer核,命名为watchdog_timer。

图1 例化Interval Timer核

2. 配置Interval Timer核


图2 配置Interval Timer核

在Hardware options的预设置处,选择Watchdog。

注意:Timeout period所设置的值,即看门狗的溢出时间值。此处设置为1s;即一旦开启看门狗后,1s内不喂狗,看门狗将复位处理器。

表1 Watchdog寄存器选项


表2 Watchdog输出信号选项


 

步骤2 NIOS II EDS中编写相应的C程序

1. 查看system.h中的相应内容

01 #define ALT_MODULE_CLASS_watchdog_timer altera_avalon_timer
02 #define WATCHDOG_TIMER_ALWAYS_RUN 1
03 #define WATCHDOG_TIMER_BASE 0x1002040
04 #define WATCHDOG_TIMER_COUNTER_SIZE 32
05 #define WATCHDOG_TIMER_FIXED_PERIOD 1
06 #define WATCHDOG_TIMER_FREQ 125000000u
07 #define WATCHDOG_TIMER_IRQ 4
08 #define WATCHDOG_TIMER_IRQ_INTERRUPT_CONTROLLER_ID 0
09 #define WATCHDOG_TIMER_LOAD_VALUE 124999999ULL
10 #define WATCHDOG_TIMER_MULT 1.0
11 #define WATCHDOG_TIMER_NAME "/dev/watchdog_timer"
12 #define WATCHDOG_TIMER_PERIOD 1
13 #define WATCHDOG_TIMER_PERIOD_UNITS "s"
14 #define WATCHDOG_TIMER_RESET_OUTPUT 1
15 #define WATCHDOG_TIMER_SNAPSHOT 0
16 #define WATCHDOG_TIMER_SPAN 32
17 #define WATCHDOG_TIMER_TICKS_PER_SEC 1u
18 #define WATCHDOG_TIMER_TIMEOUT_PULSE_OUTPUT 0
19 #define WATCHDOG_TIMER_TYPE "altera_avalon_timer"

第6行,Nios II软核的输入时钟频率,此处为125MHz。

2. 查看altera_avalon_timer_regs.h中的控制寄存器内容

01 /* CONTROL register */
02 #define ALTERA_AVALON_TIMER_CONTROL_REG             1
03 #define IOADDR_ALTERA_AVALON_TIMER_CONTROL(base) \
04   __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_CONTROL_REG)
05 #define IORD_ALTERA_AVALON_TIMER_CONTROL(base) \
06   IORD(base, ALTERA_AVALON_TIMER_CONTROL_REG)
07 #define IOWR_ALTERA_AVALON_TIMER_CONTROL(base, data) \
08   IOWR(base, ALTERA_AVALON_TIMER_CONTROL_REG, data)
09 #define ALTERA_AVALON_TIMER_CONTROL_ITO_MSK         (0x1)
10 #define ALTERA_AVALON_TIMER_CONTROL_ITO_OFST        (0)
11 #define ALTERA_AVALON_TIMER_CONTROL_CONT_MSK        (0x2)
12 #define ALTERA_AVALON_TIMER_CONTROL_CONT_OFST       (1)
13 #define ALTERA_AVALON_TIMER_CONTROL_START_MSK       (0x4)
14 #define ALTERA_AVALON_TIMER_CONTROL_START_OFST      (2)
15 #define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK        (0x8)
16 #define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST       (3)

3. 示范程序

01 #include "system.h"
02 #include "altera_avalon_timer_regs.h"     // Interval Timer核的存储映射头文件
03 #include "altera_avalon_pio_regs.h"       // PIO核的存储映射头文件
04 #include "alt_types.h"
05 #include <unistd.h>
06  
07 #define Q_LED_ON  IOWR_ALTERA_AVALON_PIO_DATA(Q_LED_BASE, 1)
08 #define Q_LED_OFF IOWR_ALTERA_AVALON_PIO_DATA(Q_LED_BASE, 0)
09  
10 /*
11  * 功能:初始化看门狗
12  * 备注:看门狗一旦初始化后,就不能再被停止
13  */
14 #define Init_WDT  \
15   IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_TIMER_BASE, \
16       ALTERA_AVALON_TIMER_CONTROL_START_MSK)
17 /*
18  * 功能:喂狗操作
19  * 使用方法:向PERIODL、PERIODH写入任意值
20  */
21 #define Feed_WDT  \
22   IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_TIMER_BASE, 0x1234)
23  
24 int main(void)
25 {
26   alt_u8  i;
27   Init_WDT;                             // 初始化看门狗
28   Feed_WDT;                             // 进行喂狗操作
29  
30   /*
31    * LED先快速亮灭10次
32    */
33   for(i=0; i<10; i++)
34   {
35     Q_LED_ON;
36     usleep(100*1000);
37     Feed_WDT;                           // 进行喂狗操作
38  
39     Q_LED_OFF;
40     usleep(100*1000);
41     Feed_WDT;                           // 进行喂狗操作
42   }
43  
44   /*
45    * LED保持熄灭状态2s,再重新打开
46    */
47   Q_LED_OFF;
48   usleep(500*1000);
49   Feed_WDT;                             // 进行喂狗操作
50   usleep(500*1000);
51   Feed_WDT;                             // 进行喂狗操作
52   usleep(500*1000);
53   Feed_WDT;                             // 进行喂狗操作
54   usleep(500*1000);
55   Feed_WDT;                             // 进行喂狗操作
56   Q_LED_ON;
57  
58   while(1)
59   {
60  
61   }
62  
63   return 0;
64 }</unistd.h>

注:</unistd.h>是发博客发出来的,不属于该代码。

第14-16行,初始化看门狗,即启动看门狗;具体操作,就是给控制寄存器的START位置一。注意,看门狗一旦启动,就不能再被关闭。

第21-22行,是喂狗操作。无论给PERIODL、PERIODH写任何值,看门狗都会在所设置的溢出时间后复位。本文中的看门狗的溢出时间是 1s,是在SOPC Builder中配置Interval Timer的时候所设置的。大家可自行设置为其他值。因此为了保证不被复位,我们要在喂狗后的溢出时间内再次喂狗。

4. 运行结果

LED经过亮灭闪烁10次、灭2秒、亮1秒后,复位后重新开始亮灭闪烁等现象。

注意灭2秒是延时所致,而亮1秒是由于看门狗的溢出时间到了自动复位的缘故;如果没有看门狗,LED将一直亮下去。

参考资料

1. Volume5: Embedded Peripherals, QuartusII  Handbook Version 9.1

http://www.altera.com/literature/hb/nios2/n2cpu_nii5v3.pdf