一:看门狗(WDT watch dog timer)
看门狗其实是一个计数器,它的作用就是防止程序陷入死循环或者程序运行跑飞;看门狗是一个硬件,它的工作原理是,初始化给他一个值,它会过一段时间减一,直到这个数减为0,它将会产生一个中断信号或者reset信号,致使我们系统复位,而又时候我们不想让它过一会儿就重启又想预防死机,那么我们就可以在这个数减到快要接进0的时候,给它重新赋值;这样就不会触发reset信号,但当程序跑飞时机器死机时,它就会减到零,进行操作系统复位;
具体看下图所示:输入时钟为PCLK(该时钟频率等于系统的主频),它经过两级分频(Prescaler和frequency division factor),最后将分频后的时钟作为该定时器的输入时钟,当计数器期满后可以产生中断或者复位信号。
看门狗计数器公式如下:
t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )
通过tiny4412用户手册我们可以找到看门狗的中断号为75(如下图):
预分频器Prescaler及分频因子Division factor的值在WTCON(看门狗时钟控制寄存器)中设置,如下图:
今天的程序是使用watchdog来实现led灯的闪烁,下面贴出代码:
1 #ifndef __BUNFLY_H
2 #define __BUNFLY_H
3
4 #define ICCICR_CPU0 (*(volatile unsigned long *)0x10480000)
5 #define ICCPMR_CPU0 (*(volatile unsigned long *)0x10480004)
6 #define ICDDCR (*(volatile unsigned long *)0x10490000)
7 #define ICDIPR0_CPU0 (*(volatile unsigned long *)0x10490400)
8 #define ICDIPTR0_CPU0 (*(volatile unsigned long *)0x10490800)
9 #define ICDISER0_CPU0 (*(volatile unsigned long *)0x10490100)
10 #define ICDSGIR (*(volatile unsigned long *)0x10490f00)
11 #define ICCEOIR_CPU0 (*(volatile unsigned long *)0x10480010)
12 #define ICCIAR_CPU0 (*(volatile unsigned long *)0x1048000c)
13 #define ICDIPR2_CPU0 (*(volatile unsigned long *)0x10490408)
14 #define ICDIPTR2_CPU0 (*(volatile unsigned long *)0x10490808)
15 #define ICDIPR3_CPU0 (*(volatile unsigned long *)0x1049040c)
16 #define ICDIPTR3_CPU0 (*(volatile unsigned long *)0x1049080c)
17 #define ICDIPR16_CPU0 (*(volatile unsigned long *)0x10490440)
18 #define ICDIPTR16_CPU0 (*(volatile unsigned long *)0x10490840)
19 #define ICDIPR18_CPU0 (*(volatile unsigned long *)0x10490448)
20 #define ICDIPTR18_CPU0 (*(volatile unsigned long *)0x10490848)
21 #define ICDISER2_CPU0 (*(volatile unsigned long *)0x10490108)
22
23 #define WTCON (*(volatile unsigned long *)0x10060000)
24 #define WTDAT (*(volatile unsigned long *)0x10060004)
25 #define WTCNT (*(volatile unsigned long *)0x10060008)
26 #define WTCLRINT (*(volatile unsigned long *)0x1006000C)
27
28 #define EXT_INT43CON (*(volatile unsigned long *)0x11000e0c)
29 #define EXT_INT43_MASK (*(volatile unsigned long *)0x11000f0c)
30 #define EXT_INT43_PEND (*(volatile unsigned long *)0x11000f4c)
31 #define GPX3CON (*(volatile unsigned long *)0x11000c60)
32
33 #define GPM4CON (*(volatile unsigned long *)0x110002e0)
34 #define GPM4DAT (*(volatile unsigned long *)0x110002e4)
35
36 #endif //__BUNFLY_H
1 #include "bunfly.h"
2
3 void (*udelay)(int) = 0xc3e25f90;
4 int (*printf)(char *, ...) = 0xc3e114d8;
5 void enable_mmu();
6 void init_table(unsigned long *addr);
7 void memcpy(unsigned char *dest, unsigned char *src, int len);
8 extern unsigned long vector_start;
9 void do_irq();
10 void led_on();
11 void led_off();
12
13 int main()
14 {
15 memcpy(0x70000000, vector_start, 0x1000);
16 enable_mmu();
17
18 *(unsigned long *)0x47000000 = do_irq;
19
20 //step 1: set cpu permit interrupt
21 __asm__ __volatile__(
22 "mrs r0, cpsrn"
23 "bic r0,r0, #0x80n"
24 "msr cpsr, r0n"
25 :::"r0"
26 );
27
28 //step 2: set GIC (cgi) enable
29 ICCICR_CPU0 = 1; //中断总开关
30 ICCPMR_CPU0 =0xff;//设置最低优先级(门槛)
31 ICDDCR = 1; //本中断开关
32 ICDIPR18_CPU0 = (100 << 24);//设置本中断优先级
33 ICDIPTR18_CPU0 = (1 << 24);//选择指定的cpu进行中断处理
34 ICDISER2_CPU0 = (1 << 11);//启用本中断
35
36 //step 3: set watch dog timer
37 WTCNT = 32768;
38 WTDAT = 32768;
39 WTCON = (1 << 2) | (3 << 3) | (1 << 5) | (95 << 8);
40
41 printf("welcom backn");
42 }
43
44 void do_irq()
45 {
46 WTCLRINT = 0;//清中断
47 printf("wang wang wangn");
48 static int flags = 1;
49 if(flags) {
50 led_on();
51 flags = 0;
52 }
53 else {
54 led_off();
55 flags = 1;
56 }
57 }
58
59 void led_on()
60 {
61 GPM4CON &= ~0xffff;
62 GPM4CON |= 0x1111;
63 GPM4DAT &= ~0xf;
64 }
65
66 void led_off()
67 {
68
69 GPM4CON &= ~0xffff;
70 GPM4CON |= 0x1111;
71 GPM4DAT |= 0xf;
72 }
73
74 void memcpy(unsigned char *dest, unsigned char *src, int len)
75 {
76 int i = 0;
77 for(i = 0; i < len; i++) {
78 dest[i] = src[i];
79 }
80 }
81
82 void enable_mmu()
83 {
84 /*构建表*/
85 unsigned long addr = 0x50000000;
86 init_table(addr);
87 /*打开mmu*/
88 unsigned long mmu = 0;
89 mmu = 1 | (1 << 1) | (1 << 3) | (1 << 8);
90 __asm__ __volatile__ (
91 "mov r0, #3n"
92 "MCR p15, 0, r0, c3, c0, 0n"//设置为管理员
93 "MCR p15, 0, %0, c2, c0, 0n"//设置表的地址
94 "MCR p15, 0, %1, c1, c0, 0n"//开启mmu
95 :
96 : "r" (addr), "r" (mmu)
97 :
98 );
99
100 }
101
102 __asm__(
103
104 "vector: n"
105 " b resetn"
106 " b undn"
107 " b swin"
108 " b pre_abtn"
109 " b data_abtn"
110 " .word 0x0n"
111 " b irqn"
112 " b fiqn"
113 "reset:n"
114 "und:n"
115 " mov sp, #0x47000000n"
116 " stmdb sp!, {r0-r12, lr}n"
117
118 " ldr r3, =0x47000004n"
119 " ldr r2, [r3]n"
120 " blx r2n"
121
122 " mov sp, #0x47000000n"
123 " ldmdb sp, {r0-r12, pc}^ n"
124
125 "swi:n"
126 " mov sp, #0x47000000n"
127 " stmdb sp!, {r0-r12, lr}^n"
128
129 " mov sp, #0x47000000n"
130 " ldmdb sp, {r0-r12, pc}^ n"
131
132 "pre_abt:n"
133
134 "data_abt:n"
135 " mov sp, #0x47000000n"
136 " sub lr, lr, #4n"
137 " stmdb sp!, {r0-r12, lr}n"
138
139 " ldr r3, =0x47000008n"
140 " ldr r2, [r3]n"
141 " blx r2n"
142
143 " mov sp, #0x47000000n"
144 " ldmdb sp, {r0-r12, pc}^ n"
145 "irq:n"
146
147 " mov sp, #0x47000000n"
148 " sub lr, lr, #4n"
149 " stmdb sp!, {r0-r12, lr}n"
150
151 " ldr r3, =0x47000000n"
152 " ldr r2, [r3]n"
153 " blx r2n"
154
155 " mov sp, #0x47000000n"
156 " ldmdb sp, {r0-r12, pc}^ n"
157
158 "fiq:n"
159
160 ".global vector_startn"
161 "vector_start: n"
162 ".word vector n "
163
164 );
165
166 void init_table(unsigned long *addr)
167 {
168 unsigned long va = 0;
169 unsigned long phys = 0;
170
171 //0x40000000-0x80000000 -> 0x40000000-0x80000000
172 for(va = 0x40000000; va < 0x80000000; va += 0x100000) {
173 phys = va;
174 addr[va >> 20] = phys | 2;
175 }
176
177 //0x10000000-0x14000000 -> 0x10000000-0x140000000
178 for(va = 0x10000000; va < 0x14000000; va += 0x100000) {
上一篇:Tiny4412之外部中断
下一篇:Tiny4412中断介绍
推荐阅读最新更新时间:2024-11-12 13:25
推荐帖子
- 超低功耗四2输入或非门
- 大家有什么超低功耗四2输入或非门的型号麻烦推荐下超低功耗四2输入或非门高速CMOS:74HC02低速CMOS:CD4001上面这几个在功耗上都没有什么突出,而且是通用型号,没有多大意义。不过我也拿不出有意义的东西建议去一些厂商的官网上去找一下。低到多少才算超低功耗?楼主应该先说清楚工作电压、速度要求和功耗要求。CMOS电路本身的静态功耗极低,主要功耗来自于逻辑电平的动态变化。
- yyhhgg 测试/测量
- 提问+Comparator的参考源选择Nmos管时稳定在一个值的原理是什么?
- 在MSP430内部的比较器Comparator的参考源选择有一种是Nmos管时,它可以将电压稳定在一个值的原理是什么?大家有了解的么?提问+Comparator的参考源选择Nmos管时稳定在一个值的原理是什么?
- hanskying666 微控制器 MCU
- 求PIC二手开发板
- 新手学PIC,资金紧张现求二手PIC开发板支持16F877A的,最好支持USB接口的,没有已行,有的联系我QQ:791196354本站强荐:185娱乐ぞ城.足球ぞ真_人.彩票齐全ぞ手机可投ぞ注任何游戏.首次开户送10元.首存送58元.信誉绝对保证185.cc求PIC二手开发板发了几天没人回复,自己做了个本站强荐:185娱乐S城.足球S真_人.彩票齐全S手机可投S注任何游戏.首次开户送10元.首存送58元.信誉绝对保证185.cc
- fengqiang 淘e淘
- 用过GPRS模块的请进
- 本人是GPRS模块的新手,希望得到您的指教,有什么好的建议和心得请留言。用过GPRS模块的请进如何说起呢?LZ还是能提出一些具体的问题。建议查阅GPRS模块的AT指令,尤其是上网部分。GPRS上网是很容易的,但是要保持稳定很不容易,需要做大量测试,要做好思想准备。不明LZ在说什么等待牛人来答.每个厂商的GPRS模块都是不一样的建议在弄清楚通用AT指令的基础上分析各个厂商的不同而且很多厂商的自定义命令可能会有问题如果楼主碰到什么问题了,在莱吧,这样泛泛的一问,谁有时间回答你
- richard.kong 嵌入式系统
- 能不能告诉我几个@表示的是并行,还是串行呢
- taskshift_in;outputshift;begin@(posedgescl)shift=sda;@(posedgescl)shift=sda;@(posedgescl)shift=sda;@(posedgescl)shift=sda;@(posedgescl)shift=sda;@(posedgescl)shift=sda;@(posedgescl)
- zhuleu19821025 FPGA/CPLD
- PIC单片机复位电路的电容不焊能工作吗
- 请问高手,PIC单片机复位电路的电容没焊电路能工作吗?谢谢PIC单片机复位电路的电容不焊能工作吗最主要是上拉,不过电源的波动就没法滤除了,加个电容可以防一下 我没焊电容,不过可以烧写,现象不对虽然没有电路图,假设是电阻和电容组成的复位电路,这个复位电路的电容是用作单片机上电复位,肯定需要的 奥,电容还没到,到了焊上再说不能,电容是有滤波作用的临时测试可以,但长期使用不稳定,偶尔会自动复位,取决于电源的干净程度。
- chenbingjy Microchip MCU
设计资源 培训 开发板 精华推荐
- ADS-B 1090Mhz 滤波放大器
- DC742B,具有 LTC2449UHF 24 位高速 8/16 通道 Delta Sigma ADC 的演示板
- #第七届立创电赛#USB电流表
- ATSAMA5D2-PTC-EK、基于 ATSAMA5D2 MPU 的 SAMA5D2-PTC-EK 评估套件,用于评估使用外设触摸控制器 (PTC) 的电容式触摸控制
- NE555 PWM
- LT3091MPR 无镇流器并联器件的典型应用(50mA 最小负载)
- L78L08AC正压稳压器高输出电流短路保护的典型应用
- 使用 Analog Devices 的 LT1371 的参考设计
- LM5106半桥驱动
- AM3G-2412DZ ±12V 3 瓦 DC 至 DC 转换器的典型应用