#include "stm32.h"
// Page-size-shift for page-by-page flash erase.
// Arrays are zero terminated; last non-zero value is automatically repeated
// fixed size pages
static const char p_128[] = "\7"; // means 1<<7 == 128 Byte
static const char p_256[] = "\10"; // means 1<<8 == 256 Byte
static const char p_1k[] = "\12"; // means 1<<10 (12 is octal!!) == 1 KiByte
static const char p_2k[] = "\13";
static const char p_128k[]= "\21"; // means 1<<17 == 128 KiByte
// F2 and F4 page sizes
static const char f2f4[] = "\16\16\16\16\20\21";
// F4 dual bank page sizes
static const char f4db[] = "\16\16\16\16\20\21\21\21"
"\16\16\16\16\20\21";
// F7 page sizes
static const char f7[] = "\17\17\17\17\21\22";
// Device table, corresponds to the "Bootloader device-dependant parameters" table in ST document AN2606.
// Note that the option bytes upper range is inclusive!
const stm32_dev_t devices[] = {
//ID PPSH FLAGS "name" SRAM range FLASH range PSize Option range System-mem range
/* F0 */
{0x440,2,0,"F030x8/F05xxx", 0x20000800,0x20002000, 0x08000000,0x08010000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFEC00,0x1FFFF800},
{0x444,2,0,"F03xx4/6", 0x20000800,0x20001000, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFEC00,0x1FFFF800},
{0x442,1,F_OBLL,"STM32F030xC/F09xxx", 0x20001800,0x20008000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
{0x445,2,0,"F04xxx/F070x6", 0x20001800,0x20001800, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFC400,0x1FFFF800},
{0x448,1,0,"F070xB/F071xx/F72xx", 0x20001800,0x20004000, 0x08000000,0x08020000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFC800,0x1FFFF800},
/* F1 */
{0x412,2,0,"F10xxx Low-density", 0x20000200,0x20002800, 0x08000000,0x08008000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x410,2,0,"F10xxx Medium-density", 0x20000200,0x20005000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x414,2,0,"F10xxx High-density", 0x20000200,0x20010000, 0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x420,2,0,"F10xxx Medium-density VL", 0x20000200,0x20002000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x428,1,0,"F10xxx High-density VL", 0x20000200,0x20008000, 0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x418,1,0,"F105xx/F107xx", 0x20001000,0x20010000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFB000,0x1FFFF800},
{0x430,1,0,"F10xxx XL-density", 0x20000800,0x20018000, 0x08000000,0x08100000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFE000,0x1FFFF800},
/* F2 */
{0x411,0,0,"STM32F2xxxx", 0x20002000,0x20020000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
/* F3 */
{0x432,1,0,"F373xx/F378xx", 0x20001400,0x20008000, 0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
{0x422,1,0,"F302xB(C)/F303xB(C)/F358xx",0x20001400,0x2000A000,0x08000000,0x08040000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
{0x439,1,0,"F301xx/F302x4(6/8)/F318xx",0x20001800,0x20004000, 0x08000000,0x08010000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
{0x438,1,0,"F303x4(6/8)/F334xx/F328xx",0x20001800,0x20003000, 0x08000000,0x08010000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
{0x446,1,0,"F302xD(E)/F303xD(E)/F398xx",0x20001800,0x20010000,0x08000000,0x08080000,p_2k, 0x1FFFF800,0x1FFFF80F, 0x1FFFD800,0x1FFFF800},
/* F4 */
{0x413,0,0,"F40xxx/41xxx", 0x20003000,0x20020000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x419,0,0,"F42xxx/43xxx", 0x20003000,0x20030000, 0x08000000,0x08200000,f4db, 0x1FFEC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x423,0,0,"F401xB(C)", 0x20003000,0x20010000, 0x08000000,0x08040000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x433,0,0,"F401xD(E)", 0x20003000,0x20018000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x458,0,0,"F410xx", 0x20003000,0x20008000, 0x08000000,0x08020000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x431,0,0,"F411xx", 0x20003000,0x20020000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x441,0,0,"F412xx", 0x20003000,0x20040000, 0x08000000,0x08100000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x421,0,0,"F446xx", 0x20003000,0x20020000, 0x08000000,0x08080000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x434,0,0,"F469xx/479xx", 0x20003000,0x20060000, 0x08000000,0x08200000,f4db, 0x1FFEC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
{0x463,0,0,"F413xx/423xx", 0x20003000,0x20050000, 0x08000000,0x08180000,f2f4, 0x1FFFC000,0x1FFFC00F, 0x1FFF0000,0x1FFF7800},
/* F7 */
{0x452,0,0,"F72xxx/73xxx", 0x20004000,0x20040000, 0x08000000,0x08080000,f2f4, 0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
{0x449,0,0,"F74xxx/75xxx", 0x20004000,0x20050000, 0x08000000,0x08100000,f7, 0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
{0x451,0,0,"F76xxx/77xxx", 0x20004000,0x20080000, 0x08000000,0x08200000,f7, 0x1FFF0000,0x1FFF001F, 0x1FF00000,0x1FF0EDC0},
/* H7 */
{0x450,0,0,"H74xxx/75xxx", 0x20004100,0x20020000, 0x08000000,0x08200000,p_128k, 0 ,0 , 0x1FF00000,0x1FF1E800},
/* L0 */
{0x457,5,0,"L01xxx/02xxx", 0x20000800,0x20000800, 0x08000000,0x08004000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
{0x425,5,0,"L031xx/041xx", 0x20001000,0x20002000, 0x08000000,0x08008000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
{0x417,5,F_NO_ME,"STM32L05xxx/06xxx", 0x20001000,0x20002000, 0x08000000,0x08010000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
{0x447,5,0,"L07xxx/08xxx", 0x20002000,0x20005000, 0x08000000,0x08030000,p_128,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF02000},
/* L1 */
{0x416,4,F_NO_ME,"L1xxx6(8/B)", 0x20000800,0x20004000, 0x08000000,0x08020000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
{0x429,4,F_NO_ME,"L1xxx6(8/B)A", 0x20001000,0x20008000, 0x08000000,0x08020000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF01000},
{0x427,4,F_NO_ME,"L1xxxC", 0x20001000,0x20008000, 0x08000000,0x08040000,p_256,0x1FF80000,0x1FF8001F, 0x1FF00000,0x1FF02000},
{0x436,4,0,"L1xxxD", 0x20001000,0x2000C000, 0x08000000,0x08060000,p_256,0x1FF80000,0x1FF8009F, 0x1FF00000,0x1FF02000},
{0x437,4,F_NO_ME,"L1xxxE", 0x20001000,0x20014000, 0x08000000,0x08080000,p_256,0x1FF80000,0x1FF8009F, 0x1FF00000,0x1FF02000},
/* L4 */
{0x435,0,0,"L43xxx/44xxx", 0x20003100,0x2000C000, 0x08000000,0x08040000,p_2k, 0x1FFF7800,0x1FFF780F, 0x1FFF0000,0x1FFF7000},
{0x462,0,F_PEMPTY,"L45xxx/46xxx", 0x20003100,0x20020000, 0x08000000,0x08080000,p_2k, 0x1FFF7800,0x1FFF780F, 0x1FFF0000,0x1FFF7000},
{0x415,0,0,"L47xxx/48xxx", 0x20003100,0x20018000, 0x08000000,0x08100000,p_2k, 0x1FFF7800,0x1FFFF80F, 0x1FFF0000,0x1FFF7000},
{0x461,0,0,"L496xx/4A6xx", 0x20003100,0x20040000, 0x08000000,0x08100000,p_2k, 0x1FFF7800,0x1FFFF80F, 0x1FFF0000,0x1FFF7000},
/* These are not (yet) in AN2606: */
{0x641,2,F_GEN,"Medium_Density PL", 0x20000200,0x20005000, 0x08000000,0x08020000,p_1k, 0x1FFFF800,0x1FFFF80F, 0x1FFFF000,0x1FFFF800},
{0x9a8,2,0,"W-128K", 0x20000200,0x20002000, 0x08000000,0x08020000,p_1k, 0x08040800,0x0804080F, 0x08040000,0x08040800},
{0x9b0,2,0,"W-256K", 0x20000200,0x20004000, 0x08000000,0x08040000,p_2k, 0x08040800,0x0804080F, 0x08040000,0x08040800},
{0 /* sentinel */ }
};
// <ceil>=false: returns the page that contains address <addr>
// <ceil>=true: returns the first page whose start addr is >= <addr>
int stm32_dev_t::flash_addr_to_page(uint32_t addr, bool ceil) const{
if (!addr_in_flash(addr,ceil)) return 0;
int page = 0;
addr -= fl_start;
for (const char*pshift=fl_psh;;) {
uint32_t size=1<<*pshift;
if (addr<size) return ceil&&addr ? page+1 : page;
addr-=size;
if (pshift[1]) ++pshift; // go to next page, otherwise, repeat last page
}
}
// returns the lower address of flash page <page>
// No overflow check for <page>
uint32_t stm32_dev_t::flash_page_to_addr(int page) const{
uint32_t addr = fl_start;
const char*pshift = fl_psh;
for (int i = 0; i < page; i++) {
addr += 1<<*pshift;
if (pshift[1]) ++pshift; // go to next page, otherwise, repeat last page
}
return addr;
}
Detected encoding: ASCII (7 bit) | 2
|