调用了这个函数之后整个系统复位之后就起不来了

2019-08-03 21:27发布

我想用软件的方法复位,阅读固件手册,发现SysCtlReset();该函数可以解决问题。
但是我在调用了这个函数之后,整个系统复位之后就起不来了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
dengdc
1楼-- · 2019-08-04 15:45
 精彩回答 2  元偷偷看……
spark周
2楼-- · 2019-08-04 21:33
按照逻辑复位后应该到main函数,主函数部分是什么个情况?
liliang9554
3楼-- · 2019-08-05 00:23
记得好像复位后要人为将某位清零。
spark周
4楼-- · 2019-08-05 04:39

    基于《Stellaris外设驱动库》的SysCtl例程:软件复位示例

    掌握库函数SysCtlReset()的用法。

    程序运行后,LED1和LED2交替闪烁数次,以表明正常工作了。稍后,由于执行函数SysCtlReset()而导致芯片复位重来,LED1和LED2又会交替闪烁数次。如此反复。

    主函数:

    // 包含必要的头文件

    #include "LED.H"

    #include <hw_types.h>

    #include <hw_memmap.h>

    #include <hw_sysctl.h>

    #include <hw_gpio.h>

    #include <sysctl.h>

    #include <gpio.h>


    // 将较长的标识符定义成较短的形式

    #define SysCtlPeriEnable SysCtlPeripheralEnable

    #define SysCtlPeriDisable SysCtlPeripheralDisable

    #define GPIOPinTypeIn GPIOPinTypeGPIOInput

    #define GPIOPinTypeOut GPIOPinTypeGPIOOutput

    #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD


    // 定义KEY

    #define KEY_PERIPH SYSCTL_PERIPH_GPIOG

    #define KEY_PORT GPIO_PORTG_BASE

    #define KEY_PIN GPIO_PIN_5


    // 防止JTAG失效

    void JTAG_Wait(void)

    {

    SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口

    GPIOPinTypeIn(KEY_PORT , KEY_PIN); // 设置KEY所在管脚为输入

    if ( GPIOPinRead(KEY_PORT , KEY_PIN) == 0x00 ) // 如果复位时按下KEY,则进入

    {

    for (;;); // 死循环,以等待JTAG连接

    }

    SysCtlPeriDisable(KEY_PERIPH); // 禁止KEY所在的GPIO端口

    }


    // 定义全局的系统时钟变量

    unsigned long TheSysClock = 12000000UL;


    // 延时

    void Delay(unsigned long ulVal)

    {

    while ( --ulVal != 0 );

    }


    // 主函数(程序入口)

    int main(void)

    {

    int i;

    JTAG_Wait(); // 防止JTAG失效,重要!

    LED_Init(LED1 | LED2); // 初始化LED1和LED2

    LED_On(LED1); // 点亮LED1

    LED_Off(LED2); // 熄灭LED2

    for ( i = 0; i < 6; i++ ) // 使LED闪烁数次,表明已复位

    {

    LED_Toggle(LED1 | LED2);

    Delay(200 * (TheSysClock / 4000));

    }

    LED_Off(LED1 | LED2); // 熄灭LED

    Delay(3500 * (TheSysClock / 4000)); // 延迟一段时间

    SysCtlReset(); // 软件复位

    for (;;) // 不会执行到这里

    {

    }

    }

dengdc
5楼-- · 2019-08-05 10:24
主函数比较麻烦,在0-1000H单元里是我的BOOT程序,判断按键情况跳转到1000H起始的应用程序main函数。
void
SysCtlReset(void)
{
     //
     // Perform a software reset request.  This request causes the device to
     // reset, no further code is executed.
     //
     HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;

    //
     // The device should have reset, so this should never be reached.  Just in
     // case, loop forever.
     //
     while(1)
     {
     }
}
我看这个函数的意思是,往NVIC_APINT这个寄存器里写数,就可以复位了,之后程序就不往下继续走了,如何清零啊
zhaoxqi
6楼-- · 2019-08-05 13:38
 精彩回答 2  元偷偷看……

一周热门 更多>