当前位置: 移动技术网 > 科技>办公>CPU > 小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法

小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法

2020年11月12日  | 移动技术网科技  | 我要评论
小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法 1 前言2 KEIL的FLASH算法2 IAR的FLASH算法END1 前言FLASH算法是什么东西?可能一开始接触MCU编程的人来说有点懵,简单的来说FLASH算法是一个工具,它的作用就是为了将代码烧进FLASH的工具。以KEIL将代码下载进FLASH中来举例,当我们写好代码后编程出可执行文件,这个时候我们只需要点击下载按钮,程序就会很快地被下载进FLASH中。其实当我们点击下载按钮后,KEIL干的第一件事是将FLASH算法下载进RAM中,然

小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法

1 前言

FLASH算法是什么东西?可能一开始接触MCU编程的人来说有点懵,简单的来说FLASH算法是一个工具,它的作用就是为了将代码烧进FLASH的工具。以KEIL将代码下载进FLASH中来举例,当我们写好代码后编程出可执行文件,这个时候我们只需要点击下载按钮,程序就会很快地被下载进FLASH中。其实当我们点击下载按钮后,KEIL干的第一件事是将FLASH算法下载进RAM中,然后仿真器会调用已经在RAM中的FLASH算法函数,对FLASH进行擦写,最后完成代码的下载。接下来,看看这个FLASH算法究竟为何物。

2 KEIL的FLASH算法

KEIL可以在下面的界面选择合适的FLASH算法。

在这里插入图片描述对于SIP(system in a package)类型的芯片来说 ,都是内嵌的FLASH,所有厂家都会提供相应的FLASH算法,我们只管用就好了,但是对于有些外置FLASH的芯片来说,这时候就需要针对自己使用的FLASH特性自制FLASH算法了。

我们打开KEIL的安装目录下,打开文件夹C:\Keil_v5\ARM\Flash可以看到里面有各种文件夹和FLM文件,FLM/FLX文件就是KEIL独有的FLASH算法文件,文件夹都是各个产家的FLASH算法源码,我们可以在这基础上进行更改出自己的FLASH算法,KEIL还给我方便提供了原始模板_Template,也可以在这个模板上修改。

先打开这个模板工程,看看我们需要在里面完善一些什么?Oh My God!!!里面啥都没有?what?原来FLASH算法如此的简单,我们只需要完善5个功能性的函数,完善描述FLASH特性的结构体,就OK了。

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "New Device 256kB Flash",   // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)
   0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 
   0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)
   SECTOR_END
};

int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

int UnInit (unsigned long fnc) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

int EraseChip (void) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

int EraseSector (unsigned long adr) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

在FlashDevice 结构体中,有一个DevType参数,这个参数可以是以下几种情况:

#define UNKNOWN    0           // Unknown
#define ONCHIP     1           // On-chip Flash Memory
#define EXT8BIT    2           // External Flash Device on 8-bit  Bus
#define EXT16BIT   3           // External Flash Device on 16-bit Bus
#define EXT32BIT   4           // External Flash Device on 32-bit Bus
#define EXTSPI     5           // External Flash Device on SPI

大家可以根据实际情况去选择。可以结合厂家的实例代码去实现自己的FLASH算设计。

注意:①FLM和FLX文件都是FLASH算法文件,区别就是cortex-M核用是FLM,ARM7/ARM9用的是FLX。

②项目在user command界面调用了:
cmd.exe /C copy "Objects\%L" ".\@L.FLM"命令将输出文件复制到了本工程文件夹的母文件夹里,大家需要根据自己的需求修改命令,总之需要将生成的文件放在KEIL的FLASH文件夹下,这样在添加FLASH算法界面里才能找到。)

2 IAR的FLASH算法

IAR可以在下面的界面选择合适的FLASH算法。
在这里插入图片描述让我们打开这个文件看看有啥(在IAR的安装目录里:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\config\flashloader\NXP),打开文件如下:

<?xml version="1.0" encoding="iso-8859-1"?>

<flash_board>
  <pass>
    <loader>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1050_EVK_FlexSPI.flash</loader>
    <range>CODE 0x60000000 0x7f7fffff</range>
  </pass>
</flash_board>

可以看到这个文件最后包含了一个.flash文件,找到这个文件打开发现它又包含了一个.out文件和.mac文件,俄罗斯套娃。mac文件中是对芯片的一些初始化操作,out文件才是FLASH算法编译出的可执行文件。

打开IAR的安装目录,找到路径:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\config\flashloader,IAR中自带的FLASH算法全部都在这个文件夹中了,它是按照芯片产商来划分的,但是这个文件夹中并没有源码,FLASH源码的算法在:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\src\flashloader中,我们打开一个工程看一下对于IAR的FLASH算法中需要做什么。

以ST公司的STM32为例:

#if USE_ARGC_ARGV
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,
                   uint32_t link_address, uint32_t flags,
                   int argc, char const *argv[])
#else
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,
                   uint32_t link_address, uint32_t flags)
#endif
{
  return RESULT_OK;
}

uint32_t FlashWrite(void *block_start,
                    uint32_t offset_into_block,
                    uint32_t count,
                    char const *buffer)
{
  return RESULT_OK;
}

uint32_t FlashErase(void *block_start,
                    uint32_t block_size)
{

  return RESULT_OK;
}

uint32_t FlashSignoff(void)
{
  //Restore modified registers
  return RESULT_OK;
}

可以看到对于IAR的FLASH算法来说,它只需要拥有4个函数,大家可以根据实际情况去选择。可以结合厂家的实例代码去实现自己的FLASH算设计。

END

本文地址:https://blog.csdn.net/Oushuwen/article/details/109638219

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网