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