查看: 4707|回复: 8

[已解决] 官方串口boot 程序这两句怎么理解?(已解决)

[复制链接]

该用户从未签到

16

主题

53

帖子

0

新手上路

Rank: 1

积分
130
最后登录
1970-1-1
发表于 2013-4-7 14:06:44 | 显示全部楼层 |阅读模式
void FLASH_Initialization(void)
{
  LWord i;
  
  //  initialize pointer to ram function 
  //FLASH_FlashCommandSequence = (LWord(*)(Byte))&buffer[1];  
  //  copy function from ROM to RAM
 <strong> for(i=0;iLWord FLASH_EraseSector(LWord destination)
{  
  CommandObj.regsLong.fccob3210 = destination;
  CommandObj.regs.fccob0 = FLASH_ERASE_SECTOR;
  
  return FLASH_FlashCommandSequence(ERASE_BLOCK_INDEX);
}

加粗的这几句怎么理解,看不懂阿
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-4-7 17:14:20 | 显示全部楼层

RE:官方串口boot 程序这两句怎么理解?

是否你查看的是Kinetis产品对应的Flash驱动?
能否告知你所用MCU芯片型号?
Kinetis的 FTFL_FlashCommandSequence是执行Flash命令的函数。
具体函数在文件中。
以下是函数定义:
/********************************************************
* Function for executing of the flash command
*
********************************************************/
static Byte FTFL_FlashCommandSequence(Byte index)
{
  Byte* ptrFccobReg = (Byte*)&FTFL_BASE_PTR->FCCOB3;
  Byte* ptrCommandObj = (Byte*)&CommandObj;
  /* wait till CCIF bit is set */
  while((FTFL_FSTAT&FTFL_FSTAT_CCIF_MASK) != FTFL_FSTAT_CCIF_MASK){};
  /* clear RDCOLERR & ACCERR & FPVIOL flag in flash status register */
  FTFL_FSTAT = FTFL_FSTAT_ACCERR_MASK|FTFL_FSTAT_FPVIOL_MASK|FTFL_FSTAT_RDCOLERR_MASK;  
  
  /* load FCCOB registers */  
  while(index--)
    *ptrFccobReg++ = *ptrCommandObj++;
  
  //  launch a command
  FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK;
   
  //  waiting for the finishing of the command
  while((FTFL_FSTAT&FTFL_FSTAT_CCIF_MASK) != FTFL_FSTAT_CCIF_MASK){};
  
  /* Check error bits */
  /* Get flash status register value */
  if(FTFL_FSTAT & (FTFL_FSTAT_ACCERR_MASK|FTFL_FSTAT_FPVIOL_MASK|FTFL_FSTAT_MGSTAT0_MASK))
    return 0;
  else return 1;
}
调用方法:
/********************************************************
* Function for Programming of one Long Word
*
********************************************************/
Byte FTFL_ProgramLongWord(LWord destination, LWord data32b)
{
  /* preparing passing parameter to program the flash block */
  //设定Flash命令运行需要的参数
  CommandObj.regsLong.fccob3210 = destination;
  CommandObj.regs.fccob0 = FTFL_PROGRAM_LONGWORD;
  CommandObj.regsLong.fccob7654 = data32b;
  return FTFL_FlashCommandSequence(PROGRAM_LONGWORD_INDEX);
}
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

53

帖子

0

新手上路

Rank: 1

积分
130
最后登录
1970-1-1
 楼主| 发表于 2013-4-7 22:56:23 | 显示全部楼层

回复:官方串口boot 程序这两句怎么理解?

是Kinetis产品对应的Flash驱动。
我是在官方网站上下载的an2295软件包,程序里面没有您的这个函数定义。
上面几个问题实在有点看不懂。 未命名.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

178

帖子

0

高级会员

Rank: 4

积分
825
最后登录
1970-1-1
发表于 2013-4-8 10:35:45 | 显示全部楼层

RE:官方串口boot 程序这两句怎么理解?(正解)

你的问题其实和thumb指令有关,在thrumb指令中,调用函数一般是用BX或BLx指令,这些指令后面的参数就是所谓的函数地址,但在thumb指令中这个地址称为interworking address,它的bit 0必须为1,否则内核会产生异常中断,比方说一个函数起始地址在0x00004700,但编译器在编译时会把它改为0x00004701,再传递给BLX/BX指令。在你上述的代码中,FLASH_FlashCommandSequenceStart是一个函数地址,编译器已经把它改为起始地址+1的数值,因此把这个函数的内容复制到RAM里面的时候,要从FLASH_FlashCommandSequenceStart【-1】开始copy。而FLASH_FlashCommandSequence是要传递给BLX/BX的interworking address,所以它的值要在SRAM buffer的起始地址的基础上+1字节。这里要注意buffer的word对齐问题,才能保证把flash内的函数正确放在SRAM里面运行,
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

53

帖子

0

新手上路

Rank: 1

积分
130
最后登录
1970-1-1
 楼主| 发表于 2013-4-9 14:03:51 | 显示全部楼层

回复:官方串口boot 程序这两句怎么理解?

回答的够专业,虽然还是没理解到位。顺便再问下,下面三种情况是代表什么样的flash操作,区别在哪?m4和m0+用的不一样。
// Kinetis K Flash Access
#define FLASH_WRITE_ACCESS_LONG 32
#define FLASH_WRITE_ACCESS_PHRASES 64
#define FLASH_WRITE_ACCESS_DOUBLE_PHRASES 128
 
 

  #if FLASH_WRITE_ACCESS == FLASH_WRITE_ACCESS_LONG
    #define WRITE_FLASH_FUNC FLASH_ProgramSection
  #elif FLASH_WRITE_ACCESS == FLASH_WRITE_ACCESS_PHRASES
    #define WRITE_FLASH_FUNC FLASH_ProgramSectionPhrases
  #elif FLASH_WRITE_ACCESS == FLASH_WRITE_ACCESS_DOUBLE_PHRASES
    #define WRITE_FLASH_FUNC FLASH_ProgramSectionDoublePhrases
  #else
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

47

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
115
最后登录
1970-1-1
发表于 2013-4-10 14:08:26 | 显示全部楼层

RE:官方串口boot 程序这两句怎么理解?

最初的那些代码很好理解,一个是扇区擦除的函数代码。
  for(i=0;i
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

53

帖子

0

新手上路

Rank: 1

积分
130
最后登录
1970-1-1
 楼主| 发表于 2013-4-11 15:42:09 | 显示全部楼层

回复:官方串口boot 程序这两句怎么理解?

当用到FTFL_PROGRAM_SECTION写命令时,fccob4和fccob5是根据什么规律赋值?手册上找不到对应描述。例如:
FLASH_test_ProgramSectionPhrases中的
 
CommandObj.regsLong.fccob3210 = destination;
    CommandObj.regs.fccob0 = FTFL_PROGRAM_SECTION;
    CommandObj.regs.fccob4 = (unsigned char)(size >> 10); 
    CommandObj.regs.fccob5 = (unsigned char)((size >> 2) & 0xff);
 
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

30

帖子

0

注册会员

Rank: 2

积分
94
最后登录
1970-1-1
发表于 2013-4-23 17:46:44 | 显示全部楼层

回复:官方串口boot 程序这两句怎么理解?

在芯片的Flash Memory Module章节,可以看到对FCCOB寄存器的具体介绍。如附图所示。
fccob.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

30

帖子

0

注册会员

Rank: 2

积分
94
最后登录
1970-1-1
发表于 2013-4-23 17:56:25 | 显示全部楼层

回复:官方串口boot 程序这两句怎么理解?

fccob.jpg
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 08:54 , Processed in 0.108510 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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