打印

MSP430F149单片机有软件复位命令吗

[复制链接]
5239|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
funior|  楼主 | 2016-1-10 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jchaodong| | 2016-1-11 13:41 | 只看该作者
应该是没有,我都是用看门狗实现的复位功能

使用特权

评论回复
板凳
ayl439| | 2016-1-11 14:40 | 只看该作者
能实现软件复位的命令,算不算软件复位命令?

如果算的话:WDTCTL = 0;

使用特权

评论回复
地板
dirtwillfly| | 2016-1-11 14:53 | 只看该作者
很多非法指令都能让msp430重启

使用特权

评论回复
5
funior|  楼主 | 2016-1-11 15:47 | 只看该作者
dirtwillfly 发表于 2016-1-11 14:53
很多非法指令都能让msp430重启

比如呢

使用特权

评论回复
6
dirtwillfly| | 2016-1-11 16:16 | 只看该作者

建议用 ((void (*)())0xFFFE)()来实现,0xFFFE为复位向量的地址
尽量不要用非法的指令

使用特权

评论回复
评论
dirtwillfly 2019-5-10 21:19 回复TA
@狮子歌歌 :不清楚,你用的什么型号的msp430?上传代码看看 
狮子歌歌 2019-5-10 18:18 回复TA
我调用这个函数,程序阻塞在了下一行代码处,单片机也没有执行复位,是哪里不对吗? 
7
funior|  楼主 | 2016-1-11 16:57 | 只看该作者
OK,谢谢,
另外麻烦帮忙看看这个定时中断,为什么运行到定时器初始化之后,再下一步就进到定时中断服务程序了,而且一直是不断的循环进到中断服务程序,出来又进去,死循环在这了
无论我怎么改TACCR0的值都不行,是不是在定时器初始化的时候要加个TAR=0;
void init_timer()
{
        TACTL=TASSEL_2+TACLR+ID_3;         //设置计时器A使用SMCLK(XT2,8MHz),8分频,并清零计数器。
        TACTL|=TAIE+MC_1;                 //设置计时器A为增计数模式,并开始计数
        TACCR0=50000;                         //设置计时器A的初始值
}

使用特权

评论回复
8
funior|  楼主 | 2016-1-11 17:03 | 只看该作者
dirtwillfly 发表于 2016-1-11 16:16
建议用 ((void (*)())0xFFFE)()来实现,0xFFFE为复位向量的地址
尽量不要用非法的指令 ...

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;                             //
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt
  init_timer();
  _EINT();                                  // Enter LPM3 w/interrupt

  g_ucStartFlag = 0;
  g_ucRxCnt = 0;
  g_ucRdFlag = 0;

  InitLcd();

  ShowImage();
  Init_Keypad();

  var = 1.234;
  while(1);
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
        if(i==20)
        {
                i=0;
                cfg=1;
        }
        else
                i++;
}

使用特权

评论回复
9
ayl439| | 2016-1-11 17:09 | 只看该作者
funior 发表于 2016-1-11 16:57
OK,谢谢,
另外麻烦帮忙看看这个定时中断,为什么运行到定时器初始化之后,再下一步就进到定时中断服务程 ...

你是用仿真器看的把。。。

使用特权

评论回复
10
funior|  楼主 | 2016-1-11 17:14 | 只看该作者
单步调试看的

使用特权

评论回复
11
ayl439| | 2016-1-11 18:00 | 只看该作者
我猜就是。。。

使用特权

评论回复
12
dirtwillfly| | 2016-1-11 18:02 | 只看该作者
funior 发表于 2016-1-11 16:57
OK,谢谢,
另外麻烦帮忙看看这个定时中断,为什么运行到定时器初始化之后,再下一步就进到定时中断服务程 ...

TACCR0=50000
这个值太大了,改小一些,不超过32768试试

使用特权

评论回复
13
funior|  楼主 | 2016-1-11 18:51 | 只看该作者
50000,10000,1000,100,10都试过了,结果一样,只是改成0,不进入中断了

使用特权

评论回复
14
funior|  楼主 | 2016-1-11 18:56 | 只看该作者
ayl439 发表于 2016-1-11 18:00
我猜就是。。。

有什么不妥吗

使用特权

评论回复
15
幸福至上| | 2016-1-11 19:51 | 只看该作者
是不是没有清定时器中断标志。。。

使用特权

评论回复
16
dirtwillfly| | 2016-1-11 20:10 | 只看该作者

找个官网提供的定时器例程试试

使用特权

评论回复
17
hellosdc| | 2016-1-11 22:10 | 只看该作者
这个有功能的。

使用特权

评论回复
18
hellosdc| | 2016-1-11 22:12 | 只看该作者
看门狗就可以实现

使用特权

评论回复
19
funior|  楼主 | 2016-1-11 22:45 | 只看该作者
ayl439 发表于 2016-1-11 18:00
我猜就是。。。

果然是仿真器的问题,害的我好惨,程序没问题,妈的只有仿真时候出问题

使用特权

评论回复
20
funior|  楼主 | 2016-1-11 22:46 | 只看该作者
dirtwillfly 发表于 2016-1-11 20:10
找个官网提供的定时器例程试试

所有问题已解决,非常感谢,定时器那个是仿真器的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

256

主题

805

帖子

7

粉丝