【发布时间】:2015-06-17 11:03:40
【问题描述】:
我的擦除功能遇到问题。 我尝试擦除 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;
}
【问题讨论】:
-
您的引导加载程序可以重定位吗?您是在 RAM 中运行,还是您的引导加载程序在 Flash_Erase 函数未取消的闪存页面上?
-
我的bootloader是FLASH的结尾,一般不会被函数擦除
-
如果 Flash_Erase() 函数是从 flash 中执行的,那么我不希望它工作。想象一下,当它在写入闪存擦除命令时,它也在从闪存读取指令。指令读取会干扰擦除命令序列。我相信您需要将 Flash_Erase() 复制到 RAM 并从那里执行它。 (Flash_Program() 也是如此。)
-
@kkrambo 通常在 cortex M 内核(或没有 MMU 的 MCU)中擦除/编程从闪存执行的程序闪存。您必须小心/避免擦除代码正在执行的扇区/页面。
-
我刚刚阅读了有关 STM32F4xx 的信息,因此不确定这是否也适用于 'L1xx(但很可能):在编程时,访问 Flash 会停止。这可能是中断的问题。如果您明确添加 what 出错了,这将很有帮助。您是否阅读了您设备的“闪存编程手册”?如果它在调试器控制下运行,可能会有额外的怪癖(不确定 STM,但我有其他 MCU 出现此类问题)。
标签: c embedded flash-memory