如何从程序中开始复位

如何从程序中开始复位,第1张

程序控制的软件复位方法

微处理器复位方法:

用硬件引脚RESET的复位方法;

用看门狗的复位方法;

自己程序控制的复位方法(本文方法,叫软件复位)。

软件复位实现方法

首先声明一个函数指针,指向复位后要开始执行指令的位置:

void (*app_start)(void) = 0x0000

可以根据具体微处理器复位后的位置,修改后边的地址。

之后,在自己的程序中想复位的地方调用app_start()也就是跳到0x0000位置执行指令。

可以根据不同微处理器复位的地址,修改上边的地址(0x0000)。实现上你可以跳到任何位置执行,或调用函数执行。

实例测试

以下以Arduino为开发环境来测试。注意:在AVR微处理器中,为了使Arduino复位时不再进入引导区,使AVR设置BOOTRST设置为1。

使用函数指针复位方法如下,你能想象到下边的程序会使LED灯闪亮吗?

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

///0. 引脚定义

#define LED_PIN 13 //定义LED引脚为13号数据引脚(DIG13)

static void (*reset_this_CPU)(void) = 0x0000// ***复位本CPU函数指针

///1. 初始化

void setup() {

pinMode(LED_PIN, OUTPUT)// 初始化DIG13为输出

digitalWrite(LED_PIN, HIGH)//DIG13输出高电平

delay(1000)//延时1秒

digitalWrite(LED_PIN, LOW) //DIG13输出低电平

delay(1000)//延时1秒

reset_this_CPU()//***跳到0x0000地址指针,也就是复位

}

///2. 循环

void loop() {

//此处什么也没有啊!

}

结论

用本方法,可以用软件方式进行复位,也可以用这个函数指针的方法调用任何函数。

C51单片机的程序状态字PSW是一个8位寄存器,其中定义了7位;

CY、AC、F0、RS1、RS0、OV、-、P;

CY、AC、OV标记位与运算有关,而 P标记则与A寄存器值相关;

F0、RS1、RS0标记位默认为0,需要时再设置;

如此,单片机复位后,程序运行前,PWS=0;

Reset引脚上为高电平时,引起cpu复位,复位后cpu内部的段寄存器,标志寄存器,指令指针ip及指令队列都将被清零,只有段寄存器cs被设置为FFFFH。一旦复位完成,cpu将从CS:IP值为FFFFH:0000H,即物理地址为0FFFF0H的地址开始执行程序。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11185569.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存