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

[复制链接]
6039|34
 楼主| funior 发表于 2016-1-10 20:45 | 显示全部楼层 |阅读模式
MSP430F149单片机有软件复位命令吗,很着急,在线等,哪位大侠帮帮忙
jchaodong 发表于 2016-1-11 13:41 | 显示全部楼层
应该是没有,我都是用看门狗实现的复位功能
ayl439 发表于 2016-1-11 14:40 | 显示全部楼层
能实现软件复位的命令,算不算软件复位命令?

如果算的话:WDTCTL = 0;
dirtwillfly 发表于 2016-1-11 14:53 | 显示全部楼层
很多非法指令都能让msp430重启
 楼主| funior 发表于 2016-1-11 15:47 | 显示全部楼层
dirtwillfly 发表于 2016-1-11 14:53
很多非法指令都能让msp430重启

比如呢
dirtwillfly 发表于 2016-1-11 16:16 | 显示全部楼层

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

评论

@狮子歌歌 :不清楚,你用的什么型号的msp430?上传代码看看  发表于 2019-5-10 21:19
我调用这个函数,程序阻塞在了下一行代码处,单片机也没有执行复位,是哪里不对吗?  发表于 2019-5-10 18:18
 楼主| 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的初始值
}
 楼主| 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++;
}
ayl439 发表于 2016-1-11 17:09 | 显示全部楼层
funior 发表于 2016-1-11 16:57
OK,谢谢,
另外麻烦帮忙看看这个定时中断,为什么运行到定时器初始化之后,再下一步就进到定时中断服务程 ...

你是用仿真器看的把。。。
 楼主| funior 发表于 2016-1-11 17:14 | 显示全部楼层
单步调试看的
ayl439 发表于 2016-1-11 18:00 | 显示全部楼层
我猜就是。。。
dirtwillfly 发表于 2016-1-11 18:02 | 显示全部楼层
funior 发表于 2016-1-11 16:57
OK,谢谢,
另外麻烦帮忙看看这个定时中断,为什么运行到定时器初始化之后,再下一步就进到定时中断服务程 ...

TACCR0=50000
这个值太大了,改小一些,不超过32768试试
 楼主| funior 发表于 2016-1-11 18:51 | 显示全部楼层
50000,10000,1000,100,10都试过了,结果一样,只是改成0,不进入中断了
 楼主| funior 发表于 2016-1-11 18:56 | 显示全部楼层
ayl439 发表于 2016-1-11 18:00
我猜就是。。。

有什么不妥吗
幸福至上 发表于 2016-1-11 19:51 | 显示全部楼层
是不是没有清定时器中断标志。。。
dirtwillfly 发表于 2016-1-11 20:10 | 显示全部楼层

找个官网提供的定时器例程试试
hellosdc 发表于 2016-1-11 22:10 | 显示全部楼层
这个有功能的。
hellosdc 发表于 2016-1-11 22:12 | 显示全部楼层
看门狗就可以实现
 楼主| funior 发表于 2016-1-11 22:45 | 显示全部楼层
ayl439 发表于 2016-1-11 18:00
我猜就是。。。

果然是仿真器的问题,害的我好惨,程序没问题,妈的只有仿真时候出问题
 楼主| funior 发表于 2016-1-11 22:46 | 显示全部楼层
dirtwillfly 发表于 2016-1-11 20:10
找个官网提供的定时器例程试试

所有问题已解决,非常感谢,定时器那个是仿真器的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

256

主题

805

帖子

7

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