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 const auto FLASH_BANK2_BASE = FLASH_BANK_SIZE + FLASH_BASE;
32#endif
33 return (addr >= FLASH_BANK2_BASE) ? FLASH_BANK_2 : FLASH_BANK_1;
34}
35#elif defined(FLASH_BANK_1)
36// NOLINTNEXTLINE
37inline uint32_t STM32FlashBankOf(uint32_t) { return FLASH_BANK_1; }
38#else
39// NOLINTNEXTLINE
40inline uint32_t STM32FlashBankOf(uint32_t) { return 1; }
41#endif
42
43#ifndef __DOXYGEN__
44
45template <typename, typename = void>
46struct HasFlashPage : std::false_type
47{
48};
49
50template <typename, typename = void>
51struct HasFlashBank : std::false_type
52{
53};
54
55template <typename T>
56struct HasFlashPage<T, std::void_t<decltype(std::declval<T>().Page)>> : std::true_type
57{
58};
59
60template <typename T>
61struct HasFlashBank<T, std::void_t<decltype(std::declval<T>().Banks)>> : std::true_type
62{
63};
64
65template <typename T>
66// NOLINTNEXTLINE
67typename std::enable_if<!HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
68 uint32_t page)
69{
70 UNUSED(page);
71 init.PageAddress = addr;
72}
73
74template <typename T>
75// NOLINTNEXTLINE
76typename std::enable_if<HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
77 uint32_t page)
78{
79 UNUSED(addr);
80 init.Page = page;
81}
82
83template <typename T>
84// NOLINTNEXTLINE
85typename std::enable_if<!HasFlashBank<T>::value>::type SetBanks(T&, uint32_t)
86{
87}
88
89template <typename T>
90// NOLINTNEXTLINE
91typename std::enable_if<HasFlashBank<T>::value>::type SetBanks(T& init, uint32_t addr)
92{
93 init.Banks = STM32FlashBankOf(addr);
94}
95
96#endif
97
101class STM32Flash : public Flash
102{
103 public:
111 STM32Flash(const FlashSector* sectors, size_t sector_count, size_t start_sector);
112
119 STM32Flash(const FlashSector* sectors, size_t sector_count)
120 : STM32Flash(sectors, sector_count, sector_count - 1)
121 {
122 }
123
124 ErrorCode Erase(size_t offset, size_t size) override;
125
126 ErrorCode Write(size_t offset, ConstRawData data) override;
127
128 private:
129 const FlashSector* sectors_;
130 uint32_t base_address_;
131 uint32_t program_type_;
132 size_t sector_count_;
133
134 static constexpr uint32_t DetermineProgramType()
135 {
136#ifdef FLASH_TYPEPROGRAM_BYTE
137 return FLASH_TYPEPROGRAM_BYTE;
138#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
139 return FLASH_TYPEPROGRAM_HALFWORD;
140#elif defined(FLASH_TYPEPROGRAM_WORD)
141 return FLASH_TYPEPROGRAM_WORD;
142#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
143 return FLASH_TYPEPROGRAM_DOUBLEWORD;
144#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
145 return FLASH_TYPEPROGRAM_FLASHWORD;
146#else
147#error "No supported FLASH_TYPEPROGRAM_xxx defined"
148#endif
149 }
150
151 static constexpr size_t DetermineMinWriteSize()
152 {
153#ifdef FLASH_TYPEPROGRAM_BYTE
154 return 1;
155#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
156 return 2;
157#elif defined(FLASH_TYPEPROGRAM_WORD)
158 return 4;
159#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
160 return 8;
161#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
162 return FLASH_NB_32BITWORD_IN_FLASHWORD * 4;
163#else
164#error "No supported FLASH_TYPEPROGRAM_xxx defined"
165#endif
166 }
167
168 bool IsInRange(uint32_t addr, size_t size) const;
169};
170
171} // 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 命名空间
Definition ch32_gpio.hpp:9
STM32Flash 通用类,构造时传入扇区列表,自动判断编程粒度。