3240|9

307

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

不明白这个程序是怎么运行的? [复制链接]


#include <msp430x16x.h>

// Global variables
char value = 0;                             // 8-bit value to write to segment A
char* Flash_ptr;                            // Flash pointer
char* RAM_ptr;                              // RAM pointer
char* END_ptr;                              // End of FlashWrite routine

// Function prototypes
void FlashWrite();
void CopyRoutine();
void End_of_FlashWrite();

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  _DINT();                                  // Diable Interrupts
  CopyRoutine();                            // Copy FlashWrite routine to RAM
  _EINT();                                  // Enable Interrupts

  while(1)                                  // Repeat forever
  {
    Flash_ptr = (char *) 0x1000;            // Initialize Flash pointer
    FCTL2 = FWKEY + FSSEL1 + FN0;           // MCLK/2 for Flash Timing Generator
    FCTL1 = FWKEY + ERASE;                  // Set Erase bit
    FCTL3 = FWKEY;                          // Clear Lock bit

    *Flash_ptr = 0;                         // Dummy write to erase Flash segment
    while(!(FCTL3 & WAIT));                 // WAIT until Flash is ready
    asm("CALL #300h");                      // Execute FlashWrite from RAM
                                            // Inline Assembly
    value++;                                // Increment value
    _NOP();                                 // SET BREAKPOINT HERE
  }
}

void CopyRoutine()
{
  Flash_ptr = (char*)FlashWrite;            // Set pointer to FlashWrite routine
  RAM_ptr = (char*)0x0300;                  // Set pointer to RAM
  END_ptr = (char*)End_of_FlashWrite;       // Set pointer to End_of_FlashWrite

  while(END_ptr != Flash_ptr)               // Check for end of FlashWrite
  {
    *RAM_ptr = *Flash_ptr;                  // Copy word to RAM
    Flash_ptr++;                            // Increment Flash pointer
    RAM_ptr++;                              // Increment RAM pointer
  }
}

void FlashWrite()
{
  volatile int i;                           // Use as write counter
  Flash_ptr = (char*)0x1000;                // Initialize Flash pointer
  while(FCTL3 & BUSY);                      // Check Flash BUSY bit
  FCTL1 = FWKEY + BLKWRT + WRT;             // Enable block-write operation
  for(i = 0; i < 64; i++)
  {
    *Flash_ptr = value;                     // Write value to flash
    Flash_ptr++;                            // Double-increment Flash pointer
    while(!(FCTL3 & WAIT));                 // WAIT until Flash is ready
  }
  FCTL1 = FWKEY;                            // Clear BLKWRT & WRT bits
  while(FCTL3 & BUSY);                      // Check Flash BUSY bit
  FCTL3 = FWKEY + LOCK;                     // Reset LOCK bit
  return;                                   // Exits routine
}

void End_of_FlashWrite(){}                  // Marks end of FlashWrite

最新回复

while(END_ptr != Flash_ptr)               // Check for end of FlashWrite   {     *RAM_ptr = *Flash_ptr;                  // Copy word to RAM     Flash_ptr++;                            // Increment Flash pointer     RAM_ptr++;                              // Increment RAM pointer   } } 循环拷贝,一直到end, 主函数里的 asm("CALL #300h");                      // Execute FlashWrite from RAM 跳转到0X300  详情 回复 发表于 2011-12-27 11:41
 
点赞 关注

回复
举报

307

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
void CopyRoutine()
这个函数里面的
Flash_ptr = (char*)FlashWrite;            // Set pointer to FlashWrite routine
  RAM_ptr = (char*)0x0300;                  // Set pointer to RAM
  END_ptr = (char*)End_of_FlashWrite;       // Set pointer to End_of_FlashWrite

这三句话怎么解释啊
 
 

回复

307

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
然后程序进去直接执行了CopyRoutine();    将数据//Copy FlashWrite routine to RAM。但是什么时候把ram中的数据拷回到了flash当中去的啊
 
 
 

回复

307

帖子

1

TA的资源

一粒金砂(高级)

4
 
asm("CALL #300h");                      // Execute FlashWrite from RAM
还有这句话怎么解释的,求教啊



上面的程序是ti的例子。关于flash的读写操作的
 
 
 

回复

188

帖子

0

TA的资源

纯净的硅(初级)

5
 
把Flash_ptr指针指向FlashWrite,就是给指针赋值,指向FlashWrite的空间,应该是做为Flash擦除的地址。下面两个同理。Flash操作看这个文章不错https://bbs.eeworld.com.cn/thread-314284-1-1.html
 
 
 

回复

188

帖子

0

TA的资源

纯净的硅(初级)

6
 

回复 4楼 flywith 的帖子

这是程序跳转,跳到0x300这个地址接着开始执行以后的程序
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(高级)

7
 
CopyRoutine()把程序拷到RAM中,然后跳转到0X300,
Flash_ptr = (char*)FlashWrite;
RAM_ptr = (char*)0x0300;
*RAM_ptr = *Flash_ptr;  
即跳转到flashwrite函数里了

赞赏

1

查看全部赞赏

 
 
 

回复

307

帖子

1

TA的资源

一粒金砂(高级)

8
 

回复 7楼 seasky208 的帖子

Flash_ptr = (char*)FlashWrite;      是不是这句话把程序拷到了ram里面,拷到ram里面,这个程序是怎么运行的啊

RAM_ptr = (char*)0x0300; 然后跳转到ram0x300地址区执行代码啊
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(高级)

9
 
while(END_ptr != Flash_ptr)               // Check for end of FlashWrite
  {
    *RAM_ptr = *Flash_ptr;                  // Copy word to RAM
    Flash_ptr++;                            // Increment Flash pointer
    RAM_ptr++;                              // Increment RAM pointer
  }
}
循环拷贝,一直到end,
主函数里的
asm("CALL #300h");                      // Execute FlashWrite from RAM
跳转到0X300
 
 
 

回复

307

帖子

1

TA的资源

一粒金砂(高级)

10
 

回复 9楼 seasky208 的帖子

谢谢了我大概看明白了,哈哈
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表