|
@@ -1,612 +0,0 @@
|
|
-
|
|
|
|
-#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);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/*准备写入的测试数据*/
|
|
|
|
-#define DATA_32 ((uint32_t)0x13246578)
|
|
|
|
-#define BUFLENGTH 32
|
|
|
|
-uint32_t wrbuf[BUFLENGTH] = {0xabcdef12};
|
|
|
|
-
|
|
|
|
-/* 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_Test(void)
|
|
|
|
-// {
|
|
|
|
-// /*要擦除的起始扇区(包含)及结束扇区(不包含),如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;
|
|
|
|
-
|
|
|
|
-// int 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 < BUFLENGTH;i++)
|
|
|
|
-// {
|
|
|
|
-// uint32_t rr = 0x12345600;//wrbuf[i];
|
|
|
|
-// if (FLASH_ProgramWord(uwAddress, rr) == FLASH_COMPLETE)
|
|
|
|
-// {
|
|
|
|
-// uwAddress = uwAddress + 4;
|
|
|
|
-// }
|
|
|
|
-// else
|
|
|
|
-// {
|
|
|
|
-// /*写入出错,返回,实际应用中可加入处理 */
|
|
|
|
-// break;
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-// /* 给FLASH上锁,防止内容被篡改*/
|
|
|
|
-// FLASH_Lock();
|
|
|
|
-
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-int WriteLicensetoFlash(uint8_t *license )
|
|
|
|
-{
|
|
|
|
- int index=0;
|
|
|
|
- uint32_t eraseSector = 0;
|
|
|
|
- uint32_t address = ADDR_FLASH_SECTOR_6;
|
|
|
|
- uint32_t *ptr = (uint32_t*)license;
|
|
|
|
- FLASH_Unlock();
|
|
|
|
- /* 清除各种FLASH的标志位 */
|
|
|
|
- *((volatile uint32_t *)0x40023c0C) = (((uint32_t)0x00000001) | ((uint32_t)0x00000002) | ((uint32_t)0x00000010) | \
|
|
|
|
- ((uint32_t)0x00000020) | ((uint32_t)0x00000040) | ((uint32_t)0x00000080));
|
|
|
|
-
|
|
|
|
- eraseSector = GetSector(ADDR_FLASH_SECTOR_6);
|
|
|
|
- if(FLASH_EraseSector(eraseSector, VoltageRange_3) != FLASH_COMPLETE)
|
|
|
|
- {
|
|
|
|
- printf("Erase Flash sector 7 failed!\n");
|
|
|
|
- FLASH_Lock();
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for(index=0;index<32;index++)
|
|
|
|
- {
|
|
|
|
- FLASH_ProgramWord(address, (uint32_t)0x11223344);
|
|
|
|
- address += 4;
|
|
|
|
- ptr++;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- 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 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-}
|
|
|