[笔记].怎样使用Nios II中的watchdog_timer?.[Nios II][SOPC Builder]
0赞本文简单描述如何使用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