1 /** 2 ***************************************************************************** 3 * @file cmem7_flash.h 4 * 5 * @brief CMEM7 flash controller source file 6 * 7 * 8 * @version V1.0 9 * @date 3. September 2013 10 * 11 * @note 12 * 13 ***************************************************************************** 14 * @attention 15 * 16 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 17 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE 18 * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT, 19 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING 20 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE 21 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 22 * 23 * <h2><center>© COPYRIGHT 2013 Capital-micro </center></h2> 24 ***************************************************************************** 25 */ 26 27 #ifndef __CMEM7_FLASH_H 28 #define __CMEM7_FLASH_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include "cmem7.h" 35 #include "cmem7_conf.h" 36 37 /** @defgroup FLASH_PROTECT_MODE 38 * @{ 39 */ 40 #define FLASH_PROTECT_MODE_SW 0 /*!< The Status Register can be written to after a Write 41 Enable command.(Default) */ 42 #define FLASH_PROTECT_MODE_HW 1 /*!< WP pin decides if the Status Register can be written 43 WP#=0, the Status Register locked 44 WP#=1, the Status Register is unlocked and can be written to 45 after a Write Enable command */ 46 #define FLASH_PROTECT_MODE_POWERDOWN 2 /*!< Status Register is protected and can not be written to again 47 until the next Power-Down, Power-Up cycle */ 48 #define FLASH_PROTECT_MODE_OTP 3 /*!< Status Register is permanently protected */ 49 50 #define IS_FLASH_PROTECT_MODE(MODE) (((MODE) == FLASH_PROTECT_MODE_SW) || \ 51 ((MODE) == FLASH_PROTECT_MODE_HW) || \ 52 ((MODE) == FLASH_PROTECT_MODE_POWERDOWN) || \ 53 ((MODE) == FLASH_PROTECT_MODE_OTP)) 54 /** 55 * @} 56 */ 57 58 /** @defgroup FLASH_PROTECT_REGION 59 * @{ 60 */ 61 #define FLASH_PROTECT_REGION_NONE 0x00 /*!< no region is protected */ 62 #define FLASH_PROTECT_REGION_UP_64K 0x01 /*!< region(0F0000H-0FFFFFH) is protected */ 63 #define FLASH_PROTECT_REGION_UP_128K 0x02 /*!< region(0E0000H-0FFFFFH) is protected */ 64 #define FLASH_PROTECT_REGION_UP_256K 0x03 /*!< region(0C0000H-0FFFFFH) is protected */ 65 #define FLASH_PROTECT_REGION_UP_512K 0x04 /*!< region(080000H-0FFFFFH) is protected */ 66 #define FLASH_PROTECT_REGION_LOW_64K 0x09 /*!< region(000000H-00FFFFH) is protected */ 67 #define FLASH_PROTECT_REGION_LOW_128K 0x0A /*!< region(000000H-01FFFFH) is protected */ 68 #define FLASH_PROTECT_REGION_LOW_256K 0x0B /*!< region(000000H-03FFFFH) is protected */ 69 #define FLASH_PROTECT_REGION_LOW_512K 0x0C /*!< region(000000H-07FFFFH) is protected */ 70 #define FLASH_PROTECT_REGION_ALL 0x0D /*!< region(000000H-0FFFFFH) is protected */ 71 #define FLASH_PROTECT_REGION_UP_4K 0x11 /*!< region(0FF000H-0FFFFFH) is protected */ 72 #define FLASH_PROTECT_REGION_UP_8K 0x12 /*!< region(0FE000H-0FFFFFH) is protected */ 73 #define FLASH_PROTECT_REGION_UP_16K 0x13 /*!< region(0FC000H-0FFFFFH) is protected */ 74 #define FLASH_PROTECT_REGION_UP_32K 0x14 /*!< region(0F8000H-0FFFFFH) is protected */ 75 #define FLASH_PROTECT_REGION_LOW_4K 0x19 /*!< region(000000H-000FFFH) is protected */ 76 #define FLASH_PROTECT_REGION_LOW_8K 0x1A /*!< region(000000H-001FFFH) is protected */ 77 #define FLASH_PROTECT_REGION_LOW_16K 0x1B /*!< region(000000H-003FFFH) is protected */ 78 #define FLASH_PROTECT_REGION_LOW_32K 0x1C /*!< region(000000H-007FFFH) is protected */ 79 80 #define IS_FLASH_PROTECT_REGION(REGION) (((REGION) == FLASH_PROTECT_REGION_NONE) || \ 81 ((REGION) == FLASH_PROTECT_REGION_UP_64K) || \ 82 ((REGION) == FLASH_PROTECT_REGION_UP_128K) || \ 83 ((REGION) == FLASH_PROTECT_REGION_UP_256K) || \ 84 ((REGION) == FLASH_PROTECT_REGION_UP_512K) || \ 85 ((REGION) == FLASH_PROTECT_REGION_LOW_64K) || \ 86 ((REGION) == FLASH_PROTECT_REGION_LOW_128K) || \ 87 ((REGION) == FLASH_PROTECT_REGION_LOW_256K) || \ 88 ((REGION) == FLASH_PROTECT_REGION_LOW_512K) || \ 89 ((REGION) == FLASH_PROTECT_REGION_ALL) || \ 90 ((REGION) == FLASH_PROTECT_REGION_UP_4K) || \ 91 ((REGION) == FLASH_PROTECT_REGION_UP_8K) || \ 92 ((REGION) == FLASH_PROTECT_REGION_UP_16K) || \ 93 ((REGION) == FLASH_PROTECT_REGION_UP_32K) || \ 94 ((REGION) == FLASH_PROTECT_REGION_LOW_4K) || \ 95 ((REGION) == FLASH_PROTECT_REGION_LOW_8K) || \ 96 ((REGION) == FLASH_PROTECT_REGION_LOW_16K) || \ 97 ((REGION) == FLASH_PROTECT_REGION_LOW_32K)) 98 /** 99 * @} 100 */ 101 102 /** @defgroup FLASH_READ_MODE 103 * @{ 104 */ 105 #define FLASH_READ_MODE_NORMAL 0 /*!< normal read, 1 bitwidth, highest freqency is 90MHz */ 106 #define FLASH_READ_MODE_FAST 1 /*!< fast read, 1 bitwidth, highest freqency is 120MHz */ 107 #define FLASH_READ_MODE_FAST_DUAL 2 /*!< fast read, 2 bitwidth, highest freqency is 120MHz */ 108 #define FLASH_READ_MODE_FAST_QUAD 3 /*!< fast read, 4 bitwidth, highest freqency is 90MHz */ 109 110 #define IS_FLASH_READ_MODE(MODE) (((MODE) == FLASH_READ_MODE_NORMAL) || \ 111 ((MODE) == FLASH_READ_MODE_FAST) || \ 112 ((MODE) == FLASH_READ_MODE_FAST_DUAL) || \ 113 ((MODE) == FLASH_READ_MODE_FAST_QUAD)) 114 /** 115 * @} 116 */ 117 118 /** 119 * @brief UART initialization structure 120 */ 121 typedef struct 122 { 123 uint8_t FLASH_ClockDividor; /*!< flash clock dividor, 2 in n times */ 124 uint8_t FLASH_ProtectMode; /*!< Status Register protection mode */ 125 uint8_t FLASH_ProtectRegion; /*!< flash protection region */ 126 BOOL FLASH_QuadEnable; /*!< if allows Quad operation */ 127 void (*FLASH_Wait)(void); /*!< When the former read or write operation is excuting, 128 Flash has to call a callback to wait it finish. 129 If null, Flash will wait forever until finish */ 130 } FLASH_InitTypeDef; 131 132 /** 133 * @brief flash initialization 134 * @note This function should be called at first before any other interfaces. 135 * Users should make sure that doesn't erase or write data in a 136 * write-protected region. 137 * @param[in] init A pointer to structure FLASH_InitTypeDef 138 * @retval None 139 */ 140 void FLASH_Init(FLASH_InitTypeDef* init); 141 142 /** 143 * @brief Get flash status 144 * @param[out] ProtectMode flash protect mode, ref as @ref FLASH_PROTECT_MODE 145 * @param[out] ProtectRegion flash protect region, ref as @ref FLASH_PROTECT_REGION 146 * @param[out] QuadEnable quad speed mode enable bit 147 * @retval None 148 */ 149 void FLASH_GetStatus(uint8_t* ProtectMode, uint8_t* ProtectRegion, BOOL* QuadEnable); 150 151 /** 152 * @brief Erase a sector, which is 4K bytes large. 153 * @param[in] addr Start address of a sector 154 * @retval None 155 */ 156 void FLASH_EraseSector(uint32_t addr); 157 158 /** 159 * @brief Erase a block, which is 32K bytes large. 160 * @param[in] addr Start address of a block 161 * @retval None 162 */ 163 void FLASH_Erase32kBlock(uint32_t addr); 164 165 /** 166 * @brief Erase a block, which is 64K bytes large. 167 * @param[in] addr Start address of a block 168 * @retval None 169 */ 170 void FLASH_Erase64kBlock(uint32_t addr); 171 172 /** 173 * @brief Erase all chip 174 * @param None 175 * @retval None 176 */ 177 void FLASH_EraseChip(void); 178 179 /** 180 * @brief Enable flash power down mode or not 181 * @param[in] enable The bit indicates if flash power down mode is enable or not 182 * @retval None 183 */ 184 void FLASH_EnableDeepPowerDown(BOOL enable); 185 186 /** 187 * @brief Read data from flash 188 * @param[in] ReadMode Normal or fast read, ref as @ref FLASH_READ_MODE 189 * @param[in] addr Start address to be read 190 * @param[in] size Expected data size to be read 191 * @param[out] data A user-allocated buffer to fetch data to be read 192 * @retval None 193 */ 194 void FLASH_Read(uint8_t ReadMode, uint32_t addr, uint16_t size, uint8_t* data); 195 196 /** 197 * @brief Write data to flash 198 * @param[in] addr Start address to be read 199 * @param[in] size Expected data size to be read 200 * @param[out] data A pointer to the data to be written 201 * @retval None 202 */ 203 void FLASH_Write(uint32_t addr, uint16_t size, uint8_t* data); 204 205 206 void flash_WaitInWritting(void) ; 207 208 void flash_WaitReadFifoNotEmpty(void); 209 210 uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) ; 211 212 213 #ifdef __cplusplus 214 } 215 #endif 216 217 #endif /* __CMEM7_FLASH_H */ 218 219