打印

请教LM3S软件复位问题

[复制链接]
3590|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 感谢帮助
5
和i在一起| | 2012-6-21 15:25 | 只看该作者
记得好像复位后要人为将某位清零。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yzjgod + 1 感谢帮助
6
5509| | 2012-6-21 15:28 | 只看该作者
基于《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 (;;) // 不会执行到这里
{
}
}

使用特权

评论回复
7
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这个寄存器里写数,就可以复位了,之后程序就不往下继续走了,如何清零啊

使用特权

评论回复
8
5509| | 2012-6-21 15:32 | 只看该作者
串口发送数据到一半就停了,这个感觉和复位没关系吧,至少发完才开始复位才对

使用特权

评论回复
9
yzjgod|  楼主 | 2012-6-21 15:43 | 只看该作者
你的例子我感觉和我的使用应该是一样的,串口数据放入发送的FIFO中,然后程序就从发送程序中退出了,执行其他的部分,这个时候调用的复位函数,应该就会出现我说的这种发送了一半的情况。
是不是boot程序对于复位有影响,我得再试试。

使用特权

评论回复
10
和i在一起| | 2012-6-21 15:43 | 只看该作者
试试主函数里判断RESC寄存器中的SW位,如为1,则清零。

使用特权

评论回复
11
yzjgod|  楼主 | 2012-6-21 15:48 | 只看该作者
了解,试下

使用特权

评论回复
12
yzjgod|  楼主 | 2012-6-21 16:24 | 只看该作者
靠,仿真器DOWN不了程序了,老出这个问题,上午怎么解决的给忘了,马上下班了,下周继续

使用特权

评论回复
13
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

粉丝