请教LM3S软件复位问题

[复制链接]
4332|12
 楼主| yzjgod 发表于 2012-6-21 14:54 | 显示全部楼层 |阅读模式
我想用软件的方法复位,阅读固件手册,发现SysCtlReset();该函数可以解决问题。
但是我在调用了这个函数之后,整个系统复位之后就起不来了。
对于为什么判断说已经复位了,因为我在这个函数之前有个串口发送数据,结果发到一半就停了,感觉这个复位函数已经起作用了。
有谁有经验,传授一下,除了看门狗,还有什么软件复位的办法,谢谢
5509 发表于 2012-6-21 15:14 | 显示全部楼层
最好把相关代码贴出来分析下。
 楼主| yzjgod 发表于 2012-6-21 15:18 | 显示全部楼层
void end2cmd(unsigned char Ch)
{
        PROG_MODE = 0;
        CopyPrint(pagetop_msg_tab[PRGPAGE.top_no]);
        PRGPAGE.top_no = 0;
        PRGPAGE.progmode = 1;
        mac_save_flag = 0;
        FlashInit();
        SysCtlReset();
}
代码很简单,就是一个调用SysCtlReset();函数
5509 发表于 2012-6-21 15:24 | 显示全部楼层
按照逻辑复位后应该到main函数,主函数部分是什么个情况?

评分

参与人数 1威望 +1 收起 理由
yzjgod + 1 感谢帮助

查看全部评分

和i在一起 发表于 2012-6-21 15:25 | 显示全部楼层
记得好像复位后要人为将某位清零。

评分

参与人数 1威望 +1 收起 理由
yzjgod + 1 感谢帮助

查看全部评分

5509 发表于 2012-6-21 15:28 | 显示全部楼层
  1. 基于《Stellaris外设驱动库》的SysCtl例程:软件复位示例

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

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

  4. 主函数:

  5. // 包含必要的头文件
  6. #include "LED.H"
  7. #include <hw_types.h>
  8. #include <hw_memmap.h>
  9. #include <hw_sysctl.h>
  10. #include <hw_gpio.h>
  11. #include <sysctl.h>
  12. #include <gpio.h>


  13. // 将较长的标识符定义成较短的形式
  14. #define SysCtlPeriEnable SysCtlPeripheralEnable
  15. #define SysCtlPeriDisable SysCtlPeripheralDisable
  16. #define GPIOPinTypeIn GPIOPinTypeGPIOInput
  17. #define GPIOPinTypeOut GPIOPinTypeGPIOOutput
  18. #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD


  19. // 定义KEY
  20. #define KEY_PERIPH SYSCTL_PERIPH_GPIOG
  21. #define KEY_PORT GPIO_PORTG_BASE
  22. #define KEY_PIN GPIO_PIN_5


  23. // 防止JTAG失效
  24. void JTAG_Wait(void)
  25. {
  26. SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口
  27. GPIOPinTypeIn(KEY_PORT , KEY_PIN); // 设置KEY所在管脚为输入

  28. if ( GPIOPinRead(KEY_PORT , KEY_PIN) == 0x00 ) // 如果复位时按下KEY,则进入
  29. {
  30. for (;;); // 死循环,以等待JTAG连接
  31. }

  32. SysCtlPeriDisable(KEY_PERIPH); // 禁止KEY所在的GPIO端口
  33. }


  34. // 定义全局的系统时钟变量
  35. unsigned long TheSysClock = 12000000UL;


  36. // 延时
  37. void Delay(unsigned long ulVal)
  38. {
  39. while ( --ulVal != 0 );
  40. }


  41. // 主函数(程序入口)
  42. int main(void)
  43. {
  44. int i;

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

  46. LED_Init(LED1 | LED2); // 初始化LED1和LED2
  47. LED_On(LED1); // 点亮LED1
  48. LED_Off(LED2); // 熄灭LED2

  49. for ( i = 0; i < 6; i++ ) // 使LED闪烁数次,表明已复位
  50. {
  51. LED_Toggle(LED1 | LED2);
  52. Delay(200 * (TheSysClock / 4000));
  53. }

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

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

  56. SysCtlReset(); // 软件复位

  57. for (;;) // 不会执行到这里
  58. {
  59. }
  60. }
 楼主| yzjgod 发表于 2012-6-21 15:30 | 显示全部楼层
主函数比较麻烦,在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这个寄存器里写数,就可以复位了,之后程序就不往下继续走了,如何清零啊
5509 发表于 2012-6-21 15:32 | 显示全部楼层
串口发送数据到一半就停了,这个感觉和复位没关系吧,至少发完才开始复位才对
 楼主| yzjgod 发表于 2012-6-21 15:43 | 显示全部楼层
你的例子我感觉和我的使用应该是一样的,串口数据放入发送的FIFO中,然后程序就从发送程序中退出了,执行其他的部分,这个时候调用的复位函数,应该就会出现我说的这种发送了一半的情况。
是不是boot程序对于复位有影响,我得再试试。
和i在一起 发表于 2012-6-21 15:43 | 显示全部楼层
试试主函数里判断RESC寄存器中的SW位,如为1,则清零。
 楼主| yzjgod 发表于 2012-6-21 15:48 | 显示全部楼层
了解,试下
 楼主| yzjgod 发表于 2012-6-21 16:24 | 显示全部楼层
靠,仿真器DOWN不了程序了,老出这个问题,上午怎么解决的给忘了,马上下班了,下周继续
 楼主| yzjgod 发表于 2012-6-25 10:18 | 显示全部楼层
问题算是部分解决了,我把其中发现的问题和大家说一下吧。
1. 仿真器的问题
    我的两个串口和电脑的串口助手软件连接,此时使用仿真器的时候,老是提示can not connect to target,后来把串口给拔了,就好用了。
2. 软件复位的问题
    中间设置了N个状态指示灯,发现不是我的boot的问题,而是在

    //
    // Configure the UART1 for 9600, 8-N-1 operation.
    //
    UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 9600,
                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                         UART_CONFIG_PAR_NONE));
这个函数中出不来了,一步一步试吧,第一步他调用UARTDisable(ulBase);这个东西,关闭串口时,该函数有while循环,怀疑程序在这里面出不来了。
然后我单独把这个函数拿出来,先运行他,结果奇迹发生了,此时软件重启后程序可以正常运行了,我OO他个XX
您需要登录后才可以回帖 登录 | 注册

本版积分规则

239

主题

370

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部