libxr  1.0
Want to be the best embedded framework
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
12namespace LibXR
13{
14
20{
21 uint32_t address; //< 扇区起始地址 / Start address of the sector
22 uint32_t size; //< 扇区大小 / Size of the sector
23};
24
25#if defined(FLASH_BANK_2) && defined(FLASH_BANK_1)
26// NOLINTNEXTLINE
27inline uint32_t STM32FlashBankOf(uint32_t addr)
28{
29#if !defined(FLASH_BANK2_BASE)
30// NOLINTNEXTLINE
31#if defined(FLASH_BANK_SIZE)
32 const auto FLASH_BANK2_BASE = FLASH_BANK_SIZE + FLASH_BASE;
33#else
34 const auto FLASH_BANK2_BASE = 0x100000 + FLASH_BASE;
35#endif
36#endif
37 return (addr >= FLASH_BANK2_BASE) ? FLASH_BANK_2 : FLASH_BANK_1;
38}
39#elif defined(FLASH_BANK_1)
40// NOLINTNEXTLINE
41inline uint32_t STM32FlashBankOf(uint32_t) { return FLASH_BANK_1; }
42#else
43// NOLINTNEXTLINE
44inline uint32_t STM32FlashBankOf(uint32_t) { return 1; }
45#endif
46
47#ifndef __DOXYGEN__
48
49template <typename, typename = void>
50struct HasFlashPage : std::false_type
51{
52};
53
54template <typename, typename = void>
55struct HasFlashBank : std::false_type
56{
57};
58
59template <typename T>
60struct HasFlashPage<T, std::void_t<decltype(std::declval<T>().Page)>> : std::true_type
61{
62};
63
64template <typename T>
65struct HasFlashBank<T, std::void_t<decltype(std::declval<T>().Banks)>> : std::true_type
66{
67};
68
69template <typename T>
70// NOLINTNEXTLINE
71typename std::enable_if<!HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
72 uint32_t page)
73{
74 UNUSED(page);
75 init.PageAddress = addr;
76}
77
78template <typename T>
79// NOLINTNEXTLINE
80typename std::enable_if<HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
81 uint32_t page)
82{
83 UNUSED(addr);
84 init.Page = page;
85}
86
87template <typename T>
88// NOLINTNEXTLINE
89typename std::enable_if<!HasFlashBank<T>::value>::type SetBanks(T&, uint32_t)
90{
91}
92
93template <typename T>
94// NOLINTNEXTLINE
95typename std::enable_if<HasFlashBank<T>::value>::type SetBanks(T& init, uint32_t addr)
96{
97 init.Banks = STM32FlashBankOf(addr);
98}
99
100#endif
101
105class STM32Flash : public Flash
106{
107 public:
115 STM32Flash(const FlashSector* sectors, size_t sector_count, size_t start_sector);
116
123 STM32Flash(const FlashSector* sectors, size_t sector_count)
124 : STM32Flash(sectors, sector_count, sector_count - 1)
125 {
126 }
127
128 ErrorCode Erase(size_t offset, size_t size) override;
129
130 ErrorCode Write(size_t offset, ConstRawData data) override;
131
132 private:
133 const FlashSector* sectors_;
134 uint32_t base_address_;
135 uint32_t program_type_;
136 size_t sector_count_;
137
138 static constexpr uint32_t DetermineProgramType()
139 {
140#ifdef FLASH_TYPEPROGRAM_BYTE
141 return FLASH_TYPEPROGRAM_BYTE;
142#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
143 return FLASH_TYPEPROGRAM_HALFWORD;
144#elif defined(FLASH_TYPEPROGRAM_WORD)
145 return FLASH_TYPEPROGRAM_WORD;
146#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
147 return FLASH_TYPEPROGRAM_DOUBLEWORD;
148#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
149 return FLASH_TYPEPROGRAM_FLASHWORD;
150#else
151#error "No supported FLASH_TYPEPROGRAM_xxx defined"
152#endif
153 }
154
155 static constexpr size_t DetermineMinWriteSize()
156 {
157#ifdef FLASH_TYPEPROGRAM_BYTE
158 return 1;
159#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
160 return 2;
161#elif defined(FLASH_TYPEPROGRAM_WORD)
162 return 4;
163#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
164 return 8;
165#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
166 return FLASH_NB_32BITWORD_IN_FLASHWORD * 4;
167#else
168#error "No supported FLASH_TYPEPROGRAM_xxx defined"
169#endif
170 }
171
172 bool IsInRange(uint32_t addr, size_t size) const;
173};
174
175} // namespace LibXR
常量原始数据封装类。 A class for encapsulating constant raw data.
Abstract base class representing a flash memory interface. 抽象基类,表示闪存接口。
Definition flash.hpp:19
STM32Flash 通用类,构造时传入扇区列表,自动判断编程粒度。
ErrorCode Write(size_t offset, ConstRawData data) override
Writes data to the flash memory. 向闪存写入数据。
STM32Flash(const FlashSector *sectors, size_t sector_count)
STM32Flash 类,自动取最后两个扇区
STM32Flash(const FlashSector *sectors, size_t sector_count, size_t start_sector)
STM32Flash 类,构造时传入扇区列表,自动判断编程粒度。
ErrorCode Erase(size_t offset, size_t size) override
Erases a section of the flash memory. 擦除闪存的指定区域。
LibXR 命名空间
STM32Flash 通用类,构造时传入扇区列表,自动判断编程粒度。