STM32 Flash读写

知道了Flash读写的特性就知道如何编程了:

1.flash读,可以读到任意一个字节的值

2.flash写,最少写入半字,即2个字节,最多写入DOUBLEWORD即8个字节。

3.flash擦除,只能擦除整页,或者整个mass(block/sector)

FLASH ADDRESS = 0x0800 0000

uint16_t  FLUSH_BUFF[512];      1 page = 1024 Byte

STMFLASH_Read(FLASH_ADDRESS, FLASH_BUFF,1 page = 1024);

FLUSH_BUFF[0]=0x0102,FLUSH_BUFF[1]=0x0304;
FLUSH_BUFF = 0x200000460
0x200000460: 0x01
0x200000461: 0x02
0x200000462: 0x03
0x200000463: 0x04
u32 STMFLASH_Read(u32 readAddr, void* buffer, u32 size)
{
  u8* pbuf8= (u8*)buffer;(buffer = FLUSH_BUFF)
//buffer 传过来的本来是uint16_t的数组,强制转换为uint8_t之后 *(pbuf8+1)是0x01还是0x03????? STM32 是小端


pbuf8 += 2;
  *(u16*)pbuf8 = *(u16*)readAddr;
}
 
u32 STMFLASH_Read(u32 readAddr, void* buffer, u32 size)
{
    u32 i = 0;

    u32 nRead = size;
    u8* pbuf8= (u8*)buffer;
    if(!buffer||readAddr < STMFLASH_APPLICATION_ADDR || (readAddr + size > STMFLASH_END_ADDR)) {
        printf("out range................................................... 
");
//        LOG_INFO("ERROR: reading from illegal internal flash address: 0x%lx 
", ReadAddr);
        return 0;
    }


    while((nRead >= 2) && readAddr <= (STMFLASH_END_ADDR-2)) {
//        pbuf8[i] = STMFLASH_ReadByte(ReadAddr);
//        ReadAddr++;
        *(u16*)pbuf8 = *(u16*)readAddr;

        printf("addr:%x~~~~%x 
",readAddr,*(u16*)readAddr);
        readAddr += 2;
        pbuf8 += 2;
        nRead -= 2;
    }


    return size;
}

参考文章:

1.STM32F1系列HAL库读写内部FLASHhttps://blog.csdn.net/qq153471503/article/details/105989078

原文地址:https://www.cnblogs.com/hitzzq/p/15495129.html