搜索
bottom↓
回复: 7

求教! ————————关于MSP430F5438 中的 WDT !

[复制链接]

出0入0汤圆

发表于 2011-10-15 16:16:55 | 显示全部楼层 |阅读模式
代码 如下
//******************************************************************************
//  MSP430F54x Demo - Reset on Invalid Address fetch, Toggle P1.0
//
//  Description: This program demonstrates how a reset is executed if the CPU
//  tries to fetch instructions from within the module register memory address
//  range (0x0100 --0x0FEF) or from within unused address ranges. Toggle P1.0
//  by xor'ing P1.0 inside of a software loop that ends with TAR loaded with
//  3FFFh - op-code for "jmp $". This simulates a code error. The MSP430F5438
//  will force a reset because it will not allow a fetch from within the address
//  range of the peripheral memory, as is seen by return to the mainloop and
//  LED flash.
//  ACLK = n/a, MCLK = SMCLK = default DCO ~1.045MHz
//
//                MSP430F5438
//             -----------------
//         /|\|                 |
//          | |                 |
//          --|RST              |
//            |                 |
//            |             P1.0|-->LED
//
//   W. Goh
//   Texas Instruments Inc.
//   November 2008
//   Built with CCE Version: 3.2.2 and IAR Embedded Workbench Version: 4.11B
//******************************************************************************
#include "msp430x54x.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer - SET BREAKPOINT HERE
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  TA0R = 0x3FFF;                            // Valid opcode (for "jmp $")

  while(1)
  {
    P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR

    __delay_cycles(50000);                  // Delay loop

    // C code to directly call an address location
    ((void (*)())0x350)();                  // Invalid fetch ("call #0350h")

    /* 0x350 is address of TA0R register and is within the module register memory
    address range (0x0100 --0x0FEF) */
  }
}


这段代码 有点 不懂啊、、、
谁能帮帮我理解  理解呢。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-10-15 17:00:24 | 显示全部楼层
这个有什么问题么?
只是TA1CCR0没有自动装载而已。
另外MSP430的TIMER用法很灵活,看下手册上面操作方法和图就会很清楚。

出0入0汤圆

发表于 2011-11-2 21:17:24 | 显示全部楼层
msp430采用的是统一编址方式,也就把ROM、RAM、外围模块、特殊功能寄存器等等安排到统一地址空间,这样就可以使用一组地址、数据总线、相同的指令对它们进行字或字节的形式访问(这点有别于传统的处理器如8086、51等),该例子所要说明的就是程序的非法跳转问题。((void (*)())0x350)()汇编之后就是JMP 0x350;按照常理,程序此时应该跳转到0x350这个存储空间去执行,但是对于msp430来说这个空间是特殊功能寄存器区,并不是程序存储区,所以这个访问是非法的,结果就是造成单片机复位,程序重新执行,但是看上去程序就像主循环体内执行一样。
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗定时器
  P1DIR |= 0x01;                            // 设置P1.0为输出
  TA0R = 0x3FFF;                            // 有效执行代码(相当于 "jmp $")(虽然存入了这个代码,但并不会被实际执行)

  while(1)
  {
    P1OUT ^= 0x01;                          // 通过异或运算对P1.0取反

    __delay_cycles(50000);                  // 延时循环

    // 通过C代码调用该地址
    ((void (*)())0x350)();                  // 无效访问("调用 #0350h")会造成单片机复位,并不会读取里面的内容

    /* 0x350 是TA0R 寄存器的地址并且在外围模块存储区
    地址范围为(0x0100 --0x0FEF) */
  }
}

出0入0汤圆

发表于 2011-11-2 22:16:11 | 显示全部楼层
回复【2楼】void_main  乾乾
-----------------------------------------------------------------------

就是这个意思 难道LZ不看上面那段说明性的文字么?

出0入0汤圆

发表于 2011-11-4 11:03:22 | 显示全部楼层
我现在都不会用看门狗。。。。唉,真悲催。。。。

出0入0汤圆

发表于 2011-11-5 10:42:02 | 显示全部楼层
楼主要先看看芯片手册中的各个模块~~

出0入0汤圆

发表于 2011-11-7 09:45:14 | 显示全部楼层
顶2楼的解释

出0入0汤圆

 楼主| 发表于 2011-11-16 09:04:00 | 显示全部楼层
回复【2楼】void_main 乾乾
-----------------------------------------------------------------------

非常 感谢!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 10:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表