1

我的擦除功能遇到问题。我尝试擦除 Flash 的 15 个扇区,以便放置一个新的二进制文件。我不明白为什么,但我的功能冻结了,我无法擦除我需要的所有内存。

如果您想尝试一下,这是我的代码

/*
 * bootloader.c
 *
 *  Created on: 9 juin 2015
 *      Author: tgloaguen
 */
#include "usart.h"
#include "stm32l1xx_flash.h"
#define WRITE_START_ADDR 0x08000000
#define WRITE_END_ADDR 0x0800FFFF
#define FLASH_PAGE_SIZE    ((uint16_t)0x100) //If a page is 256 bits
#define MY_BL_FUNCTIONS __attribute__((section(".bootsection")))

void BootLoader(void) MY_BL_FUNCTIONS;
FLASH_Status Flash_Write ( uint32_t StartAddress, uint8_t *p, uint32_t Size ) MY_BL_FUNCTIONS;
uint8_t Flash_Erase() MY_BL_FUNCTIONS;
void Receive_Data(char * buffer,int size)MY_BL_FUNCTIONS;
void Receive_Size(char * buffer, int *sizeData)MY_BL_FUNCTIONS;

void BootLoader(void) {

    //clear all ITs
    USART_ITConfig( USART1, USART_IT_RXNE, DISABLE );
    //SendString("HELLO",USART2);
    uint8_t status,i;
    char buffer[33];
    //en dur
    uint16_t *adr = WRITE_START_ADDR;
    uint16_t sizeBin = 51400,k = 0,k_hexa = 0x20;
    SendString("BOOTLOADER",USART2);


    Flash_Erase();
    SendString("ERASEOK",USART2);
    //if sizeBin ok
}

和擦除功能

uint8_t Flash_Erase() {

    uint32_t EraseCounter = 0x00, Address = 0x00;//Erase count, write address
    uint32_t NbrOfPage = 0x00;//Recording to erase the pages
    volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH complete erasure marks*/
      /*Unlock FLASH*/

    FLASH_Unlock();
      /*Calculate the number of FLASH pages need to erase */
    NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;
      /* Remove all hang flags */
    FLASH_ClearFlag ( FLASH_FLAG_EOP     |
                            FLASH_FLAG_WRPERR  |
                            FLASH_FLAG_PGAERR  |
                            FLASH_FLAG_SIZERR  |
                            FLASH_FLAG_OPTVERR );
      /* Erase the FLASH page*/
    for(EraseCounter = 0; (EraseCounter <NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
      {
        SendString("ok |",USART2);
        FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));

      }
      FLASH_Lock ( );

    return (uint8_t)FLASHStatus;
}
4

1 回答 1

0

在您的代码中,您试图擦除整个闪存,但您正在从最终扇区的闪存执行引导加载程序。

正如 REF 人所报告的那样

在对 NVM 的写/擦除操作期间(半页编程或双字擦除/写除外),任何读取同一组 NVM 的尝试都会使总线停止。

WRITE_END_ADDR然后您必须根据您的内存映射保留引导加载程序更改定义的空间。

示例:如果您的引导加载程序长 4K 并且属于最后一个扇区(0x0801 F000 - 0x0801 FFFF),则WRITE_END_ADDR必须是0x0801 EFFF.

编辑 正如@Olaf 所写,请注意属于地址 0 闪存中前 8 个字节的 ISP(初始堆栈指针)和 IPC(初始程序计数器)。

于 2015-06-17T12:39:40.323 回答