Program flash words of 256 bits at a specified address with interrupt enabled.
310{
311 HAL_StatusTypeDef status;
312 __IO uint32_t *dest_addr = (__IO uint32_t*)FlashAddress;
313 __IO uint32_t *src_addr = (__IO uint32_t*)DataAddress;
314 uint32_t bank;
315 uint8_t row_index = FLASH_NB_32BITWORD_IN_FLASHWORD;
316
317
318 assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));
319 assert_param(IS_FLASH_PROGRAM_ADDRESS(FlashAddress));
320
321
323
324
326
327#if defined (FLASH_OPTCR_PG_OTP)
328 if((IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress)) || (IS_FLASH_PROGRAM_ADDRESS_OTP(FlashAddress)))
329#else
330 if(IS_FLASH_PROGRAM_ADDRESS_BANK1(FlashAddress))
331#endif
332 {
333 bank = FLASH_BANK_1;
334 }
335#if defined (DUAL_BANK)
336 else if(IS_FLASH_PROGRAM_ADDRESS_BANK2(FlashAddress))
337 {
338 bank = FLASH_BANK_2;
339 }
340#endif
341 else
342 {
343 return HAL_ERROR;
344 }
345
346
348
349 if (status != HAL_OK)
350 {
351
353 }
354 else
355 {
357
358#if defined (DUAL_BANK)
359 if(bank == FLASH_BANK_1)
360 {
361
363
364#if defined (FLASH_OPTCR_PG_OTP)
365 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
366 {
367
368 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
369 }
370 else
371#endif
372 {
373
374 SET_BIT(FLASH->CR1, FLASH_CR_PG);
375 }
376
377
378#if defined (FLASH_CR_OPERRIE)
379 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
380 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
381#else
382 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
383 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
384#endif
385 }
386 else
387 {
388
390
391
392 SET_BIT(FLASH->CR2, FLASH_CR_PG);
393
394
395#if defined (FLASH_CR_OPERRIE)
396 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
397 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2 | FLASH_IT_OPERR_BANK2);
398#else
399 __HAL_FLASH_ENABLE_IT_BANK2(FLASH_IT_EOP_BANK2 | FLASH_IT_WRPERR_BANK2 | FLASH_IT_PGSERR_BANK2 | \
400 FLASH_IT_STRBERR_BANK2 | FLASH_IT_INCERR_BANK2);
401#endif
402 }
403#else
404
406
407#if defined (FLASH_OPTCR_PG_OTP)
408 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
409 {
410
411 SET_BIT(FLASH->OPTCR, FLASH_OPTCR_PG_OTP);
412 }
413 else
414#endif
415 {
416
417 SET_BIT(FLASH->CR1, FLASH_CR_PG);
418 }
419
420
421#if defined (FLASH_CR_OPERRIE)
422 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
423 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1 | FLASH_IT_OPERR_BANK1);
424#else
425 __HAL_FLASH_ENABLE_IT_BANK1(FLASH_IT_EOP_BANK1 | FLASH_IT_WRPERR_BANK1 | FLASH_IT_PGSERR_BANK1 | \
426 FLASH_IT_STRBERR_BANK1 | FLASH_IT_INCERR_BANK1);
427#endif
428#endif
429
430 __ISB();
431 __DSB();
432
433#if defined (FLASH_OPTCR_PG_OTP)
434 if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
435 {
436
437 *(__IO uint16_t *)FlashAddress = *(__IO uint16_t*)DataAddress;
438 }
439 else
440#endif
441 {
442
443 do
444 {
445 *dest_addr = *src_addr;
446 dest_addr++;
447 src_addr++;
448 row_index--;
449 } while (row_index != 0U);
450 }
451
452 __ISB();
453 __DSB();
454 }
455
456 return status;
457}