libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
stm32_flash.hpp
1#pragma once
2
3#include <algorithm>
4#include <cstdint>
5#include <cstring>
6
7#include "flash.hpp"
8#include "libxr_def.hpp"
9#include "libxr_type.hpp"
10#include "main.h"
11
12#ifdef HAL_FLASH_MODULE_ENABLED
13
14namespace LibXR
15{
16
17#if defined(FLASH_BANK_2) && defined(FLASH_BANK_1)
18// NOLINTNEXTLINE
19inline uint32_t STM32FlashBankOf(uint32_t addr)
20{
21#if !defined(FLASH_BANK2_BASE)
22// NOLINTNEXTLINE
23#if defined(FLASH_BANK_SIZE)
24 const auto FLASH_BANK2_BASE = FLASH_BANK_SIZE + FLASH_BASE;
25#else
26 const auto FLASH_BANK2_BASE = 0x100000 + FLASH_BASE;
27#endif
28#endif
29 return (addr >= FLASH_BANK2_BASE) ? FLASH_BANK_2 : FLASH_BANK_1;
30}
31#elif defined(FLASH_BANK_1)
32// NOLINTNEXTLINE
33inline uint32_t STM32FlashBankOf(uint32_t) { return FLASH_BANK_1; }
34#else
35// NOLINTNEXTLINE
36inline uint32_t STM32FlashBankOf(uint32_t) { return 1; }
37#endif
38
43// NOLINTNEXTLINE
44constexpr size_t STM32FlashMinWriteSize()
45{
46#ifdef FLASH_TYPEPROGRAM_BYTE
47 return 1;
48#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
49 return 2;
50#elif defined(FLASH_TYPEPROGRAM_WORD)
51 return 4;
52#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
53 return 8;
54#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
55 return FLASH_NB_32BITWORD_IN_FLASHWORD * 4;
56#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
57 return 16;
58#else
59#error "No supported FLASH_TYPEPROGRAM_xxx defined"
60#endif
61}
62
63#ifndef __DOXYGEN__
64
65template <typename, typename = void>
66struct HasFlashPage : std::false_type
67{
68};
69
70template <typename, typename = void>
71struct HasFlashBank : std::false_type
72{
73};
74
75template <typename T>
76struct HasFlashPage<T, std::void_t<decltype(std::declval<T>().Page)>> : std::true_type
77{
78};
79
80template <typename T>
81struct HasFlashBank<T, std::void_t<decltype(std::declval<T>().Banks)>> : std::true_type
82{
83};
84
85template <typename T>
86// NOLINTNEXTLINE
87typename std::enable_if<!HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
88 uint32_t page)
89{
90 UNUSED(page);
91 init.PageAddress = addr;
92}
93
94template <typename T>
95// NOLINTNEXTLINE
96typename std::enable_if<HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
97 uint32_t page)
98{
99 UNUSED(addr);
100 init.Page = page;
101}
102
103template <typename T>
104// NOLINTNEXTLINE
105typename std::enable_if<!HasFlashBank<T>::value>::type SetBanks(T&, uint32_t)
106{
107}
108
109template <typename T>
110// NOLINTNEXTLINE
111typename std::enable_if<HasFlashBank<T>::value>::type SetBanks(T& init, uint32_t addr)
112{
113 init.Banks = STM32FlashBankOf(addr);
114}
115
116#endif
117
137class STM32Flash : public Flash
138{
139 public:
146 static constexpr size_t MIN_WRITE_SIZE = STM32FlashMinWriteSize();
147
156 STM32Flash(const FlashRegion* regions, size_t region_count, uint32_t start_address);
157
164 STM32Flash(const FlashRegion* regions, size_t region_count);
165
166 ErrorCode Erase(size_t offset, size_t size) override;
167
168 ErrorCode Write(size_t offset, ConstRawData data) override;
169
170 private:
171 const FlashRegion* regions_;
172 uint32_t base_address_;
173 uint32_t program_type_;
174 size_t region_count_;
175
176 static constexpr uint32_t DetermineProgramType()
177 {
178#ifdef FLASH_TYPEPROGRAM_BYTE
179 return FLASH_TYPEPROGRAM_BYTE;
180#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
181 return FLASH_TYPEPROGRAM_HALFWORD;
182#elif defined(FLASH_TYPEPROGRAM_WORD)
183 return FLASH_TYPEPROGRAM_WORD;
184#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
185 return FLASH_TYPEPROGRAM_DOUBLEWORD;
186#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
187 return FLASH_TYPEPROGRAM_FLASHWORD;
188#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
189 return FLASH_TYPEPROGRAM_QUADWORD;
190#else
191#error "No supported FLASH_TYPEPROGRAM_xxx defined"
192#endif
193 }
194
195 bool IsInRange(uint32_t addr, size_t size) const;
196};
197
198} // namespace LibXR
199
200#endif
只读原始数据视图 / Immutable raw data view
抽象基类,表示闪存接口。 Abstract base class representing a flash memory interface.
Definition flash.hpp:32
STM32 闪存驱动实现 / STM32 flash driver implementation.
STM32Flash(const FlashRegion *regions, size_t region_count, uint32_t start_address)
构造闪存对象 / Construct flash object
static constexpr size_t MIN_WRITE_SIZE
最小写入单位(字节),由 HAL 的 FLASH_TYPEPROGRAM_* 宏确定;可直接作为 DatabaseRaw 的模板参数 / Minimum write unit in bytes,...
ErrorCode Write(size_t offset, ConstRawData data) override
向闪存写入数据 / Writes data to the flash memory.
ErrorCode Erase(size_t offset, size_t size) override
擦除闪存的指定区域 / Erases a section of the flash memory.
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
constexpr size_t STM32FlashMinWriteSize()
由 HAL 的 FLASH_TYPEPROGRAM_* 宏确定的最小写入单位(字节) / Minimum write unit in bytes, determined from the HAL FLA...
一段连续、大小相同的扇区 / A run of contiguous sectors of equal size
Definition flash.hpp:20