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

2019-08-03 21:27发布

我想用软件的方法复位,阅读固件手册,发现SysCtlReset();该函数可以解决问题。
但是我在调用了这个函数之后,整个系统复位之后就起不来了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
spark周
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 (;;) // 不会执行到这里

    {

    }

    }

一周热门 更多>