Skip to content

Commit ae7b752

Browse files
author
Jan Kamidra
committed
Fix FlashIAP
1 parent 103c0d7 commit ae7b752

File tree

1 file changed

+30
-34
lines changed

1 file changed

+30
-34
lines changed

targets/TARGET_STM/TARGET_STM32U0/flash_api.c

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ static uint32_t GetPage(uint32_t Addr)
3030
if (Addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
3131
/* Bank 1 */
3232
page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
33-
} else {
34-
/* Bank 2 */
35-
page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
3633
}
3734

3835
return page;
@@ -49,8 +46,6 @@ static uint32_t GetBank(uint32_t Addr)
4946

5047
if (Addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
5148
bank = FLASH_BANK_1;
52-
} else {
53-
bank = FLASH_BANK_2;
5449
}
5550

5651
return bank;
@@ -93,19 +88,14 @@ int32_t flash_erase_sector(flash_t *obj, uint32_t address)
9388
return -1;
9489
}
9590

96-
if (HAL_ICACHE_Disable() != HAL_OK)
97-
{
98-
return -1;
99-
}
100-
10191
if (HAL_FLASH_Unlock() != HAL_OK) {
10292
return -1;
10393
}
10494

10595
core_util_critical_section_enter();
10696

10797
/* Clear error programming flags */
108-
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
98+
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
10999

110100
/* Get the 1st page to erase */
111101
FirstPage = GetPage(address);
@@ -129,11 +119,6 @@ int32_t flash_erase_sector(flash_t *obj, uint32_t address)
129119
return -1;
130120
}
131121

132-
if (HAL_ICACHE_Enable() != HAL_OK)
133-
{
134-
return -1;
135-
}
136-
137122
return 0;
138123
}
139124

@@ -162,36 +147,47 @@ int32_t flash_program_page(flash_t *obj, uint32_t address,
162147
return -1;
163148
}
164149

165-
if (HAL_ICACHE_Disable() != HAL_OK)
166-
{
167-
return -1;
168-
}
169-
170150
if (HAL_FLASH_Unlock() != HAL_OK) {
171151
return -1;
172152
}
173153

174154
/* Clear error programming flags */
175-
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
155+
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
176156

177157
/* Program the user Flash area word by word */
178158
StartAddress = address;
179159

180-
while ((address < (StartAddress + size)) && (status == 0)) {
181-
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, address, ((uint32_t) data)) == HAL_OK) {
182-
address = address + 16;
183-
data = data + 16;
184-
} else {
185-
status = -1;
160+
/* HW needs an aligned address to program flash, which data
161+
* parameters doesn't ensure */
162+
if ((uint32_t) data % 8 != 0) {
163+
volatile uint64_t data64;
164+
while ((address < (StartAddress + size)) && (status == 0)) {
165+
for (uint8_t i = 0; i < 8; i++) {
166+
*(((uint8_t *) &data64) + i) = *(data + i);
167+
}
168+
169+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, data64)
170+
== HAL_OK) {
171+
address = address + 8;
172+
data = data + 8;
173+
} else {
174+
status = -1;
175+
}
176+
}
177+
} else { /* case where data is aligned, so let's avoid any copy */
178+
while ((address < (StartAddress + size)) && (status == 0)) {
179+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address,
180+
*((uint64_t *) data))
181+
== HAL_OK) {
182+
address = address + 8;
183+
data = data + 8;
184+
} else {
185+
status = -1;
186+
}
186187
}
187188
}
188189

189-
if (HAL_FLASH_Unlock() != HAL_OK) {
190-
return -1;
191-
}
192-
193-
if (HAL_ICACHE_Enable() != HAL_OK)
194-
{
190+
if (HAL_FLASH_Lock() != HAL_OK) {
195191
return -1;
196192
}
197193

0 commit comments

Comments
 (0)