CARME-M4 BSP  V1.5
carme.c
Go to the documentation of this file.
1 
76 #ifdef __cplusplus
77 extern "C" {
78 #endif /* __cplusplus */
79 
80 /*----- Header-Files -------------------------------------------------------*/
81 #include <stm32f4xx.h> /* Processor STM32F407IG */
82 #include <carme.h> /* CARME Module */
83 
84 /*----- Macros -------------------------------------------------------------*/
85 #define CARME_ACTIVATE_EXT_FLASH 0
90 #define CARME_GPIO_PIN_TO_MODER(GPIO_PIN) ( \
91  ((GPIO_PIN) & GPIO_Pin_0) ? GPIO_MODER_MODER0 : /* bit 0 is set? */ \
92  ((GPIO_PIN) & GPIO_Pin_1) ? GPIO_MODER_MODER1 : /* bit 1 is set? */ \
93  ((GPIO_PIN) & GPIO_Pin_2) ? GPIO_MODER_MODER2 : /* bit 2 is set? */ \
94  ((GPIO_PIN) & GPIO_Pin_3) ? GPIO_MODER_MODER3 : /* bit 3 is set? */ \
95  ((GPIO_PIN) & GPIO_Pin_4) ? GPIO_MODER_MODER4 : /* bit 4 is set? */ \
96  ((GPIO_PIN) & GPIO_Pin_5) ? GPIO_MODER_MODER5 : /* bit 5 is set? */ \
97  ((GPIO_PIN) & GPIO_Pin_6) ? GPIO_MODER_MODER6 : /* bit 6 is set? */ \
98  ((GPIO_PIN) & GPIO_Pin_7) ? GPIO_MODER_MODER7 : /* bit 7 is set? */ \
99  ((GPIO_PIN) & GPIO_Pin_8) ? GPIO_MODER_MODER8 : /* bit 8 is set? */ \
100  ((GPIO_PIN) & GPIO_Pin_9) ? GPIO_MODER_MODER9 : /* bit 9 is set? */ \
101  ((GPIO_PIN) & GPIO_Pin_10) ? GPIO_MODER_MODER10 : /* bit 10 is set? */\
102  ((GPIO_PIN) & GPIO_Pin_11) ? GPIO_MODER_MODER11 : /* bit 11 is set? */\
103  ((GPIO_PIN) & GPIO_Pin_12) ? GPIO_MODER_MODER12 : /* bit 12 is set? */\
104  ((GPIO_PIN) & GPIO_Pin_13) ? GPIO_MODER_MODER13 : /* bit 13 is set? */\
105  ((GPIO_PIN) & GPIO_Pin_14) ? GPIO_MODER_MODER14 : /* bit 14 is set? */\
106  ((GPIO_PIN) & GPIO_Pin_15) ? GPIO_MODER_MODER15 : /* bit 15 is set? */\
107  -1) /* no bits are set */
108 
109 /*----- Data types ---------------------------------------------------------*/
110 
111 /*----- Function prototypes ------------------------------------------------*/
112 static void CARME_FSMC_Init(void);
113 static void CARME_FSMC_GPIO_Init(void);
114 static void CARME_AGPIO_Init(void);
115 static uint8_t CARME_AGPIO_GetMode(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
116 
117 /*----- Data ---------------------------------------------------------------*/
140  { GPIOI, GPIO_Pin_6, GPIO_Mode_OUT },
141  { GPIOI, GPIO_Pin_7, GPIO_Mode_OUT },
142 };
143 
144 /*----- Implementation -----------------------------------------------------*/
152 void CARME_Init(void) {
153 
154  /* Configure the RCC */
155  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
156  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
157  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
158  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
159  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
160  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
161  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
162  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
163  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
164  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
165 
166  /* DeInitialize the GPIO */
167  GPIO_DeInit(GPIOA);
168  GPIO_DeInit(GPIOB);
169  GPIO_DeInit(GPIOC);
170  GPIO_DeInit(GPIOD);
171  GPIO_DeInit(GPIOE);
172  GPIO_DeInit(GPIOF);
173  GPIO_DeInit(GPIOG);
174  GPIO_DeInit(GPIOH);
175  GPIO_DeInit(GPIOI);
176 
177  /* Initialize the AGPIO */
179 
180  /* Initialize the FSMC */
182  CARME_FSMC_Init();
183 }
184 
194 static void CARME_FSMC_GPIO_Init(void) {
195 
199  /*
200  +------------------+---------------------+--------------------+------------------+-------------------+
201  + + FSMC pins assignment +
202  +------------------+---------------------+--------------------+------------------+-------------------+
203  | PB7 <-> FSMC_NL | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
204  | | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
205  | | PD3 <-> FSMC_CLK | PE2 <-> FSMC_A23 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
206  | | PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
207  | | PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
208  | | PD6 <-> FSMC_NWAIT | PE5 <-> FSMC_A21 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
209  | | PD7 <-> FSMC_NE1 | PE6 <-> FSMC_A22 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 |
210  | | PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF13 <-> FSMC_A7 | PG10 <-> FSMC_NE3 |
211  | | PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF14 <-> FSMC_A8 | PG12 <-> FSMC_NE4 |
212  | | PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF15 <-> FSMC_A9 | PG13 <-> FSMC_A24 |
213  | | PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | | PG14 <-> FSMC_A25 |
214  | | PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 |------------------+-------------------+
215  | | PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 |
216  | | PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |
217  | | PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 |
218  | | | PE15 <-> FSMC_D12 |
219  +------------------+---------------------+--------------------+
220  */
221  CARME_Port_Pin_t CARME_FSMC_Port_Pin[] = {
222  /* Address bus */
223  { GPIOF, GPIO_Pin_0, GPIO_Mode_AF, GPIO_AF_FSMC },
224  { GPIOF, GPIO_Pin_1, GPIO_Mode_AF, GPIO_AF_FSMC },
225  { GPIOF, GPIO_Pin_2, GPIO_Mode_AF, GPIO_AF_FSMC },
226  { GPIOF, GPIO_Pin_3, GPIO_Mode_AF, GPIO_AF_FSMC },
227  { GPIOF, GPIO_Pin_4, GPIO_Mode_AF, GPIO_AF_FSMC },
228  { GPIOF, GPIO_Pin_5, GPIO_Mode_AF, GPIO_AF_FSMC },
229  { GPIOF, GPIO_Pin_12, GPIO_Mode_AF, GPIO_AF_FSMC },
230  { GPIOF, GPIO_Pin_13, GPIO_Mode_AF, GPIO_AF_FSMC },
231  { GPIOF, GPIO_Pin_14, GPIO_Mode_AF, GPIO_AF_FSMC },
232  { GPIOF, GPIO_Pin_15, GPIO_Mode_AF, GPIO_AF_FSMC },
233  { GPIOG, GPIO_Pin_0, GPIO_Mode_AF, GPIO_AF_FSMC },
234  { GPIOG, GPIO_Pin_1, GPIO_Mode_AF, GPIO_AF_FSMC },
235  { GPIOG, GPIO_Pin_2, GPIO_Mode_AF, GPIO_AF_FSMC },
236  { GPIOG, GPIO_Pin_3, GPIO_Mode_AF, GPIO_AF_FSMC },
237  { GPIOG, GPIO_Pin_4, GPIO_Mode_AF, GPIO_AF_FSMC },
238  { GPIOG, GPIO_Pin_5, GPIO_Mode_AF, GPIO_AF_FSMC },
239  { GPIOD, GPIO_Pin_11, GPIO_Mode_AF, GPIO_AF_FSMC },
240  { GPIOD, GPIO_Pin_12, GPIO_Mode_AF, GPIO_AF_FSMC },
241  { GPIOD, GPIO_Pin_13, GPIO_Mode_AF, GPIO_AF_FSMC },
242  { GPIOE, GPIO_Pin_3, GPIO_Mode_AF, GPIO_AF_FSMC },
243  { GPIOE, GPIO_Pin_4, GPIO_Mode_AF, GPIO_AF_FSMC },
244  { GPIOE, GPIO_Pin_5, GPIO_Mode_AF, GPIO_AF_FSMC },
245  { GPIOE, GPIO_Pin_6, GPIO_Mode_AF, GPIO_AF_FSMC },
246  { GPIOE, GPIO_Pin_2, GPIO_Mode_AF, GPIO_AF_FSMC },
247  { GPIOG, GPIO_Pin_13, GPIO_Mode_AF, GPIO_AF_FSMC },
248  { GPIOG, GPIO_Pin_14, GPIO_Mode_AF, GPIO_AF_FSMC },
249  /* Data bus */
250  { GPIOD, GPIO_Pin_14, GPIO_Mode_AF, GPIO_AF_FSMC },
251  { GPIOD, GPIO_Pin_15, GPIO_Mode_AF, GPIO_AF_FSMC },
252  { GPIOD, GPIO_Pin_0, GPIO_Mode_AF, GPIO_AF_FSMC },
253  { GPIOD, GPIO_Pin_1, GPIO_Mode_AF, GPIO_AF_FSMC },
254  { GPIOE, GPIO_Pin_7, GPIO_Mode_AF, GPIO_AF_FSMC },
255  { GPIOE, GPIO_Pin_8, GPIO_Mode_AF, GPIO_AF_FSMC },
256  { GPIOE, GPIO_Pin_9, GPIO_Mode_AF, GPIO_AF_FSMC },
257  { GPIOE, GPIO_Pin_10, GPIO_Mode_AF, GPIO_AF_FSMC },
258  { GPIOE, GPIO_Pin_11, GPIO_Mode_AF, GPIO_AF_FSMC },
259  { GPIOE, GPIO_Pin_12, GPIO_Mode_AF, GPIO_AF_FSMC },
260  { GPIOE, GPIO_Pin_13, GPIO_Mode_AF, GPIO_AF_FSMC },
261  { GPIOE, GPIO_Pin_14, GPIO_Mode_AF, GPIO_AF_FSMC },
262  { GPIOE, GPIO_Pin_15, GPIO_Mode_AF, GPIO_AF_FSMC },
263  { GPIOD, GPIO_Pin_8, GPIO_Mode_AF, GPIO_AF_FSMC },
264  { GPIOD, GPIO_Pin_9, GPIO_Mode_AF, GPIO_AF_FSMC },
265  { GPIOD, GPIO_Pin_10, GPIO_Mode_AF, GPIO_AF_FSMC },
266  /* Control signals */
267  { GPIOD, GPIO_Pin_7, GPIO_Mode_AF, GPIO_AF_FSMC },
268  { GPIOG, GPIO_Pin_9, GPIO_Mode_AF, GPIO_AF_FSMC },
269  { GPIOG, GPIO_Pin_10, GPIO_Mode_AF, GPIO_AF_FSMC },
270  { GPIOG, GPIO_Pin_12, GPIO_Mode_AF, GPIO_AF_FSMC },
271  { GPIOB, GPIO_Pin_7, GPIO_Mode_AF, GPIO_AF_FSMC },
272  { GPIOD, GPIO_Pin_3, GPIO_Mode_AF, GPIO_AF_FSMC },
273  { GPIOD, GPIO_Pin_4, GPIO_Mode_AF, GPIO_AF_FSMC },
274  { GPIOD, GPIO_Pin_5, GPIO_Mode_AF, GPIO_AF_FSMC },
275  { GPIOD, GPIO_Pin_6, GPIO_Mode_AF, GPIO_AF_FSMC },
276  { GPIOE, GPIO_Pin_0, GPIO_Mode_AF, GPIO_AF_FSMC },
277  { GPIOE, GPIO_Pin_1, GPIO_Mode_AF, GPIO_AF_FSMC },
278  };
279 
280  GPIO_InitTypeDef GPIO_InitStruct;
281 
282  GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
283  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
284  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
285  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
286  CARME_GPIO_Init(CARME_FSMC_Port_Pin, &GPIO_InitStruct,
287  sizeof(CARME_FSMC_Port_Pin) / sizeof(CARME_Port_Pin_t));
288 }
289 
299 static void CARME_FSMC_Init(void) {
300 
301  FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStruct;
302  FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStruct;
303 
304  /* Enable the FSMC interface clock */
305  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
306 
307  /*--- FSMC Configuration -----------------------------------------------*/
308  FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM1);
309  FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM2);
310  FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM3);
311  FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM4);
312 
313  FSMC_NORSRAMInitStruct.FSMC_ReadWriteTimingStruct =
314  &FSMC_NORSRAMTimingInitStruct;
315  FSMC_NORSRAMInitStruct.FSMC_WriteTimingStruct =
316  &FSMC_NORSRAMTimingInitStruct;
317 
318 #if CARME_ACTIVATE_EXT_FLASH
319 
339  FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 5;
340  FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 0;
341  FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 9;
342  FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0;
343  FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0;
344  FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 0;
345  FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_A;
346 
347  FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM1;
348  FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
349  FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM;
350  FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
351  FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode =
352  FSMC_BurstAccessMode_Disable;
353  FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait =
354  FSMC_AsynchronousWait_Disable;
355  FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity =
356  FSMC_WaitSignalPolarity_Low;
357  FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable;
358  FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive =
359  FSMC_WaitSignalActive_BeforeWaitState;
360  FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
361  FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
362  FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
363  FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
364  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
365  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
366 #endif /* CARME_ACTIVATE_EXT_FLASH */
367 
388  FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 5;
389  FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 0;
390  FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 9;
391  FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0;
392  FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0;
393  FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 0;
394  FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_A;
395 
396  FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM2;
397  FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
398  FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
399  FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
400  FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode =
401  FSMC_BurstAccessMode_Disable;
402  FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait =
403  FSMC_AsynchronousWait_Disable;
404  FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity =
405  FSMC_WaitSignalPolarity_Low;
406  FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable;
407  FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive =
408  FSMC_WaitSignalActive_BeforeWaitState;
409  FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
410  FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
411  FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
412  FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
413  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
414  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE);
415 
436  FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 5;
437  FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 0;
438  FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 9;
439  FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0;
440  FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0;
441  FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 0;
442  FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_A;
443 
444  FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM3;
445  FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
446  FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM;
447  FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
448  FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode =
449  FSMC_BurstAccessMode_Disable;
450  FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait =
451  FSMC_AsynchronousWait_Disable;
452  FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity =
453  FSMC_WaitSignalPolarity_Low;
454  FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable;
455  FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive =
456  FSMC_WaitSignalActive_BeforeWaitState;
457  FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
458  FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
459  FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
460  FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
461  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
462  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
463 
484  FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 1;
485  FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 8;
486  FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 15;
487  FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0;
488  FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0;
489  FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 5;
490  FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_D;
491 
492  FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM4;
493  FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
494  FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM;
495  FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
496  FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode =
497  FSMC_BurstAccessMode_Disable;
498  FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait =
499  FSMC_AsynchronousWait_Disable;
500  FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity =
501  FSMC_WaitSignalPolarity_Low;
502  FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable;
503  FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive =
504  FSMC_WaitSignalActive_BeforeWaitState;
505  FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
506  FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
507  FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
508  FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
509  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
510  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
511 }
512 
520 static void CARME_AGPIO_Init(void) {
521 
522  GPIO_InitTypeDef GPIO_InitStruct;
523 
524  /* Configure the GPIO */
525  GPIO_StructInit(&GPIO_InitStruct);
526  CARME_GPIO_Init(CARME_AGPIO_Port_Pin, &GPIO_InitStruct,
527  sizeof(CARME_AGPIO_Port_Pin) / sizeof(CARME_Port_Pin_t));
528 }
529 
540 void CARME_GPIO_Init(CARME_Port_Pin_t *pPortPinAssociation,
541  GPIO_InitTypeDef *pGPIO_InitStruct, uint8_t size) {
542 
543  uint8_t i;
544 
545  for (i = 0; i < size; i++) {
546  pGPIO_InitStruct->GPIO_Pin = pPortPinAssociation[i].GPIO_Pin;
547  pGPIO_InitStruct->GPIO_Mode = pPortPinAssociation[i].GPIO_Mode;
548  GPIO_Init(pPortPinAssociation[i].GPIOx, pGPIO_InitStruct);
549  if (pPortPinAssociation[i].GPIO_Mode == GPIO_Mode_AF) {
551  pPortPinAssociation[i].GPIOx,
552  CARME_GPIO_PIN_TO_SOURCE(pPortPinAssociation[i].GPIO_Pin),
553  pPortPinAssociation[i].GPIO_AF);
554  }
555  }
556 }
557 
567 void CARME_AGPIO_Set(uint32_t write, uint32_t mask) {
568 
569  uint8_t i;
570  BitAction BitVal;
571 
572  for (i = 0; i < sizeof(CARME_AGPIO_Port_Pin) / sizeof(CARME_Port_Pin_t);
573  i++) {
574 
575  if (mask & (1 << i)) {
576 
577  BitVal = (write & (1 << i)) ? Bit_SET : Bit_RESET;
578  GPIO_WriteBit(CARME_AGPIO_Port_Pin[i].GPIOx,
579  CARME_AGPIO_Port_Pin[i].GPIO_Pin, BitVal);
580  }
581  }
582 }
583 
592 void CARME_AGPIO_Get(uint32_t *pStatus) {
593 
594  uint8_t i;
595  uint32_t BitStatus = 0;
596 
597  for (i = 0; i < sizeof(CARME_AGPIO_Port_Pin) / sizeof(CARME_Port_Pin_t);
598  i++) {
599 
600  if (CARME_AGPIO_GetMode(CARME_AGPIO_Port_Pin[i].GPIOx,
601  CARME_AGPIO_Port_Pin[i].GPIO_Pin)
602  == GPIO_Mode_IN) {
603 
604  if (GPIO_ReadInputDataBit(CARME_AGPIO_Port_Pin[i].GPIOx,
605  CARME_AGPIO_Port_Pin[i].GPIO_Pin)
606  != Bit_RESET) {
607 
608  BitStatus |= (1 << i);
609  }
610  }
611  else if (CARME_AGPIO_GetMode(CARME_AGPIO_Port_Pin[i].GPIOx,
612  CARME_AGPIO_Port_Pin[i].GPIO_Pin)
613  == GPIO_Mode_OUT) {
614 
615  if (GPIO_ReadOutputDataBit(CARME_AGPIO_Port_Pin[i].GPIOx,
616  CARME_AGPIO_Port_Pin[i].GPIO_Pin)
617  != Bit_RESET) {
618 
619  BitStatus |= (1 << i);
620  }
621  }
622  }
623  *pStatus = BitStatus;
624 }
625 
639 static uint8_t CARME_AGPIO_GetMode(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
640 
641  uint32_t mask;
642 
643  mask = GPIOx->MODER & CARME_GPIO_PIN_TO_MODER(GPIO_Pin);
644  return mask >> 2 * CARME_GPIO_PIN_TO_SOURCE(GPIO_Pin);
645 }
646 
655 
657 }
658 
667 
669 }
670 
678 void CARME_LED_Red_Set(void) {
679 
681 }
682 
691 
693 }
694 
695 #ifdef __cplusplus
696 }
697 #endif /* __cplusplus */
698 
#define CARME_AGPIO_116
Definition: carme.h:108
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState)
Enables or disables the AHB3 peripheral clock.
#define CARME_AGPIO_93
Definition: carme.h:97
static void CARME_FSMC_Init(void)
Initialization of the FSMC. This bus is used for the connection to the CarmeIO1 and CarmeIO2 module...
Definition: carme.c:299
GPIOOType_TypeDef GPIO_OType
#define CARME_AGPIO_99
Definition: carme.h:101
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
Reads the specified input port pin.
static void CARME_FSMC_GPIO_Init(void)
Initialization of the FSMC GPIO pins. This bus is used for the connection to the extension modules...
Definition: carme.c:194
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
Enables or disables the High Speed APB (APB2) peripheral clock.
#define CARME_AGPIO_13
Definition: carme.h:92
#define CARME_AGPIO_94
Definition: carme.h:98
#define CARME_AGPIO_108
Definition: carme.h:106
#define CARME_AGPIO_102
Definition: carme.h:103
#define CARME_AGPIO_103
Definition: carme.h:104
#define CARME_GPIO_PIN_TO_MODER(GPIO_PIN)
Get the pin moder from the pin number.
Definition: carme.c:90
void GPIO_PinAFConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
Changes the mapping of the specified pin.
#define CARME_GPIO_PIN_TO_SOURCE(GPIO_PIN)
Get GPIO_PinSourcex from GPIO_Pin_x.
Definition: carme.h:149
#define CARME_AGPIO_115
Definition: carme.h:107
#define CARME_AGPIO_97
Definition: carme.h:100
GPIOSpeed_TypeDef GPIO_Speed
void CARME_LED_Red_Reset(void)
Reset the red LED on the CARME Module.
Definition: carme.c:690
static uint8_t CARME_AGPIO_GetMode(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
Get the AGPIO mode.
Definition: carme.c:639
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
Reads the specified output data port bit.
GPIOPuPd_TypeDef GPIO_PuPd
void CARME_GPIO_Init(CARME_Port_Pin_t *pPortPinAssociation, GPIO_InitTypeDef *pGPIO_InitStruct, uint8_t size)
Initialize GPIO ports with a CARME_Port_Pin_t table.
Definition: carme.c:540
void CARME_Init(void)
CARME-M4 module initialization.
Definition: carme.c:152
FSMC NOR/SRAM Init structure definition.
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct)
Fills each GPIO_InitStruct member with its default value.
CARME port and pin association structure.
Definition: carme.h:245
void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
Sets or clears the selected data port bit.
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)
Initializes the GPIOx peripheral according to the specified parameters in the GPIO_InitStruct.
void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef *FSMC_NORSRAMInitStruct)
Initializes the FSMC NOR/SRAM Banks according to the specified parameters in the FSMC_NORSRAMInitStru...
FSMC_NORSRAMTimingInitTypeDef * FSMC_ReadWriteTimingStruct
void CARME_LED_Green_Set(void)
Set the green LED on the CARME Module.
Definition: carme.c:654
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
Enables or disables the AHB1 peripheral clock.
GPIOMode_TypeDef GPIO_Mode
void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank)
De-initializes the FSMC NOR/SRAM Banks registers to their default reset values.
GPIO Init structure definition.
void CARME_AGPIO_Set(uint32_t write, uint32_t mask)
Set the AGPIO state.
Definition: carme.c:567
#define CARME_AGPIO_101
Definition: carme.h:102
#define CARME_LED_PIN_RED
Definition: carme.h:132
FSMC_NORSRAMTimingInitTypeDef * FSMC_WriteTimingStruct
#define CARME_AGPIO_21
Definition: carme.h:93
void CARME_LED_Red_Set(void)
Set the red LED on the CARME Module.
Definition: carme.c:678
void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState)
Enables or disables the specified NOR/SRAM Memory Bank.
Timing parameters For NOR/SRAM Banks.
#define CARME_LED_PIN_GREEN
Definition: carme.h:131
#define CARME_AGPIO_90
Definition: carme.h:95
#define CARME_AGPIO_22
Definition: carme.h:94
void CARME_AGPIO_Get(uint32_t *pStatus)
Get the AGPIO state.
Definition: carme.c:592
#define CARME_AGPIO_96
Definition: carme.h:99
static void CARME_AGPIO_Init(void)
CARME AGPIO initialization.
Definition: carme.c:520
BitAction
GPIO Bit SET and Bit RESET enumeration.
#define CARME_AGPIO_105
Definition: carme.h:105
#define CARME_AGPIO_9
Definition: carme.h:91
void GPIO_DeInit(GPIO_TypeDef *GPIOx)
De-initializes the GPIOx peripheral registers to their default reset values.
void CARME_LED_Green_Reset(void)
Reset the green LED on the CARME Module.
Definition: carme.c:666
#define CARME_AGPIO_91
Definition: carme.h:96
static CARME_Port_Pin_t CARME_AGPIO_Port_Pin[]
CARME AGPIO Port and Pin association.
Definition: carme.c:121