@@ -37,50 +37,61 @@ LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD;
37
37
38
38
void TFT_FSMC::init () {
39
39
uint32_t controllerAddress;
40
- FSMC_NORSRAM_TimingTypeDef timing, extTiming;
40
+ FMC_OR_FSMC (NORSRAM_TimingTypeDef) timing, extTiming;
41
41
42
42
uint32_t nsBank = (uint32_t )pinmap_peripheral (digitalPinToPinName (TFT_CS_PIN), pinMap_FSMC_CS);
43
43
44
44
// Perform the SRAM1 memory initialization sequence
45
- SRAMx.Instance = FSMC_NORSRAM_DEVICE;
46
- SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
45
+ SRAMx.Instance = FMC_OR_FSMC (NORSRAM_DEVICE);
46
+ SRAMx.Extended = FMC_OR_FSMC (NORSRAM_EXTENDED_DEVICE);
47
+
47
48
// SRAMx.Init
48
49
SRAMx.Init .NSBank = nsBank;
49
- SRAMx.Init .DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
50
- SRAMx.Init .MemoryType = FSMC_MEMORY_TYPE_SRAM;
51
- SRAMx.Init .MemoryDataWidth = TERN (TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
52
- SRAMx.Init .BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
53
- SRAMx.Init .WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
54
- SRAMx.Init .WrapMode = FSMC_WRAP_MODE_DISABLE;
55
- SRAMx.Init .WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
56
- SRAMx.Init .WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
57
- SRAMx.Init .WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
58
- SRAMx.Init .ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
59
- SRAMx.Init .AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
60
- SRAMx.Init .WriteBurst = FSMC_WRITE_BURST_DISABLE;
61
- #ifdef STM32F4xx
62
- SRAMx.Init .PageSize = FSMC_PAGE_SIZE_NONE;
50
+ SRAMx.Init .DataAddressMux = FMC_OR_FSMC (DATA_ADDRESS_MUX_DISABLE);
51
+ SRAMx.Init .MemoryType = FMC_OR_FSMC (MEMORY_TYPE_SRAM);
52
+ #ifdef STM32F446xx
53
+ SRAMx.Init .MemoryDataWidth = TERN (TFT_INTERFACE_FMC_8BIT, FMC_NORSRAM_MEM_BUS_WIDTH_8, FMC_NORSRAM_MEM_BUS_WIDTH_16);
54
+ #else
55
+ SRAMx.Init .MemoryDataWidth = TERN (TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
56
+ #endif
57
+ SRAMx.Init .BurstAccessMode = FMC_OR_FSMC (BURST_ACCESS_MODE_DISABLE);
58
+ SRAMx.Init .WaitSignalPolarity = FMC_OR_FSMC (WAIT_SIGNAL_POLARITY_LOW);
59
+ SRAMx.Init .WrapMode = FMC_OR_FSMC (WRAP_MODE_DISABLE);
60
+ SRAMx.Init .WaitSignalActive = FMC_OR_FSMC (WAIT_TIMING_BEFORE_WS);
61
+ SRAMx.Init .WriteOperation = FMC_OR_FSMC (WRITE_OPERATION_ENABLE);
62
+ SRAMx.Init .WaitSignal = FMC_OR_FSMC (WAIT_SIGNAL_DISABLE);
63
+ SRAMx.Init .ExtendedMode = FMC_OR_FSMC (EXTENDED_MODE_ENABLE);
64
+ SRAMx.Init .AsynchronousWait = FMC_OR_FSMC (ASYNCHRONOUS_WAIT_DISABLE);
65
+ SRAMx.Init .WriteBurst = FMC_OR_FSMC (WRITE_BURST_DISABLE);
66
+ #if defined(STM32F446xx) || defined(STM32F4xx)
67
+ SRAMx.Init .PageSize = FMC_OR_FSMC (PAGE_SIZE_NONE);
63
68
#endif
69
+
64
70
// Read Timing - relatively slow to ensure ID information is correctly read from TFT controller
65
- // Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss
66
- timing.AddressSetupTime = 15 ;
67
- timing.AddressHoldTime = 15 ;
68
- timing.DataSetupTime = 24 ;
69
- timing.BusTurnAroundDuration = 0 ;
70
- timing.CLKDivision = 16 ;
71
- timing.DataLatency = 17 ;
72
- timing.AccessMode = FSMC_ACCESS_MODE_A;
71
+ // Can be decreased from 15-15-24 to 4-4-8 with risk of stability loss
72
+ timing.AddressSetupTime = 15 ;
73
+ timing.AddressHoldTime = 15 ;
74
+ timing.DataSetupTime = 24 ;
75
+ timing.BusTurnAroundDuration = 0 ;
76
+ timing.CLKDivision = 16 ;
77
+ timing.DataLatency = 17 ;
78
+ timing.AccessMode = FMC_OR_FSMC (ACCESS_MODE_A);
79
+
73
80
// Write Timing
74
81
// Can be decreased from 8-15-8 to 0-0-1 with risk of stability loss
75
- extTiming.AddressSetupTime = 8 ;
76
- extTiming.AddressHoldTime = 15 ;
77
- extTiming.DataSetupTime = 8 ;
78
- extTiming.BusTurnAroundDuration = 0 ;
79
- extTiming.CLKDivision = 16 ;
80
- extTiming.DataLatency = 17 ;
81
- extTiming.AccessMode = FSMC_ACCESS_MODE_A;
82
-
83
- __HAL_RCC_FSMC_CLK_ENABLE ();
82
+ extTiming.AddressSetupTime = 8 ;
83
+ extTiming.AddressHoldTime = 15 ;
84
+ extTiming.DataSetupTime = 8 ;
85
+ extTiming.BusTurnAroundDuration = 0 ;
86
+ extTiming.CLKDivision = 16 ;
87
+ extTiming.DataLatency = 17 ;
88
+ extTiming.AccessMode = FMC_OR_FSMC (ACCESS_MODE_A);
89
+
90
+ #ifdef STM32F446xx
91
+ __HAL_RCC_FMC_CLK_ENABLE ();
92
+ #else
93
+ __HAL_RCC_FSMC_CLK_ENABLE ();
94
+ #endif
84
95
85
96
for (uint16_t i = 0 ; pinMap_FSMC[i].pin != NC; i++)
86
97
pinmap_pinout (pinMap_FSMC[i].pin , pinMap_FSMC);
@@ -90,59 +101,54 @@ void TFT_FSMC::init() {
90
101
controllerAddress = FSMC_BANK1_1;
91
102
#ifdef PF0
92
103
switch (nsBank) {
93
- case FSMC_NORSRAM_BANK2 : controllerAddress = FSMC_BANK1_2 ; break ;
94
- case FSMC_NORSRAM_BANK3 : controllerAddress = FSMC_BANK1_3 ; break ;
95
- case FSMC_NORSRAM_BANK4 : controllerAddress = FSMC_BANK1_4 ; break ;
104
+ case FMC_OR_FSMC (NORSRAM_BANK2) : controllerAddress = FSMC_BANK1_2; break ;
105
+ case FMC_OR_FSMC (NORSRAM_BANK3) : controllerAddress = FSMC_BANK1_3; break ;
106
+ case FMC_OR_FSMC (NORSRAM_BANK4) : controllerAddress = FSMC_BANK1_4; break ;
96
107
}
97
108
#endif
98
109
99
110
controllerAddress |= (uint32_t )pinmap_peripheral (digitalPinToPinName (TFT_RS_PIN), pinMap_FSMC_RS);
100
111
101
112
HAL_SRAM_Init (&SRAMx, &timing, &extTiming);
102
113
114
+ __HAL_RCC_DMA2_CLK_ENABLE ();
115
+
103
116
#ifdef STM32F1xx
104
- __HAL_RCC_DMA1_CLK_ENABLE ();
105
- DMAtx.Instance = DMA1_Channel1;
117
+ DMAtx.Instance = DMA2_Channel1;
106
118
#elif defined(STM32F4xx)
107
- __HAL_RCC_DMA2_CLK_ENABLE ();
108
- DMAtx.Instance = DMA2_Stream0;
109
- DMAtx.Init .Channel = DMA_CHANNEL_0;
110
- DMAtx.Init .FIFOMode = DMA_FIFOMODE_ENABLE;
111
- DMAtx.Init .FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
112
- DMAtx.Init .MemBurst = DMA_MBURST_SINGLE;
113
- DMAtx.Init .PeriphBurst = DMA_PBURST_SINGLE;
119
+ DMAtx.Instance = DMA2_Stream0;
120
+ DMAtx.Init .Channel = DMA_CHANNEL_0;
121
+ DMAtx.Init .FIFOMode = DMA_FIFOMODE_ENABLE;
122
+ DMAtx.Init .FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
123
+ DMAtx.Init .MemBurst = DMA_MBURST_SINGLE;
124
+ DMAtx.Init .PeriphBurst = DMA_PBURST_SINGLE;
114
125
#endif
115
126
116
- DMAtx.Init .Direction = DMA_MEMORY_TO_MEMORY;
117
- DMAtx.Init .MemInc = DMA_MINC_DISABLE;
118
- DMAtx.Init .PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
119
- DMAtx.Init .MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
120
- DMAtx.Init .Mode = DMA_NORMAL;
121
- DMAtx.Init .Priority = DMA_PRIORITY_HIGH;
127
+ DMAtx.Init .Direction = DMA_MEMORY_TO_MEMORY;
128
+ DMAtx.Init .MemInc = DMA_MINC_DISABLE;
129
+ DMAtx.Init .PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
130
+ DMAtx.Init .MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
131
+ DMAtx.Init .Mode = DMA_NORMAL;
132
+ DMAtx.Init .Priority = DMA_PRIORITY_HIGH;
122
133
123
134
LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress;
124
135
}
125
136
126
137
uint32_t TFT_FSMC::getID () {
127
- uint32_t id;
128
138
writeReg (0 );
129
- id = LCD->RAM ;
130
-
131
- if (id == 0 )
132
- id = readID (LCD_READ_ID);
133
- if ((id & 0xFFFF ) == 0 || (id & 0xFFFF ) == 0xFFFF )
134
- id = readID (LCD_READ_ID4);
139
+ uint32_t id = LCD->RAM ;
140
+ if (id == 0 ) id = readID (LCD_READ_ID);
141
+ if ((id & 0xFFFF ) == 0 || (id & 0xFFFF ) == 0xFFFF ) id = readID (LCD_READ_ID4);
135
142
return id;
136
143
}
137
144
138
- uint32_t TFT_FSMC::readID (const tft_data_t inReg) {
139
- uint32_t id;
145
+ uint32_t TFT_FSMC::readID (tft_data_t inReg) {
140
146
writeReg (inReg);
141
- id = LCD->RAM ; // dummy read
147
+ uint32_t id = LCD->RAM ; // dummy read
142
148
id = inReg << 24 ;
143
149
id |= (LCD->RAM & 0x00FF ) << 16 ;
144
150
id |= (LCD->RAM & 0x00FF ) << 8 ;
145
- id |= LCD->RAM & 0x00FF ;
151
+ id |= ( LCD->RAM & 0x00FF ) ;
146
152
return id;
147
153
}
148
154
@@ -155,7 +161,9 @@ bool TFT_FSMC::isBusy() {
155
161
#define __IS_DMA_CONFIGURED (__HANDLE__ ) ((__HANDLE__)->Instance->PAR != 0 )
156
162
#endif
157
163
158
- if (!__IS_DMA_CONFIGURED (&DMAtx)) return false ;
164
+ #ifdef __IS_DMA_CONFIGURED
165
+ if (!__IS_DMA_CONFIGURED (&DMAtx)) return false ;
166
+ #endif
159
167
160
168
// Check if DMA transfer error or transfer complete flags are set
161
169
if ((__HAL_DMA_GET_FLAG (&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX (&DMAtx)) == 0 ) && (__HAL_DMA_GET_FLAG (&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX (&DMAtx)) == 0 )) return true ;
@@ -174,8 +182,6 @@ void TFT_FSMC::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t cou
174
182
DMAtx.Init .PeriphInc = memoryIncrease;
175
183
HAL_DMA_Init (&DMAtx);
176
184
HAL_DMA_Start (&DMAtx, (uint32_t )data, (uint32_t )&(LCD->RAM ), count);
177
-
178
- TERN_ (TFT_SHARED_IO, while (isBusy ()));
179
185
}
180
186
181
187
void TFT_FSMC::transmit (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
0 commit comments