gpt4 book ai didi

c - 在 STM32L1 上删除我的闪存

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:33 24 4
gpt4 key购买 nike

我的删除功能遇到问题。我尝试删除闪存的 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;
}

最佳答案

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

据 REF 人报道

During a write/erase operation to the NVM (except Half Page programming or Double-word erase/write), any attempt to read the same bank of NVM stalls the bus.

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

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

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

关于c - 在 STM32L1 上删除我的闪存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30889703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com