@@ -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