2023-07-19 10:27 PM
Dear @KDJEM.1
when I read the manual "rm0432" It is given that
The Flash memory programming sequence in standard mode is as follows:
1. Check that no Flash main memory operation is ongoing by checking the BSY bit in the
Flash status register (FLASH_SR).
2. Check and clear all error programming flags due to a previous programming. If not,
PGSERR is set.
3. Set the PG bit in the Flash control register (FLASH_CR).
4. Perform the data write operation at the desired memory address, inside main memory
block or OTP area. Only double word can be programmed.
– Write a first word in an address aligned with double word
– Write the second word
5. Wait until the BSY bit is cleared in the FLASH_SR register.
6. Check that EOP flag is set in the FLASH_SR register (meaning that the programming
operation has succeed), and clear it by software.
7. Clear the PG bit in the FLASH_SR register if there no more programming request
anymore.
My code is
uint64_t data=0x1234567890ABCDEF;
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,0x0803F000,data);
HAL_FLASH_Lock();
The data have been stored in the desired address. My doubt is, as per the manual I didn't set PG bit and check any status of the flash register but I got an output how?
Solved! Go to Solution.
2023-07-20 12:54 AM - edited 2023-07-20 12:56 AM
Hello @ajimathew ,
You have already set the PG bit.
Because when you are calling HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,0x0803F000,data); the PG has been set.
static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
{
/* Check the parameters */
assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
/* Set PG bit */
SET_BIT(FLASH->CR, FLASH_CR_PG);
/* Program first word */
*(__IO uint32_t*)Address = (uint32_t)Data;
/* Barrier to ensure programming is performed in 2 steps, in right order
(independently of compiler optimization behavior) */
__ISB();
/* Program second word */
*(__IO uint32_t*)(Address+4U) = (uint32_t)(Data >> 32);
}
When your question is answered, please close this topic by choosing "Accept as Solution". This will help other users find that answer faster.
Kaouthar
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2023-07-20 12:54 AM - edited 2023-07-20 12:56 AM
Hello @ajimathew ,
You have already set the PG bit.
Because when you are calling HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,0x0803F000,data); the PG has been set.
static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
{
/* Check the parameters */
assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));
/* Set PG bit */
SET_BIT(FLASH->CR, FLASH_CR_PG);
/* Program first word */
*(__IO uint32_t*)Address = (uint32_t)Data;
/* Barrier to ensure programming is performed in 2 steps, in right order
(independently of compiler optimization behavior) */
__ISB();
/* Program second word */
*(__IO uint32_t*)(Address+4U) = (uint32_t)(Data >> 32);
}
When your question is answered, please close this topic by choosing "Accept as Solution". This will help other users find that answer faster.
Kaouthar
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.