STM32F103制作FlashDriver的实现过程.docVIP

  • 9
  • 0
  • 约8.82千字
  • 约 10页
  • 2023-09-27 发布于湖南
  • 举报
STM32F103制作FlashDriver的实现过程 前言 在汽车行业控制器软件刷新流程中,一般会将Flash驱动单独进行刷写,目的是防止程序中一直存在Flash驱动的话,可能会造成对APP软件的异常操作,导致应用程序无法执行。 本文介绍STM32F103使用KEIL生成指定FlashDriver地址的hex文件,然后使用HexView命令行提取FlashDriver及Remapping flash地址到ram地址 本文参考github,SummerFalls大神的UDS_S32K144_FlashDriver 芯片内存定义 STM32F103RCT6,flash大小256k,一个扇区2k,SRAM:48KB; 实现过程 FlashDriver生成 段定义 由于我无法直接在Keil中导出指定ram地址的hex文件,所以采用先定义指定flash地址的flash驱动,后面通过hexview实现地址重映射 keil中的内存区域定义通过分散加载文件(.sct格式)实现,如下所示 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 00 { ; load region size_region\\ ER_IROM1 00 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 00x0000C000 { ; RW data .ANY (+RW +ZI) } } LR_IROM2 00 { RW_IROM_flashdrvoffset 00; load address = execution address *(.NVM_Driver_Section_offset) } RW_IROM_flashdrv 00x000007F8{; load address = execution address *(.NVM_Driver_Section) } } 此处设置了两个段,NVM_Driver_Section_offset用来设置函数偏移地址,NVM_Driver_Section用来设置函数地址 增加段的宏定义 #define NVM_DRIVER_SECTION __attribute__((section (.NVM_Driver_Section))) #define NVM_DRIVER_SECTION_OFFSET __attribute__((section (.NVM_Driver_Section_offset))) 函数地址偏移量定义 __attribute__((used)) NVM_DRIVER_SECTION_OFFSET static const tFlashDriverAPIInfo gs_FlashDriverAPI = { (tpfFLASH_DRV_EraseSector) CAL_OFFSET(FLASH_ErasePage), (tpfFLASH_DRV_Program) CAL_OFFSET(FLASH_ProgramWord), }; 分两个段,保证地址偏移量在生成的hex文件的前面 此处使用库函数中的FLASH_ErasePage和FLASH_ProgramWord函数。由于提取的函数最终是以数组的形式存在,以函数指针的方式进行调用,所以函数中不能存在全局变量或调用其他的函数。 需要将原库函数中的函数的调用函数使用宏定义的方式进行定义,使用do while语法实现。 擦除函数 __attribute__((used)) NVM_DRIVER_SECTION FLASH_Status FLASH_ErasePage(uint32_t Page_Address) { FLASH_Status status = FLASH_COMPLETE

文档评论(0)

1亿VIP精品文档

相关文档