Skip to content

Commit 712e8b7

Browse files
committed
replaced private vars with structs stored in class
1 parent e97f649 commit 712e8b7

2 files changed

Lines changed: 47 additions & 85 deletions

File tree

include/core/io/FMC.hpp

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
#ifndef EVT_FMC_HPP
22
#define EVT_FMC_HPP
33

4-
#ifdef __cplusplus
5-
6-
extern "C" {
7-
#endif
8-
4+
#ifdef STM32F4xx
95
#include "HALf4/stm32f4xx_hal.h"
106
#include "HALf4/stm32f4xx_ll_fmc.h"
117
#include "HALf4/stm32f4xx_hal_sdram.h"
12-
13-
#ifdef __cplusplus
14-
}
8+
#else
9+
#include "HALf3/stm32f3xx_hal.h"
10+
#include "HALf3/stm32f3xx_ll_fmc.h"
11+
#include "HALf3/stm32f3xx_hal_sdram.h"
1512
#endif
1613

14+
1715
#define SDRAM_TIMEOUT (0x0000FFFFUL)
1816

1917
typedef struct {
@@ -79,7 +77,7 @@ typedef FMC_GPIO FMC_CMD;
7977
// #define FMC_ ((GPIO) {GPIO_PIN_x, GPIOx})
8078

8179
#define SDRAM_CLK_SPEED ((uint32_t)(HAL_RCC_GetSysClockFreq() / 2))
82-
#define SDRAM_CLK_PERIOD_US (1000000000UL / (SDRAM_CLK_SPEED / 1000)) // LOSES SOME RESOLUTION, BUT ITS NEEDED TO FIT WITHIN 32-BITS
80+
#define SDRAM_CLK_PERIOD_US (1000000000UL / (SDRAM_CLK_SPEED / 1000)) // LOSES SOME RESOLUTION, BUT IT'S NEEDED TO FIT WITHIN 32-BITS
8381
#define NS_TO_SDRAM_CLK_CYCLES(NS) ((NS * 1000 + SDRAM_CLK_PERIOD_US) / (SDRAM_CLK_PERIOD_US))
8482

8583
// All of these can be found in the datasheet of the Ram chip
@@ -179,15 +177,15 @@ class FMC {
179177
* Structure to hold an array of GPIO byte enable pins for the FMC
180178
*/
181179
struct FMCByteEnablePins {
182-
FMC_BE* pins;
180+
FMC_BE *pins;
183181
uint8_t count;
184182
};
185183

186184
/**
187185
* Structure to hold an array of GPIO bank pins for the FMC
188186
*/
189187
struct FMCBankPins {
190-
FMC_BANK* pins;
188+
FMC_BANK *pins;
191189
uint8_t count;
192190
};
193191

@@ -224,7 +222,7 @@ class FMC {
224222
*
225223
* @param[in] offset Byte offset from the SDRAM base address
226224
*/
227-
uint32_t read32(uint32_t offset) const;
225+
[[nodiscard]] uint32_t read32(uint32_t offset) const;
228226

229227
private:
230228
/**
@@ -242,32 +240,13 @@ class FMC {
242240
*/
243241
void InitPinGroup(const FMC_GPIO* pins, uint8_t count);
244242

245-
246-
247-
FMC_SDRAM_TypeDef sdramDevice;
248-
uint32_t sdBank;
249-
uint32_t columnBitsNumber;
250-
uint32_t rowBitsNumber;
251-
uint32_t memoryDataWidth;
252-
uint32_t internalBankNumber;
253-
uint32_t casLatency;
254-
uint32_t writeProtection;
255-
uint32_t sdClockPeriod;
256-
uint32_t readBurst;
257-
uint32_t readPipeDelay;
258-
259-
uint32_t loadToActiveDelay;
260-
uint32_t exitSelfRefreshDelay;
261-
uint32_t selfRefreshTime;
262-
uint32_t rowCycleDelay;
263-
uint32_t writeRecoveryTime;
264-
uint32_t rpDelay;
265-
uint32_t rcdDelay;
243+
SdramInitConfig sdramInitConfig;
244+
SdramTimingConfig sdramTimingConfig;
266245

267246
SDRAM_HandleTypeDef sdram;
268247
FMC_SDRAM_TimingTypeDef sdramTiming;
269248

270-
uint32_t baseAddress; //address to read and write to
249+
uint32_t sdramMemoryAddress; //address to read and write to
271250
};
272251

273252
}

src/core/io/FMC.cpp

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,64 @@
22

33
namespace core::io {
44

5-
FMC::FMC(const FMCPinConfig& pin_config, const SdramInitConfig& sdramInitConfig, const SdramTimingConfig& sdramTimingConfig) :
6-
sdramDevice(*sdramInitConfig.sdramDevice),
7-
sdBank(sdramInitConfig.sdBank),
8-
columnBitsNumber(sdramInitConfig.columnBitsNumber),
9-
rowBitsNumber(sdramInitConfig.rowBitsNumber),
10-
memoryDataWidth(sdramInitConfig.memoryDataWidth),
11-
internalBankNumber(sdramInitConfig.internalBankNumber),
12-
casLatency(sdramInitConfig.casLatency),
13-
writeProtection(sdramInitConfig.writeProtection),
14-
sdClockPeriod(sdramInitConfig.sdClockPeriod),
15-
readBurst(sdramInitConfig.readBurst),
16-
readPipeDelay(sdramInitConfig.readPipeDelay),
17-
loadToActiveDelay(sdramTimingConfig.loadToActiveDelay),
18-
exitSelfRefreshDelay(sdramTimingConfig.exitSelfRefreshDelay),
19-
selfRefreshTime(sdramTimingConfig.selfRefreshTime),
20-
rowCycleDelay(sdramTimingConfig.rowCycleDelay),
21-
writeRecoveryTime(sdramTimingConfig.writeRecoveryTime),
22-
rpDelay(sdramTimingConfig.rpDelay),
23-
rcdDelay(sdramTimingConfig.rcdDelay) {
24-
InitHardware(pin_config);
25-
26-
sdram = {0};
27-
sdramTiming = {0};
5+
FMC::FMC(const FMCPinConfig& pinConfig, const SdramInitConfig& sdramInitConfig, const SdramTimingConfig& sdramTimingConfig) :
6+
sdramInitConfig(sdramInitConfig),
7+
sdramTimingConfig(sdramTimingConfig),
8+
sdram({nullptr}),
9+
sdramTiming({0}) {
10+
InitHardware(pinConfig);
2811

2912
// map the class init structs to the hal structs
3013
sdram.Instance = sdramInitConfig.sdramDevice;
3114
sdram.Init.SDBank = sdramInitConfig.sdBank;
32-
sdram.Init.ColumnBitsNumber = columnBitsNumber;
33-
sdram.Init.RowBitsNumber = rowBitsNumber;
34-
sdram.Init.MemoryDataWidth = memoryDataWidth;
35-
sdram.Init.InternalBankNumber = internalBankNumber;
36-
sdram.Init.WriteProtection = writeProtection;
37-
sdram.Init.ReadBurst = readBurst;
38-
sdram.Init.ReadPipeDelay = readPipeDelay;
39-
40-
sdramTiming.LoadToActiveDelay = loadToActiveDelay;
41-
sdramTiming.ExitSelfRefreshDelay = exitSelfRefreshDelay;
42-
sdramTiming.SelfRefreshTime = selfRefreshTime;
43-
sdramTiming.RowCycleDelay = rowCycleDelay;
44-
sdramTiming.WriteRecoveryTime = writeRecoveryTime;
45-
sdramTiming.RPDelay = rpDelay;
46-
sdramTiming.RCDDelay = rcdDelay;
15+
sdram.Init.ColumnBitsNumber = sdramInitConfig.columnBitsNumber;
16+
sdram.Init.RowBitsNumber = sdramInitConfig.rowBitsNumber;
17+
sdram.Init.MemoryDataWidth = sdramInitConfig.memoryDataWidth;
18+
sdram.Init.InternalBankNumber = sdramInitConfig.internalBankNumber;
19+
sdram.Init.WriteProtection = sdramInitConfig.writeProtection;
20+
sdram.Init.ReadBurst = sdramInitConfig.readBurst;
21+
sdram.Init.ReadPipeDelay = sdramInitConfig.readPipeDelay;
22+
23+
sdramTiming.LoadToActiveDelay = sdramTimingConfig.loadToActiveDelay;
24+
sdramTiming.ExitSelfRefreshDelay = sdramTimingConfig.exitSelfRefreshDelay;
25+
sdramTiming.SelfRefreshTime = sdramTimingConfig.selfRefreshTime;
26+
sdramTiming.RowCycleDelay = sdramTimingConfig.rowCycleDelay;
27+
sdramTiming.WriteRecoveryTime = sdramTimingConfig.writeRecoveryTime;
28+
sdramTiming.RPDelay = sdramTimingConfig.rpDelay;
29+
sdramTiming.RCDDelay = sdramTimingConfig.rcdDelay;
4730

4831
HAL_SDRAM_Init(&sdram, &sdramTiming);
4932

50-
if (sdBank == FMC_SDRAM_BANK1)
51-
baseAddress = 0xC0000000;
33+
if (sdramInitConfig.sdBank == FMC_SDRAM_BANK1) //determine read write memory address
34+
sdramMemoryAddress = 0xC0000000;
5235
else
53-
baseAddress = 0xD0000000;
36+
sdramMemoryAddress = 0xD0000000;
5437
}
5538

5639
void FMC::write32(uint32_t offset, uint32_t value) const
5740
{
58-
volatile uint32_t* ptr =
59-
reinterpret_cast<volatile uint32_t*>(baseAddress + offset);
41+
volatile auto* ptr =
42+
reinterpret_cast<volatile uint32_t*>(sdramMemoryAddress + offset);
6043

6144
*ptr = value;
6245
}
6346

6447
uint32_t FMC::read32(uint32_t offset) const
6548
{
66-
volatile uint32_t* ptr =
67-
reinterpret_cast<volatile uint32_t*>(baseAddress + offset);
49+
volatile auto* ptr =
50+
reinterpret_cast<volatile uint32_t*>(sdramMemoryAddress + offset);
6851

6952
return *ptr;
7053
}
7154

72-
void FMC::InitHardware(const FMCPinConfig& pin_config) {
55+
void FMC::InitHardware(const FMCPinConfig& pinConfig) {
7356
__HAL_RCC_FMC_CLK_ENABLE();
7457

75-
InitPinGroup(pin_config.address.pins, pin_config.address.count);
76-
InitPinGroup(pin_config.data.pins, pin_config.data.count);
77-
InitPinGroup(pin_config.byteEnable.pins, pin_config.byteEnable.count);
78-
InitPinGroup(pin_config.bank.pins, pin_config.bank.count);
79-
InitPinGroup(pin_config.command.pins, pin_config.command.count);
58+
InitPinGroup(pinConfig.address.pins, pinConfig.address.count);
59+
InitPinGroup(pinConfig.data.pins, pinConfig.data.count);
60+
InitPinGroup(pinConfig.byteEnable.pins, pinConfig.byteEnable.count);
61+
InitPinGroup(pinConfig.bank.pins, pinConfig.bank.count);
62+
InitPinGroup(pinConfig.command.pins, pinConfig.command.count);
8063
}
8164

8265
void FMC::InitPinGroup(const FMC_GPIO* pins, uint8_t count) {

0 commit comments

Comments
 (0)