@@ -211,6 +211,8 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
211211{
212212 rt_err_t result = RT_EOK ;
213213 rt_uint32_t end_addr = addr + size ;
214+ rt_uint32_t written_size = 0 ;
215+ rt_uint32_t write_size = 0 ;
214216
215217 if ((end_addr ) > STM32_FLASH_END_ADDRESS )
216218 {
@@ -227,22 +229,61 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
227229
228230 __HAL_FLASH_CLEAR_FLAG (FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR );
229231
230- for ( size_t i = 0 ; i < size ; i ++ , addr ++ , buf ++ )
232+ while ( written_size < size )
231233 {
232- /* write data to flash */
233- if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_BYTE , addr , (rt_uint64_t )(* buf )) == HAL_OK )
234+ if (((addr + written_size ) % 4 == 0 ) && (size - written_size >= 4 ))
234235 {
235- if (* (rt_uint8_t * )addr != * buf )
236+ if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD , addr + written_size , * ((rt_uint32_t * )(buf + written_size ))) == HAL_OK )
237+ {
238+ if (* (rt_uint32_t * )(addr + written_size ) != * (rt_uint32_t * )(buf + written_size ))
239+ {
240+ result = - RT_ERROR ;
241+ break ;
242+ }
243+ }
244+ else
236245 {
237246 result = - RT_ERROR ;
238247 break ;
239248 }
249+ write_size = 4 ;
250+ }
251+ else if (((addr + written_size ) % 2 == 0 ) && (size - written_size >= 2 ))
252+ {
253+ if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_HALFWORD , addr + written_size , * ((rt_uint16_t * )(buf + written_size ))) == HAL_OK )
254+ {
255+ if (* (rt_uint16_t * )(addr + written_size ) != * (rt_uint16_t * )(buf + written_size ))
256+ {
257+ result = - RT_ERROR ;
258+ break ;
259+ }
260+ }
261+ else
262+ {
263+ result = - RT_ERROR ;
264+ break ;
265+ }
266+ write_size = 2 ;
240267 }
241268 else
242269 {
243- result = - RT_ERROR ;
244- break ;
270+ if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_BYTE , addr + written_size , * ((rt_uint8_t * )(buf + written_size ))) == HAL_OK )
271+ {
272+ if (* (rt_uint8_t * )(addr + written_size ) != * (rt_uint8_t * )(buf + written_size ))
273+ {
274+ result = - RT_ERROR ;
275+ break ;
276+ }
277+ }
278+ else
279+ {
280+ result = - RT_ERROR ;
281+ break ;
282+ }
283+ write_size = 1 ;
245284 }
285+
286+ written_size += write_size ;
246287 }
247288
248289 HAL_FLASH_Lock ();
@@ -277,6 +318,11 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
277318 return - RT_EINVAL ;
278319 }
279320
321+ if (size < 1 )
322+ {
323+ return - RT_EINVAL ;
324+ }
325+
280326 /*Variable used for Erase procedure*/
281327 FLASH_EraseInitTypeDef EraseInitStruct ;
282328
0 commit comments