123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589 |
- #include "iflash.h"
- enum {RESET = 0, SET = !RESET};
- #define __IO volatile
- /* Base address of the Flash sectors */
- #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base address of Sector 0, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base address of Sector 1, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base address of Sector 2, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base address of Sector 3, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base address of Sector 4, 64 Kbytes */
- #define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base address of Sector 5, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base address of Sector 6, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base address of Sector 7, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base address of Sector 8, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base address of Sector 9, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base address of Sector 10, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base address of Sector 11, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base address of Sector 12, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base address of Sector 13, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base address of Sector 14, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base address of Sector 15, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base address of Sector 16, 64 Kbytes */
- #define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base address of Sector 17, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base address of Sector 18, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base address of Sector 19, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base address of Sector 20, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base address of Sector 21, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base address of Sector 22, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base address of Sector 23, 128 Kbytes */
- #define SECTOR_MASK ((uint32_t)0xFFFFFF07)
- /** @defgroup FLASH_Flags
- * @{
- */
- #define FLASH_FLAG_EOP ((uint32_t)0x00000001) /*!< FLASH End of Operation flag */
- #define FLASH_FLAG_OPERR ((uint32_t)0x00000002) /*!< FLASH operation Error flag */
- #define FLASH_FLAG_WRPERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */
- #define FLASH_FLAG_PGAERR ((uint32_t)0x00000020) /*!< FLASH Programming Alignment error flag */
- #define FLASH_FLAG_PGPERR ((uint32_t)0x00000040) /*!< FLASH Programming Parallelism error flag */
- #define FLASH_FLAG_PGSERR ((uint32_t)0x00000080) /*!< FLASH Programming Sequence error flag */
- #define FLASH_FLAG_RDERR ((uint32_t)0x00000100) /*!< Read Protection error flag (PCROP) */
- #define FLASH_FLAG_BSY ((uint32_t)0x00010000) /*!< FLASH Busy flag */
- /** @defgroup FLASH_Sectors
- * @{
- */
- #define FLASH_Sector_0 ((uint16_t)0x0000) /*!< Sector Number 0 */
- #define FLASH_Sector_1 ((uint16_t)0x0008) /*!< Sector Number 1 */
- #define FLASH_Sector_2 ((uint16_t)0x0010) /*!< Sector Number 2 */
- #define FLASH_Sector_3 ((uint16_t)0x0018) /*!< Sector Number 3 */
- #define FLASH_Sector_4 ((uint16_t)0x0020) /*!< Sector Number 4 */
- #define FLASH_Sector_5 ((uint16_t)0x0028) /*!< Sector Number 5 */
- #define FLASH_Sector_6 ((uint16_t)0x0030) /*!< Sector Number 6 */
- #define FLASH_Sector_7 ((uint16_t)0x0038) /*!< Sector Number 7 */
- #define FLASH_Sector_8 ((uint16_t)0x0040) /*!< Sector Number 8 */
- #define FLASH_Sector_9 ((uint16_t)0x0048) /*!< Sector Number 9 */
- #define FLASH_Sector_10 ((uint16_t)0x0050) /*!< Sector Number 10 */
- #define FLASH_Sector_11 ((uint16_t)0x0058) /*!< Sector Number 11 */
- #define FLASH_Sector_12 ((uint16_t)0x0080) /*!< Sector Number 12 */
- #define FLASH_Sector_13 ((uint16_t)0x0088) /*!< Sector Number 13 */
- #define FLASH_Sector_14 ((uint16_t)0x0090) /*!< Sector Number 14 */
- #define FLASH_Sector_15 ((uint16_t)0x0098) /*!< Sector Number 15 */
- #define FLASH_Sector_16 ((uint16_t)0x00A0) /*!< Sector Number 16 */
- #define FLASH_Sector_17 ((uint16_t)0x00A8) /*!< Sector Number 17 */
- #define FLASH_Sector_18 ((uint16_t)0x00B0) /*!< Sector Number 18 */
- #define FLASH_Sector_19 ((uint16_t)0x00B8) /*!< Sector Number 19 */
- #define FLASH_Sector_20 ((uint16_t)0x00C0) /*!< Sector Number 20 */
- #define FLASH_Sector_21 ((uint16_t)0x00C8) /*!< Sector Number 21 */
- #define FLASH_Sector_22 ((uint16_t)0x00D0) /*!< Sector Number 22 */
- #define FLASH_Sector_23 ((uint16_t)0x00D8) /*!< Sector Number 23 */
- /**
- * @brief FLASH Status
- */
- typedef enum
- {
- FLASH_BUSY = 1,
- FLASH_ERROR_RD,
- FLASH_ERROR_PGS,
- FLASH_ERROR_PGP,
- FLASH_ERROR_PGA,
- FLASH_ERROR_WRP,
- FLASH_ERROR_PROGRAM,
- FLASH_ERROR_OPERATION,
- FLASH_COMPLETE
- }FLASH_Status;
- /** @defgroup FLASH_Voltage_Range
- * @{
- */
- #define VoltageRange_1 ((uint8_t)0x00) /*!< Device operating range: 1.8V to 2.1V */
- #define VoltageRange_2 ((uint8_t)0x01) /*!<Device operating range: 2.1V to 2.7V */
- #define VoltageRange_3 ((uint8_t)0x02) /*!<Device operating range: 2.7V to 3.6V */
- #define VoltageRange_4 ((uint8_t)0x03) /*!<Device operating range: 2.7V to 3.6V + External Vpp */
- /** @defgroup FLASH_Program_Parallelism
- * @{
- */
- #define FLASH_PSIZE_BYTE ((uint32_t)0x00000000)
- #define FLASH_PSIZE_HALF_WORD ((uint32_t)0x00000100)
- #define FLASH_PSIZE_WORD ((uint32_t)0x00000200)
- #define FLASH_PSIZE_DOUBLE_WORD ((uint32_t)0x00000300)
- #define CR_PSIZE_MASK ((uint32_t)0xFFFFFCFF)
- #define PERIPH_BASE ((uint32_t)0x40000000)
- #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
- #define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00)
- /** @defgroup FLASH_Keys
- * @{
- */
- #define FLASH_KEY1 ((uint32_t)0x45670123)
- #define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
- typedef struct
- {
- __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */
- __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */
- __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */
- __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */
- __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */
- __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */
- __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */
- } FLASH_TypeDef;
- #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)
- /******************* Bits definition for FLASH_CR register ******************/
- #define FLASH_CR_PG ((uint32_t)0x00000001)
- #define FLASH_CR_SER ((uint32_t)0x00000002)
- #define FLASH_CR_STRT ((uint32_t)0x00010000)
- #define FLASH_CR_LOCK ((uint32_t)0x80000000)
- static uint32_t GetSector(uint32_t Address);
- void FLASH_Unlock(void);
- FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange);
- FLASH_Status FLASH_WaitForLastOperation(void);
- FLASH_Status FLASH_GetStatus(void);
- FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
- FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
- FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data);
- void FLASH_Lock(void);
- /*准备写入的测试数据*/
- /* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* 要擦除内部FLASH的起始地址(含) */
- #define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_7
- /* 要擦除内部FLASH的结束地址(不含) */
- #define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_8
- /**
- * @brief InternalFlash_Test,对内部FLASH进行读写测试
- * @param None
- * @retval None
- */
- int InternalFlash_WriteBuf(const uint8_t* data, uint32_t length)
- {
- /*要擦除的起始扇区(包含)及结束扇区(不包含),如8-12,表示擦除8、9、10、11扇区*/
- uint32_t uwStartSector = 0;
- uint32_t uwEndSector = 0;
-
- uint32_t uwAddress = 0;
- uint32_t uwSectorCounter = 0;
- // __IO uint32_t uwData32 = 0;
- __IO uint32_t uwMemoryProgramStatus = 0;
- __IO uint32_t rr=0;
- uint8_t* pbuf = data;
- //pbuf = (uint8_t*)malloc(length*sizeof(uint8_t));
- static uint32_t i = 0;
-
- /* FLASH 解锁 ********************************/
- /* 使能访问FLASH控制寄存器 */
- FLASH_Unlock();
-
- /* 擦除用户区域 (用户区域指程序本身没有使用的空间,可以自定义)**/
- /* 清除各种FLASH的标志位 */
- // FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
- // FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
-
- *((volatile uint32_t *)0x40023c0C) = (((uint32_t)0x00000001) | ((uint32_t)0x00000002) | ((uint32_t)0x00000010) | \
- ((uint32_t)0x00000020) | ((uint32_t)0x00000040) | ((uint32_t)0x00000080));
-
- uwStartSector = GetSector(FLASH_USER_START_ADDR);
- uwEndSector = GetSector(FLASH_USER_END_ADDR);
- /* 开始擦除操作 */
- uwSectorCounter = uwStartSector;
- while (uwSectorCounter <= uwEndSector)
- {
- // VoltageRange_3 以“字”的大小进行操作
- if (FLASH_EraseSector(uwSectorCounter, VoltageRange_3) != FLASH_COMPLETE)
- {
- /*擦除出错,返回,实际应用中可加入处理 */
- return -1;
- }
- /* 计数器指向下一个扇区 */
- if (uwSectorCounter == FLASH_Sector_11)
- {
- uwSectorCounter += 40;
- }
- else
- {
- uwSectorCounter += 8;
- }
- }
- /* 以“字节”的大小为单位写入数据 ********************************/
- uwAddress = FLASH_USER_START_ADDR;
- for (i=0;i < length;i++)
- {
- rr = pbuf[i];
- if (FLASH_ProgramByte(uwAddress, rr) == FLASH_COMPLETE)
- {
- uwAddress = uwAddress + 1;
- }
- else
- {
- /*写入出错,返回,实际应用中可加入处理 */
- break;
- }
- }
-
- /* 给FLASH上锁,防止内容被篡改*/
- FLASH_Lock();
- }
- /**
- * @brief 根据输入的地址给出它所在的sector
- * 例如:
- uwStartSector = GetSector(FLASH_USER_START_ADDR);
- uwEndSector = GetSector(FLASH_USER_END_ADDR);
- * @param Address:地址
- * @retval 地址所在的sector
- */
- static uint32_t GetSector(uint32_t Address)
- {
- uint32_t sector = 0;
-
- if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
- {
- sector = FLASH_Sector_0;
- }
- else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
- {
- sector = FLASH_Sector_1;
- }
- else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
- {
- sector = FLASH_Sector_2;
- }
- else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
- {
- sector = FLASH_Sector_3;
- }
- else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
- {
- sector = FLASH_Sector_4;
- }
- else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
- {
- sector = FLASH_Sector_5;
- }
- else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
- {
- sector = FLASH_Sector_6;
- }
- else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
- {
- sector = FLASH_Sector_7;
- }
- else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
- {
- sector = FLASH_Sector_8;
- }
- else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
- {
- sector = FLASH_Sector_9;
- }
- else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
- {
- sector = FLASH_Sector_10;
- }
-
- else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11))
- {
- sector = FLASH_Sector_11;
- }
- else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12))
- {
- sector = FLASH_Sector_12;
- }
- else if((Address < ADDR_FLASH_SECTOR_14) && (Address >= ADDR_FLASH_SECTOR_13))
- {
- sector = FLASH_Sector_13;
- }
- else if((Address < ADDR_FLASH_SECTOR_15) && (Address >= ADDR_FLASH_SECTOR_14))
- {
- sector = FLASH_Sector_14;
- }
- else if((Address < ADDR_FLASH_SECTOR_16) && (Address >= ADDR_FLASH_SECTOR_15))
- {
- sector = FLASH_Sector_15;
- }
- else if((Address < ADDR_FLASH_SECTOR_17) && (Address >= ADDR_FLASH_SECTOR_16))
- {
- sector = FLASH_Sector_16;
- }
- else if((Address < ADDR_FLASH_SECTOR_18) && (Address >= ADDR_FLASH_SECTOR_17))
- {
- sector = FLASH_Sector_17;
- }
- else if((Address < ADDR_FLASH_SECTOR_19) && (Address >= ADDR_FLASH_SECTOR_18))
- {
- sector = FLASH_Sector_18;
- }
- else if((Address < ADDR_FLASH_SECTOR_20) && (Address >= ADDR_FLASH_SECTOR_19))
- {
- sector = FLASH_Sector_19;
- }
- else if((Address < ADDR_FLASH_SECTOR_21) && (Address >= ADDR_FLASH_SECTOR_20))
- {
- sector = FLASH_Sector_20;
- }
- else if((Address < ADDR_FLASH_SECTOR_22) && (Address >= ADDR_FLASH_SECTOR_21))
- {
- sector = FLASH_Sector_21;
- }
- else if((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22))
- {
- sector = FLASH_Sector_22;
- }
- else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23))*/
- {
- sector = FLASH_Sector_23;
- }
- return sector;
- }
- void FLASH_Unlock(void)
- {
- if((FLASH->CR & FLASH_CR_LOCK) != RESET)
- {
- /* Authorize the FLASH Registers access */
- FLASH->KEYR = FLASH_KEY1;
- FLASH->KEYR = FLASH_KEY2;
- }
- }
- FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
- {
- uint32_t tmp_psize = 0x0;
- FLASH_Status status = FLASH_COMPLETE;
- // /* Check the parameters */
- // assert_param(IS_FLASH_SECTOR(FLASH_Sector));
- // assert_param(IS_VOLTAGERANGE(VoltageRange));
-
- if(VoltageRange == VoltageRange_1)
- {
- tmp_psize = FLASH_PSIZE_BYTE;
- }
- else if(VoltageRange == VoltageRange_2)
- {
- tmp_psize = FLASH_PSIZE_HALF_WORD;
- }
- else if(VoltageRange == VoltageRange_3)
- {
- tmp_psize = FLASH_PSIZE_WORD;
- }
- else
- {
- tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
- }
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
-
- if(status == FLASH_COMPLETE)
- {
- /* if the previous operation is completed, proceed to erase the sector */
- FLASH->CR &= CR_PSIZE_MASK;
- FLASH->CR |= tmp_psize;
- FLASH->CR &= SECTOR_MASK;
- FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
- FLASH->CR |= FLASH_CR_STRT;
-
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
-
- /* if the erase operation is completed, disable the SER Bit */
- FLASH->CR &= (~FLASH_CR_SER);
- FLASH->CR &= SECTOR_MASK;
- }
- /* Return the Erase Status */
- return status;
- }
- FLASH_Status FLASH_WaitForLastOperation(void)
- {
- __IO FLASH_Status status = FLASH_COMPLETE;
-
- /* Check for the FLASH Status */
- status = FLASH_GetStatus();
- /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
- Even if the FLASH operation fails, the BUSY flag will be reset and an error
- flag will be set */
- while(status == FLASH_BUSY)
- {
- status = FLASH_GetStatus();
- }
- /* Return the operation status */
- return status;
- }
- FLASH_Status FLASH_GetStatus(void)
- {
- FLASH_Status flashstatus = FLASH_COMPLETE;
-
- if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
- {
- flashstatus = FLASH_BUSY;
- }
- else
- {
- if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)
- {
- flashstatus = FLASH_ERROR_WRP;
- }
- else
- {
- if((FLASH->SR & FLASH_FLAG_RDERR) != (uint32_t)0x00)
- {
- flashstatus = FLASH_ERROR_RD;
- }
- else
- {
- if((FLASH->SR & (uint32_t)0xE0) != (uint32_t)0x00)
- {
- flashstatus = FLASH_ERROR_PROGRAM;
- }
- else
- {
- if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00)
- {
- flashstatus = FLASH_ERROR_OPERATION;
- }
- else
- {
- flashstatus = FLASH_COMPLETE;
- }
- }
- }
- }
- }
- /* Return the FLASH Status */
- return flashstatus;
- }
- FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
- {
- FLASH_Status status = FLASH_COMPLETE;
- // /* Check the parameters */
- // assert_param(IS_FLASH_ADDRESS(Address));
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
-
- if(status == FLASH_COMPLETE)
- {
- /* if the previous operation is completed, proceed to program the new data */
- FLASH->CR &= CR_PSIZE_MASK;
- FLASH->CR |= FLASH_PSIZE_WORD;
- FLASH->CR |= FLASH_CR_PG;
-
- *(__IO uint32_t*)Address = Data;
-
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
- /* if the program operation is completed, disable the PG Bit */
- FLASH->CR &= (~FLASH_CR_PG);
- }
- /* Return the Program Status */
- return status;
- }
- FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
- {
- FLASH_Status status = FLASH_COMPLETE;
- // /* Check the parameters */
- // assert_param(IS_FLASH_ADDRESS(Address));
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
-
- if(status == FLASH_COMPLETE)
- {
- /* if the previous operation is completed, proceed to program the new data */
- FLASH->CR &= CR_PSIZE_MASK;
- FLASH->CR |= FLASH_PSIZE_HALF_WORD;
- FLASH->CR |= FLASH_CR_PG;
-
- *(__IO uint16_t*)Address = Data;
-
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
- /* if the program operation is completed, disable the PG Bit */
- FLASH->CR &= (~FLASH_CR_PG);
- }
- /* Return the Program Status */
- return status;
- }
- FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data)
- {
- FLASH_Status status = FLASH_COMPLETE;
- // /* Check the parameters */
- // assert_param(IS_FLASH_ADDRESS(Address));
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
-
- if(status == FLASH_COMPLETE)
- {
- /* if the previous operation is completed, proceed to program the new data */
- FLASH->CR &= CR_PSIZE_MASK;
- FLASH->CR |= FLASH_PSIZE_BYTE;
- FLASH->CR |= FLASH_CR_PG;
-
- *(__IO uint8_t*)Address = Data;
-
- /* Wait for last operation to be completed */
- status = FLASH_WaitForLastOperation();
- /* if the program operation is completed, disable the PG Bit */
- FLASH->CR &= (~FLASH_CR_PG);
- }
- /* Return the Program Status */
- return status;
- }
- void FLASH_Lock(void)
- {
- /* Set the LOCK Bit to lock the FLASH Registers access */
- FLASH->CR |= FLASH_CR_LOCK;
- }
|