Erases a section of the flash memory. 擦除闪存的指定区域。
81{
82 if (size == 0)
83 {
84 return ErrorCode::ARG_ERR;
85 }
86
87 ASSERT(SystemCoreClock <= 120000000);
88
89 const uint32_t START_ADDR = base_address_ + static_cast<uint32_t>(offset);
90 if (!IsInRange(START_ADDR, size))
91 {
92 return ErrorCode::OUT_OF_RANGE;
93 }
94 const uint32_t END_ADDR = START_ADDR + static_cast<uint32_t>(size);
95
96
97 flash_exit_enhanced_read_if_enabled();
98
99
100 flash_set_access_clock_half_sysclk();
101
102
103 flash_fast_unlock();
104 ClearFlashFlagsOnce();
105
106
107 const uint32_t FAST_SZ = 256u;
108 const uint32_t ERASE_BEGIN = START_ADDR & ~(FAST_SZ - 1u);
109 const uint32_t ERASE_END = (END_ADDR + FAST_SZ - 1u) & ~(FAST_SZ - 1u);
110 if (ERASE_END <= ERASE_BEGIN)
111 {
112 flash_fast_lock();
113 flash_set_access_clock_sysclk();
114 return ErrorCode::OK;
115 }
116
117
118 FLASH->CTLR |= (1u << 17);
119
120
121 for (uint32_t adr = ERASE_BEGIN; adr < ERASE_END; adr += FAST_SZ)
122 {
123
124 FLASH->ADDR = adr;
125
126
127 FLASH->CTLR |= (1u << 6);
128
129
130 if (!flash_wait_busy_clear())
131 {
132
133 FLASH->CTLR &= ~(1u << 17);
134 flash_fast_lock();
135 flash_set_access_clock_sysclk();
136 return ErrorCode::FAILED;
137 }
138
139
140 if (FLASH->STATR & (1u << 4))
141 {
142 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPRTERR);
143 FLASH->CTLR &= ~(1u << 17);
144 flash_fast_lock();
145 flash_set_access_clock_sysclk();
146 return ErrorCode::FAILED;
147 }
148
149
150 FLASH_ClearFlag(FLASH_FLAG_EOP);
151 }
152
153
154 FLASH->CTLR &= ~(1u << 17);
155 flash_fast_lock();
156 flash_set_access_clock_sysclk();
157
158 return ErrorCode::OK;
159}