Skip to content

Commit 9bfca82

Browse files
adustmkegilbert
authored andcommitted
Rebase: 0d1c6c2
This commit completely rewrote flash_api.c in a few places so kicked out changes from Master and accepted the branch changes. F429 + F439 : changes after code review GetSector has been rewritten
1 parent f71b525 commit 9bfca82

File tree

2 files changed

+302
-100
lines changed

2 files changed

+302
-100
lines changed

targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/device/flash_api.c

Lines changed: 151 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -22,57 +22,158 @@
2222

2323
#if DEVICE_FLASH
2424

25-
// This is a flash algo binary blob. It is PIC (position independent code) that should be stored in RAM
26-
static uint32_t FLASH_ALGO[] = {
27-
0xf3c04601, 0x28203007, 0x2204bf24, 0x1050eb02, 0x2810d205, 0x2203bf26, 0x1010eb02, 0xf4110880,
28-
0xbf181f80, 0x0010f040, 0x48714770, 0x6001496f, 0x60014970, 0x68014870, 0x01f0f041, 0x486f6001,
29-
0xf0106800, 0xd1080f20, 0xf245486d, 0x60015155, 0x60412106, 0x71fff640, 0x20006081, 0x49694770,
30-
0xf4206808, 0x600a52f8, 0x48676008, 0xf0416801, 0x60014100, 0x47702000, 0xc18cf8df, 0x0000f8dc,
31-
0x0004f040, 0x0000f8cc, 0x0000f8dc, 0x4000f440, 0x0000f8cc, 0x0000f8dc, 0x3080f440, 0x0000f8cc,
32-
0x0004f1ac, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a53, 0x68036011, 0x3f80f413, 0xf8dcd1fa,
33-
0xf0200000, 0xf8cc0004, 0xf8dc0000, 0xf4200000, 0xf8cc4000, 0x20000000, 0xf3c04770, 0x29203107,
34-
0x2204bf24, 0x1151eb02, 0x2910d205, 0x2203bf26, 0x1111eb02, 0xf4100889, 0xbf181f80, 0x0110f041,
35-
0x6802483d, 0x02f0f042, 0xf1006002, 0x22020c04, 0x2000f8cc, 0x2000f8dc, 0xea0323f8, 0x431101c1,
36-
0x1000f8cc, 0x1000f8dc, 0x3180f441, 0x1000f8cc, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a30,
37-
0x68036011, 0x3f80f413, 0xf8dcd1fa, 0xf0211000, 0xf8cc0102, 0x68011000, 0x0ff0f011, 0x2000bf04,
38-
0x68014770, 0x01f0f041, 0x20016001, 0x4b224770, 0x1cc9b430, 0xc000f8d3, 0x0103f031, 0x0cf0f04c,
39-
0xc000f8c3, 0x0404f103, 0x0c00f04f, 0xc000f8c4, 0xf240bf18, 0xd0252501, 0xc000f8d4, 0x0c05ea4c,
40-
0xc000f8c4, 0xc000f8d2, 0xc000f8c0, 0xc000f8d3, 0x3f80f41c, 0xf8d4d1fa, 0xf02cc000, 0xf8c40c01,
41-
0xf8d3c000, 0xf01cc000, 0xd0060ff0, 0xf0406818, 0x601800f0, 0x2001bc30, 0x1d004770, 0xf1021f09,
42-
0xd1d90204, 0x2000bc30, 0x00004770, 0x45670123, 0x40023c04, 0xcdef89ab, 0x40023c0c, 0x40023c14,
43-
0x40003000, 0x40023c00, 0x40023c10, 0x00000000
44-
};
45-
46-
static const flash_algo_t flash_algo_config = {
47-
.init = 0x2b,
48-
.uninit = 0x5f,
49-
.erase_sector = 0xdb,
50-
.program_page = 0x16f,
51-
.static_base = 0x20c,
52-
.algo_blob = FLASH_ALGO
53-
};
54-
55-
static const sector_info_t sectors_info[] = {
56-
{0x8000000, 0x4000},
57-
{0x8010000, 0x10000},
58-
{0x8020000, 0x20000},
59-
{0x8100000, 0x4000},
60-
{0x8110000, 0x10000},
61-
{0x8120000, 0x20000},
62-
};
63-
64-
static const flash_target_config_t flash_target_config = {
65-
.page_size = 0x400,
66-
.flash_start = 0x8000000,
67-
.flash_size = 0x200000,
68-
.sectors = sectors_info,
69-
.sector_info_count = sizeof(sectors_info) / sizeof(sector_info_t)
70-
};
71-
72-
void flash_set_target_config(flash_t *obj)
25+
#if defined (STM32F429xx) || defined (STM32F439xx)
26+
#define FLASH_SIZE (uint32_t) 0x200000
27+
#endif
28+
29+
static uint32_t GetSector(uint32_t Address);
30+
static uint32_t GetSectorSize(uint32_t Sector);
31+
32+
int32_t flash_init(flash_t *obj)
33+
{
34+
/* Allow Access to Flash control registers and user Falsh */
35+
if (HAL_FLASH_Unlock()) {
36+
return -1;
37+
} else {
38+
return 0;
39+
}
40+
}
41+
int32_t flash_free(flash_t *obj)
42+
{
43+
/* Disable the Flash option control register access (recommended to protect
44+
the option Bytes against possible unwanted operations) */
45+
if (HAL_FLASH_Lock()) {
46+
return -1;
47+
} else {
48+
return 0;
49+
}
50+
}
51+
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
52+
{
53+
/*Variable used for Erase procedure*/
54+
static FLASH_EraseInitTypeDef EraseInitStruct;
55+
uint32_t FirstSector;
56+
uint32_t SectorError = 0;
57+
58+
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
59+
60+
return -1;
61+
}
62+
63+
/* Get the 1st sector to erase */
64+
FirstSector = GetSector(address);
65+
66+
/* Fill EraseInit structure*/
67+
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
68+
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
69+
EraseInitStruct.Sector = FirstSector;
70+
EraseInitStruct.NbSectors = 1;
71+
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
72+
return -1;
73+
} else {
74+
return 0;
75+
}
76+
}
77+
78+
int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
79+
{
80+
81+
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
82+
return -1;
83+
}
84+
85+
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
86+
you have to make sure that these data are rewritten before they are accessed during code
87+
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
88+
DCRST and ICRST bits in the FLASH_CR register. */
89+
__HAL_FLASH_DATA_CACHE_DISABLE();
90+
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
91+
92+
__HAL_FLASH_DATA_CACHE_RESET();
93+
__HAL_FLASH_INSTRUCTION_CACHE_RESET();
94+
95+
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
96+
__HAL_FLASH_DATA_CACHE_ENABLE();
97+
98+
while (size > 0) {
99+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
100+
return -1;
101+
} else {
102+
size--;
103+
address++;
104+
data++;
105+
}
106+
}
107+
return 0;
108+
}
109+
110+
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
111+
{
112+
113+
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
114+
return MBED_FLASH_INVALID_SIZE;
115+
}
116+
117+
return (GetSectorSize(GetSector(address)));
118+
}
119+
120+
uint32_t flash_get_page_size(const flash_t *obj)
121+
{
122+
// not applicable for STM32F4
123+
return (0x4000); // minimum sector size
124+
}
125+
uint32_t flash_get_start_address(const flash_t *obj)
126+
{
127+
return FLASH_BASE;
128+
}
129+
uint32_t flash_get_size(const flash_t *obj)
130+
{
131+
return FLASH_SIZE;
132+
}
133+
134+
/**
135+
* @brief Gets the sector of a given address
136+
* @param None
137+
* @retval The sector of a given address
138+
*/
139+
static uint32_t GetSector(uint32_t address)
140+
{
141+
uint32_t sector = 0;
142+
uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
143+
if (address & 0x100000) { // handle 2nd bank
144+
sector = FLASH_SECTOR_12;
145+
tmp = address - ADDR_FLASH_SECTOR_12;
146+
}
147+
if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
148+
//printf("tmp for sectors less than 4: 0X%4x")
149+
sector += tmp >>14;
150+
} else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
151+
sector += FLASH_SECTOR_4;
152+
} else {
153+
sector += 4 + (tmp >>17);
154+
}
155+
printf("address:0X%04x%04x, secteur: %d\n", (address>>16)&0XFFFF, (address&0XFFFF), sector);
156+
return sector;
157+
}
158+
159+
/**
160+
* @brief Gets sector Size
161+
* @param None
162+
* @retval The size of a given sector
163+
*/
164+
static uint32_t GetSectorSize(uint32_t Sector)
73165
{
74-
obj->flash_algo = &flash_algo_config;
75-
obj->target_config = &flash_target_config;
166+
uint32_t sectorsize = 0x00;
167+
if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
168+
(Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
169+
(Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
170+
sectorsize = 16 * 1024;
171+
} else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)){
172+
sectorsize = 64 * 1024;
173+
} else {
174+
sectorsize = 128 * 1024;
175+
}
176+
return sectorsize;
76177
}
77178

78179
#endif

0 commit comments

Comments
 (0)