Tiny4412中断之看门狗

发布者:幸福自由最新更新时间:2022-01-12 来源: eefocus关键字:Tiny4412  中断  看门狗 手机看文章 扫描二维码
随时随地手机看文章

  一:看门狗(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) {

[1] [2]
关键字:Tiny4412  中断  看门狗 引用地址:Tiny4412中断之看门狗

上一篇:Tiny4412之外部中断
下一篇:Tiny4412中断介绍

推荐阅读最新更新时间:2024-11-12 13:25

【STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)
21.1 NVIC基础知识 NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。 对于M3/M4/M7内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST的STM32F1xx,F4xx和H7只使用了这个8位中的高四位 ,低四位取零,这样2^4=16,只能表示16级中断嵌套。 对于这个NVIC,有个重要的知识点就是优先级分组、抢占优先级和子优先级。STM32F1xx,F4xx和H7都是只使用了这个8位寄存器的高四位 。 从上面的表格可以看出,
[单片机]
【STM32H7教程】第21章 STM32H7的NVIC<font color='red'>中断</font>分组和配置(重要)
正点原子STM32F4中断优先级管理(10)
今天讲解,STM32F4开发指南 STM32F4中文参考手册,f4只使用了其中的一部分中断可以找到F4的中文参考手册第10节 有一个表格STM32F405XX和STM32F407XX和STM32F415XX/17XX的向量表 有0-81个可屏蔽中断 如何管理这几十个中断?就是利用NVIC ,首先看一下中断优先级分组,分组就是利用SCB- AIRCR中断配置,设置他的8-10位来设置中断优先级分组。设置了分组之后,就确定了 抢占优先级和相应优先级,每一个中断都有一个IP寄存器,这个IP寄存器的低位是4-7,当我们利用AIRCR设置好分组后他的IP寄存器也就配置好了。 这里有个问题 这么分组有什么意义?抢占优先级和响应优
[单片机]
正点原子STM32F4<font color='red'>中断</font>优先级管理(10)
ARM中异常中断问题详情分析总结
一、ARM中异常中断的类型: 异常中断名称 含义 复位(Reset) 当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况: 1、系统加电时 2、系统复位时 3、跳转到复位中断向量处执行,称为软复位 未定义的指令 当ARM处理器或者是系统中协处理器认为当前指令未定义时,产生未定义指令异常中断。可以通过该异常中断机制仿真浮点向量运算。 软件中断 (software interrupt SWI) 这是一个由用户定义的中断指令。可以用于用户模式下程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用 指令预取中止 (Prefec
[单片机]
51单片机中断过程与主程序调用子程序过程的比较
3.1调用子程序过程 主程序调用子程序过程应包括保护断点、跳至子程序首址、保护现场、子程序处理、恢复现场、恢复断点(子程序返回)6步。这六步都是用软件指令完成的。其中前两步保护断点和跳至子程序首址由调用指令CALL完成。保护断点其实就是把断点地址推入堆栈中保护起来,要注意的是保护的断点应是紧跟着调用指令的下一条指令地址,而不是调用指令本身地址,否则会引起重复调用 死循环 ,这点必须提醒学生注意。LCALL与ACALL是MCS-51单片机的两条调用指令,分别称为长调用和绝对调用,两指令主要区别在于LCALL后面操作数直接就是16位二进制的子程序入口地址;而ACALL后面操作数只是11位二进制数,子程序入口地址是把这11位数作为
[单片机]
stm8s_iwdg(独立看门狗)
//内部时钟源128Khz,硬件2分频=64khz 这里写代码片 IWDG_Initializes(); //初始化 IWDG_ReloadCounter(); //喂狗(重载计数值) 初始化流程: void IWDG_Initializes(void) { IWDG_Enable(); //使能看门狗 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //允许写分频值和重载值 IWDG_SetPrescaler(IWDG_Prescaler_256); //分频值 IWDG_SetReload(250);
[单片机]
ARM中断向量表重定位到片外RAM方法
由于ARM CPU产生中断或者异常后,PC指针自动跳转到0x00地址执行(同时执行一些CPSR寄存器的保存、运行模式的转换等),所以要在0x00地址处存放中断向量表。而如果我们想将中断向量表重定位到片外ram的 话, 有2中方法: 1、启用MMU 将片外RAM空间隐射到0x00处 2、在0x00(片内RAM)地址处存放一份和片外RAM一模一样的中断向量表 标准做法是将程序存放在NAND FLASH里面,S3C2440 CPU启动后,会将程序复制到片内RAM里面,此时中断向量表也复制到了IRAM里 3、有部分CPU支持设置中断向量表的寄存器 这样也可以实现重定位
[单片机]
STM32F072RB 实作笔记(六)- 计时器加上中断EXTI_IRQHandler(二)
计时器基本上是一种**“数数量游戏”**的概念! 设想一个场景,你前面有一个回转寿司的小火车,你的工作是把盘子放到小火车上,或是从小火车上把盘子拿下来, 那么这个游戏会有三种基本玩法: 给你一堆**”固定数量“的盘子,我说“开始”**,然后你把盘子连续放到小火车上,放完的时候要 “打开完成讯号” 告诉我! 从小火车上连续拿盘子下来;我说 “开始” 的时候,你从小火车上连续拿盘子,直到我说 “停” ,你就把 “拿到的数量” 告诉我。 红绿灯:连续拿盘子,第 “0~ A ” 个数盘子时,你把 ”红灯“ 打开,第“A+1~B” 个盘子时红灯切到 ”绿灯“,然后再 ”重新开始数“。 这个”小火车“ 就是 ”时脉“ clock。 从
[单片机]
STM32F072RB 实作笔记(六)- 计时器加上<font color='red'>中断</font>EXTI_IRQHandler(二)

推荐帖子

超低功耗四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
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved