FlashBrushHAL.c 5.7 KB
#include "FlashBrushHAL.h"

static uint32_t sectStartAddrF405[13] =
    {
        0x08000000, // 0
        0x08004000, // 1
        0x08008000, // 2
        0x0800c000, // 3
        0x08010000, // 4
        0x08020000, // 5
        0x08040000, // 6
        0x08060000, // 7
        0x08080000, // 8
        0x080a0000, // 9
        0x080c0000, // 10
        0x080e0000, // 11
        0x08100000};

uint8_t FlashBrush_ReadBtye(uint32_t addr)
{
    uint32_t data = *(vu32 *)(addr);
    return data;
}

uint16_t FlashBrush_ReadHalfWord(uint32_t addr)
{
    uint32_t data = *(vu32 *)(addr);
    return data;
}

uint32_t FlashBrush_ReadWord(uint32_t addr)
{
    uint32_t data = *(vu32 *)(addr);
    return data;
}

// 获取Sector的编号
static int GetSectorFromAddress(uint32_t address)
{
    int sect, i;
    if (address < 0x08000000 || address > 0x080FFFFF)
        return -1;

    for (i = 0; i < 12; i++)
    {
        if (address >= sectStartAddrF405[i] && address < sectStartAddrF405[i + 1])
        {
            sect = i;
            break;
        }
    }
    return sect;
}

// flash页擦除
uint32_t FlashBrush_EraseSingleSector(uint32_t startAddress)
{
    uint32_t startSector;
    uint32_t PageError;
    FLASH_EraseInitTypeDef pEraseInit; // 闪存擦除结构体
    uint32_t ret;

    /* Unlock the Flash to enable the flash control register access *************/
    HAL_FLASH_Unlock(); // 解锁flash

    /* Clear pending flags (if any) */
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

    /* Get the sector where start the user flash area */
    startSector = GetSectorFromAddress(startAddress);

    pEraseInit.Sector = startSector;
    pEraseInit.NbSectors = 1;
    pEraseInit.Banks = FLASH_BANK_1;

    if (HAL_FLASHEx_Erase(&pEraseInit, &PageError) != HAL_OK)
    { // 执行擦除
        /* Error occurred while page erase */
        ret = FLASHBRUSH_STA_ERASE_ERR;
        goto out;
    }
    ret = FLASHBRUSH_STA_OK;
out:
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
    HAL_FLASH_Lock();

    return ret;
}

uint32_t FlashBrush_Program_Direct(uint32_t typeprogram, uint32_t startADDR, void *data, uint32_t data_len)
{

    if (startADDR < FLASHBRUSH_BASE_ADDR || startADDR > FLASHBRUSH_BASE_ADDR_END)
        return -1;

    volatile HAL_StatusTypeDef FLASHStatus;
    uint8_t k = 0;
    uint32_t Address;
    uint32_t TypeProgram = FLASHBRUSH_TYPEPROGRAM_WORD;
    uint32_t programPreGrow = 0;

    if (typeprogram = FLASHBRUSH_TYPEPROGRAM_BYTE)
    {
        TypeProgram = FLASH_TYPEPROGRAM_BYTE;
        programPreGrow = sizeof(uint8_t);
    }
    if (typeprogram = FLASHBRUSH_TYPEPROGRAM_HALFWORD)
    {
        TypeProgram = FLASH_TYPEPROGRAM_HALFWORD;
        programPreGrow = sizeof(uint16_t);
    }
    if (typeprogram = FLASHBRUSH_TYPEPROGRAM_WORD)
    {
        TypeProgram = FLASH_TYPEPROGRAM_WORD;
        programPreGrow = sizeof(uint32_t);
    }
    else
    {
        return FLASHBRUSH_STA_INPUTERR;
    }

    FlashBrush_EraseSingleSector(startADDR);
    Address = startADDR;

    HAL_FLASH_Unlock(); // 解锁
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

    for (k = 0; k < data_len; k++)
    {
        switch (TypeProgram)
        {
        case FLASH_TYPEPROGRAM_BYTE:
            HAL_FLASH_Program(TypeProgram, Address, ((uint8_t *)data)[k]);
            break;
        case FLASH_TYPEPROGRAM_HALFWORD:
            HAL_FLASH_Program(TypeProgram, Address, ((uint16_t *)data)[k]);
            break;
        case FLASH_TYPEPROGRAM_WORD:
            HAL_FLASH_Program(TypeProgram, Address, ((uint16_t *)data)[k]);
            break;

        default:
            break;
        }
        Address = Address + programPreGrow; // 地址偏移4个字节
    }

    HAL_FLASH_Lock(); // 重新上锁,防止误写入
    return FLASHBRUSH_STA_ERASE_ERR;
}

// uint8_t EEPROM_FLASH_Program_Direct( uint32_t startADDR , int32_t* data , uint32_t data_len ){

//     if( startADDR < 0x08000000 || startADDR > 0x080FFFFF )
//         return -1;

//     volatile HAL_StatusTypeDef FLASHStatus;

//     uint8_t k=0;
//     uint32_t Address;
// 	FlashBrush_EraseSingleSector(startADDR);
//     Address = startADDR;
//     HAL_FLASH_Unlock();//解锁
//     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

// 	for(k=0;k<data_len;k++)
// 	{
// 	   HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address, data[k]);//写入一个字(32位)的数据入指定地址
// 		Address = Address + 4;//地址偏移4个字节
// //		printf("________________write  %d   word  ok\r\n",k);
// 	}
// 	HAL_FLASH_Lock();//重新上锁,防止误写入
// 	return  1;

// }

// uint8_t EEPROM_FLASH_Program( uint32_t startADDR , int32_t* data , uint32_t data_len ){

//     if( startADDR < 0x08000000 || startADDR > 0x080FFFFF )
//         return -1;

//     volatile HAL_StatusTypeDef FLASHStatus;

//     uint8_t k=0;
//     uint32_t Address;
// 	FlashBrush_EraseSingleSector(startADDR);
//     Address = startADDR;
//     HAL_FLASH_Unlock();//解锁
//     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

// 	for(k=0;k<data_len;k++)
// 	{
// 	   HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address, data[k]);//写入一个字(32位)的数据入指定地址
// 		Address = Address + 4;//地址偏移4个字节
// //		printf("________________write  %d   word  ok\r\n",k);
// 	}
// 	HAL_FLASH_Lock();//重新上锁,防止误写入
// 	return  1;

// }