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#ifndef __DOXYGEN__
26
27template <typename, typename = void>
28struct HasFlashPage : std::false_type
29{
30};
31
32template <typename, typename = void>
33struct HasFlashBank : std::false_type
34{
35};
36
37template <typename T>
38struct HasFlashPage<T, std::void_t<decltype(std::declval<T>().Page)>> : std::true_type
39{
40};
41
42template <typename T>
43struct HasFlashBank<T, std::void_t<decltype(std::declval<T>().Banks)>> : std::true_type
44{
45};
46
47template <typename T>
48// NOLINTNEXTLINE
49typename std::enable_if<!HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
50 uint32_t page)
51{
52 UNUSED(page);
53 init.PageAddress = addr;
54}
55
56template <typename T>
57// NOLINTNEXTLINE
58typename std::enable_if<HasFlashPage<T>::value>::type SetNbPages(T& init, uint32_t addr,
59 uint32_t page)
60{
61 UNUSED(addr);
62 init.Page = page;
63}
64
65template <typename T>
66// NOLINTNEXTLINE
67typename std::enable_if<!HasFlashBank<T>::value>::type SetBanks(T& init)
68{
69 UNUSED(init);
70}
71
72template <typename T>
73// NOLINTNEXTLINE
74typename std::enable_if<HasFlashBank<T>::value>::type SetBanks(T& init)
75{
76 init.Banks = 1;
77}
78
79#endif
80
84class STM32Flash : public Flash
85{
86 public:
94 STM32Flash(const FlashSector* sectors, size_t sector_count, size_t start_sector);
95
102 STM32Flash(const FlashSector* sectors, size_t sector_count)
103 : STM32Flash(sectors, sector_count, sector_count - 1)
104 {
105 }
106
107 ErrorCode Erase(size_t offset, size_t size) override;
108
109 ErrorCode Write(size_t offset, ConstRawData data) override;
110
111 private:
112 const FlashSector* sectors_;
113 uint32_t base_address_;
114 uint32_t program_type_;
115 size_t sector_count_;
116
117 static constexpr uint32_t DetermineProgramType()
118 {
119#ifdef FLASH_TYPEPROGRAM_BYTE
120 return FLASH_TYPEPROGRAM_BYTE;
121#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
122 return FLASH_TYPEPROGRAM_HALFWORD;
123#elif defined(FLASH_TYPEPROGRAM_WORD)
124 return FLASH_TYPEPROGRAM_WORD;
125#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
126 return FLASH_TYPEPROGRAM_DOUBLEWORD;
127#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
128 return FLASH_TYPEPROGRAM_FLASHWORD;
129#else
130#error "No supported FLASH_TYPEPROGRAM_xxx defined"
131#endif
132 }
133
134 static constexpr size_t DetermineMinWriteSize()
135 {
136#ifdef FLASH_TYPEPROGRAM_BYTE
137 return 1;
138#elif defined(FLASH_TYPEPROGRAM_HALFWORD)
139 return 2;
140#elif defined(FLASH_TYPEPROGRAM_WORD)
141 return 4;
142#elif defined(FLASH_TYPEPROGRAM_DOUBLEWORD)
143 return 8;
144#elif defined(FLASH_TYPEPROGRAM_FLASHWORD)
145 return FLASH_NB_32BITWORD_IN_FLASHWORD * 4;
146#else
147#error "No supported FLASH_TYPEPROGRAM_xxx defined"
148#endif
149 }
150
151 bool IsInRange(uint32_t addr, size_t size) const;
152};
153
154} // 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 通用类,构造时传入扇区列表,自动判断编程粒度。