欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-06-17 19:03:04
小猫爪:嵌入式小知识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算法。

小猫爪:嵌入式小知识09-KEIL/IAR 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算法。
小猫爪:嵌入式小知识09-KEIL/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