libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR > Class Template Reference

STM32Flash 通用类,构造时传入扇区列表,自动判断编程粒度。 More...

#include <stm32_flash.hpp>

Inheritance diagram for LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >:
[legend]
Collaboration diagram for LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >:
[legend]

Public Member Functions

 STM32Flash (const FlashSector(&sectors)[SECTOR_COUNT])
 STM32Flash 类,构造时传入扇区列表,自动判断编程粒度。
 
ErrorCode Erase (size_t offset, size_t size) override
 Erases a section of the flash memory. 擦除闪存的指定区域。
 
ErrorCode Write (size_t offset, ConstRawData data) override
 Writes data to the flash memory. 向闪存写入数据。
 
- Public Member Functions inherited from LibXR::Flash
 Flash (size_t min_erase_size, size_t min_write_size, RawData flash_area)
 Constructs a Flash object with specified properties. 构造函数,初始化闪存属性。
 

Private Member Functions

bool IsInRange (uint32_t addr, size_t size) const
 

Static Private Member Functions

static constexpr uint32_t DetermineProgramType ()
 
static constexpr size_t DetermineMinWriteSize ()
 

Private Attributes

const FlashSectorsectors_
 
uint32_t base_address_
 
uint32_t program_type_
 

Additional Inherited Members

- Data Fields inherited from LibXR::Flash
size_t min_erase_size_
 Minimum erasable block size in bytes. 最小可擦除块大小(字节)。
 
size_t min_write_size_
 Minimum writable block size in bytes. 最小可写块大小(字节)。
 
RawData flash_area_
 

Detailed Description

template<size_t SECTOR_COUNT, size_t START_SECTOR>
class LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >

STM32Flash 通用类,构造时传入扇区列表,自动判断编程粒度。

Template Parameters
SECTOR_COUNT扇区数量
START_SECTOR起始扇区索引(用于擦除编号)

Definition at line 87 of file stm32_flash.hpp.

Constructor & Destructor Documentation

◆ STM32Flash()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::STM32Flash ( const FlashSector(&) sectors[SECTOR_COUNT])
inline

STM32Flash 类,构造时传入扇区列表,自动判断编程粒度。

Parameters
sectors扇区列表

Definition at line 95 of file stm32_flash.hpp.

96 : Flash(sectors[START_SECTOR - 1].size, DetermineMinWriteSize(),
97 {reinterpret_cast<void*>(sectors[START_SECTOR - 1].address),
98 sectors[SECTOR_COUNT - 1].address - sectors[START_SECTOR - 1].address +
99 sectors[SECTOR_COUNT - 1].size}),
100 sectors_(sectors),
101 base_address_(sectors[START_SECTOR - 1].address),
102 program_type_(DetermineProgramType())
103 {
104 }
Flash(size_t min_erase_size, size_t min_write_size, RawData flash_area)
Constructs a Flash object with specified properties. 构造函数,初始化闪存属性。
Definition flash.hpp:27

Member Function Documentation

◆ DetermineMinWriteSize()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
static constexpr size_t LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::DetermineMinWriteSize ( )
inlinestaticconstexprprivate

Definition at line 254 of file stm32_flash.hpp.

255 {
256#ifdef FLASH_TYPEPROGRAM_BYTE
257 return 1;
258#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
259 return 2;
260#elif defined(FLASH_TYPEPROGRAM_WORD)
261 return 4;
262#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
263 return 8;
264#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
265 return FLASH_NB_32BITWORD_IN_FLASHWORD * 4;
266#else
267#error "No supported FLASH_TYPEPROGRAM_xxx defined"
268#endif
269 }

◆ DetermineProgramType()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
static constexpr uint32_t LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::DetermineProgramType ( )
inlinestaticconstexprprivate

Definition at line 237 of file stm32_flash.hpp.

238 {
239#ifdef FLASH_TYPEPROGRAM_BYTE
240 return FLASH_TYPEPROGRAM_BYTE;
241#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
242 return FLASH_TYPEPROGRAM_HALFWORD;
243#elif defined(FLASH_TYPEPROGRAM_WORD)
244 return FLASH_TYPEPROGRAM_WORD;
245#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
246 return FLASH_TYPEPROGRAM_DOUBLEWORD;
247#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
248 return FLASH_TYPEPROGRAM_FLASHWORD;
249#else
250#error "No supported FLASH_TYPEPROGRAM_xxx defined"
251#endif
252 }

◆ Erase()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
ErrorCode LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::Erase ( size_t offset,
size_t size )
inlineoverridevirtual

Erases a section of the flash memory. 擦除闪存的指定区域。

Parameters
offsetThe starting offset of the section to erase. 要擦除的起始偏移地址。
sizeThe size of the section to erase. 要擦除的区域大小。
Returns
ErrorCode indicating success or failure. 返回操作结果的错误码。

Implements LibXR::Flash.

Definition at line 106 of file stm32_flash.hpp.

107 {
108 if (size == 0)
109 {
110 return ErrorCode::ARG_ERR;
111 }
112
113 uint32_t start_addr = base_address_ + offset;
114 uint32_t end_addr = start_addr + size;
115
116 HAL_FLASH_Unlock();
117
118 for (size_t i = 0; i < SECTOR_COUNT; ++i)
119 {
120 const auto& sector = sectors_[i];
121 if (sector.address + sector.size <= start_addr)
122 {
123 continue;
124 }
125 if (sector.address >= end_addr)
126 {
127 break;
128 }
129 FLASH_EraseInitTypeDef erase_init = {};
130
131#if defined(FLASH_TYPEERASE_PAGES) && defined(FLASH_PAGE_SIZE) // STM32F1/G4... series
132 erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
133 SetNbPages(erase_init, sector.address, i);
134 erase_init.NbPages = 1;
135 SetBanks(erase_init);
136#elif defined(FLASH_TYPEERASE_SECTORS) // STM32F4/F7/H7... series
137 erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
138 erase_init.Sector = static_cast<uint32_t>(i);
139 erase_init.NbSectors = 1;
140 erase_init.Banks = FLASH_BANK_1;
141#else
142 return ErrorCode::NOT_SUPPORT;
143#endif
144
145 uint32_t error = 0;
146 HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &error);
147 if (status != HAL_OK || error != 0xFFFFFFFFU)
148 {
149 HAL_FLASH_Lock();
150 return ErrorCode::FAILED;
151 }
152 }
153
154 HAL_FLASH_Lock();
155 return ErrorCode::OK;
156 }

◆ IsInRange()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
bool LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::IsInRange ( uint32_t addr,
size_t size ) const
inlineprivate

Definition at line 271 of file stm32_flash.hpp.

272 {
273 uint32_t end = addr + size;
274 for (size_t i = 0; i < SECTOR_COUNT; ++i)
275 {
276 const auto& s = sectors_[i];
277 if (addr >= s.address && end <= s.address + s.size)
278 {
279 return true;
280 }
281 }
282 return false;
283 }

◆ Write()

template<size_t SECTOR_COUNT, size_t START_SECTOR>
ErrorCode LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::Write ( size_t offset,
ConstRawData data )
inlineoverridevirtual

Writes data to the flash memory. 向闪存写入数据。

Parameters
offsetThe starting offset to write data. 数据写入的起始偏移地址。
dataThe data to be written. 需要写入的数据。
Returns
ErrorCode indicating success or failure. 返回操作结果的错误码。

Implements LibXR::Flash.

Definition at line 158 of file stm32_flash.hpp.

159 {
160 if (!data.addr_ || data.size_ == 0)
161 {
162 return ErrorCode::ARG_ERR;
163 }
164
165 uint32_t addr = base_address_ + offset;
166 if (!IsInRange(addr, data.size_))
167 {
168 return ErrorCode::OUT_OF_RANGE;
169 }
170
171 HAL_FLASH_Unlock();
172
173 const uint8_t* src = reinterpret_cast<const uint8_t*>(data.addr_);
174 size_t written = 0;
175
176#if defined(STM32H7) || defined(STM32H5)
177 alignas(32) uint32_t flash_word_buffer[8] = {0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
178 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
179 0xFFFFFFFFu, 0xFFFFFFFFu};
180 while (written < data.size_)
181 {
182 size_t chunk_size = LibXR::min<size_t>(min_write_size_, data.size_ - written);
183
184 std::memcpy(flash_word_buffer, src + written, chunk_size);
185
186 if (memcmp(reinterpret_cast<const uint8_t*>(addr + written), src + written,
187 chunk_size) == 0)
188 {
189 written += chunk_size;
190 continue;
191 }
192
193 if (HAL_FLASH_Program(program_type_, addr + written,
194 reinterpret_cast<uint32_t>(flash_word_buffer)) != HAL_OK)
195 {
196 HAL_FLASH_Lock();
197 return ErrorCode::FAILED;
198 }
199
200 written += chunk_size;
201 }
202
203#else
204 while (written < data.size_)
205 {
206 size_t chunk_size = LibXR::min<size_t>(min_write_size_, data.size_ - written);
207
208 if (memcmp(reinterpret_cast<const uint8_t*>(addr + written), src + written,
209 chunk_size) == 0)
210 {
211 written += chunk_size;
212 continue;
213 }
214
215 uint64_t word = 0xFFFFFFFFFFFFFFFF;
216 std::memcpy(&word, src + written, chunk_size);
217
218 if (HAL_FLASH_Program(program_type_, addr + written, word) != HAL_OK)
219 {
220 HAL_FLASH_Lock();
221 return ErrorCode::FAILED;
222 }
223
224 written += chunk_size;
225 }
226#endif
227
228 HAL_FLASH_Lock();
229 return ErrorCode::OK;
230 }
size_t min_write_size_
Minimum writable block size in bytes. 最小可写块大小(字节)。
Definition flash.hpp:36
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值

Field Documentation

◆ base_address_

template<size_t SECTOR_COUNT, size_t START_SECTOR>
uint32_t LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::base_address_
private

Definition at line 234 of file stm32_flash.hpp.

◆ program_type_

template<size_t SECTOR_COUNT, size_t START_SECTOR>
uint32_t LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::program_type_
private

Definition at line 235 of file stm32_flash.hpp.

◆ sectors_

template<size_t SECTOR_COUNT, size_t START_SECTOR>
const FlashSector* LibXR::STM32Flash< SECTOR_COUNT, START_SECTOR >::sectors_
private

Definition at line 233 of file stm32_flash.hpp.


The documentation for this class was generated from the following file: