CARME-M4 BSP  V1.5
carme_io1.c
Go to the documentation of this file.
1 
84 #ifdef __cplusplus
85 extern "C" {
86 #endif /* __cplusplus */
87 
88 /*----- Header-Files -------------------------------------------------------*/
89 #include <stm32f4xx.h> /* Processor STM32F407IG */
90 #include <carme.h> /* CARME Module */
91 #include <carme_io1.h> /* CARME IO1 Module */
92 
93 /*----- Macros -------------------------------------------------------------*/
94 
95 /*----- Data types ---------------------------------------------------------*/
96 
97 /*----- Function prototypes ------------------------------------------------*/
98 
99 /*----- Data ---------------------------------------------------------------*/
103 static __IO uint8_t *LED_Port = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x200);
104 
108 static __IO uint8_t *Switch_Port = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x400);
109 
113 static __IO uint8_t *PIO_PortA = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x800);
114 
118 //static __IO uint8_t *PIO_PortB = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x808);
119 
123 static __IO uint8_t *PIO_PortC = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x810);
124 
128 static __IO uint8_t *PIO_Control = (__IO uint8_t *) (FSMC_CARME_EXTENSION1_BASE + 0x818);
129 
134  { CARME_IO1_BUTTON0_PORT, CARME_IO1_BUTTON0_PIN, GPIO_Mode_IN },
135  { CARME_IO1_BUTTON1_PORT, CARME_IO1_BUTTON1_PIN, GPIO_Mode_IN },
136  { CARME_IO1_BUTTON2_PORT, CARME_IO1_BUTTON2_PIN, GPIO_Mode_IN },
137  { CARME_IO1_BUTTON3_PORT, CARME_IO1_BUTTON3_PIN, GPIO_Mode_IN },
138 };
139 
143 static __IO uint8_t LED_Value = 0x00;
144 
148 static __IO uint8_t PortA_Value = 0x00;
149 
153 static __IO uint8_t PortC_Value = 0x00;
154 
155 /*----- Implementation -----------------------------------------------------*/
163 void CARME_IO1_Init(void) {
164 
165  GPIO_InitTypeDef GPIO_InitStruct;
166 
167  /* Initialize the GPIO */
168  GPIO_StructInit(&GPIO_InitStruct);
169  CARME_GPIO_Init(CARME_IO1_Port_Pin, &GPIO_InitStruct,
170  sizeof(CARME_IO1_Port_Pin) / sizeof(CARME_Port_Pin_t));
171 }
172 
182 void CARME_IO1_LED_Set(uint8_t write, uint8_t mask) {
183 
184  uint8_t i;
185 
186  for (i = 0; i < 8; i++) {
187 
188  if (mask & (1 << i)) {
189 
190  if (write & (1 << i)) {
191  LED_Value |= (1 << i);
192  }
193  else {
194  LED_Value &= ~(1 << i);
195  }
196  }
197  }
198  *LED_Port = LED_Value;
199 }
200 
209 void CARME_IO1_LED_Get(uint8_t *pStatus) {
210 
211  *pStatus = LED_Value;
212 }
213 
222 void CARME_IO1_SWITCH_Get(uint8_t *pStatus) {
223 
224  *pStatus = *Switch_Port;
225 }
226 
235 void CARME_IO1_BUTTON_Get(uint8_t *pStatus) {
236 
237  uint32_t agpio_state;
238  uint8_t button_state = 0;
239 
240  CARME_AGPIO_Get(&agpio_state);
241  button_state |= (agpio_state & CARME_AGPIO_PIN_99) ? 0x1 : 0; // T0
242  button_state |= (agpio_state & CARME_AGPIO_PIN_101) ? 0x2 : 0; // T1
243  button_state |= (agpio_state & CARME_AGPIO_PIN_102) ? 0x4 : 0; // T2
244  button_state |= (agpio_state & CARME_AGPIO_PIN_103) ? 0x8 : 0; // T3
245  *pStatus = button_state;
246 }
247 
256 extern void CARME_IO1_BUTTON_Interrupt(FunctionalState state) {
257 
258  EXTI_InitTypeDef EXTI_InitStruct;
259  NVIC_InitTypeDef NVIC_InitStruct;
260 
261  if (state == ENABLE) {
262  /* Enable the external interrupt */
264  CARME_GPIO_TO_EXTIPORTSOURCE(CARME_IO1_BUTTON0_PORT),
265  CARME_GPIO_TO_EXTIPINSOURCE(CARME_IO1_BUTTON0_PIN));
267  CARME_GPIO_TO_EXTIPORTSOURCE(CARME_IO1_BUTTON1_PORT),
268  CARME_GPIO_TO_EXTIPINSOURCE(CARME_IO1_BUTTON1_PIN));
270  CARME_GPIO_TO_EXTIPORTSOURCE(CARME_IO1_BUTTON2_PORT),
271  CARME_GPIO_TO_EXTIPINSOURCE(CARME_IO1_BUTTON2_PIN));
273  CARME_GPIO_TO_EXTIPORTSOURCE(CARME_IO1_BUTTON3_PORT),
274  CARME_GPIO_TO_EXTIPINSOURCE(CARME_IO1_BUTTON3_PIN));
275 
276  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
277  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
278  EXTI_InitStruct.EXTI_LineCmd = ENABLE;
279  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON0_PIN);
280  EXTI_Init(&EXTI_InitStruct);
281  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON1_PIN);
282  EXTI_Init(&EXTI_InitStruct);
283  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON2_PIN);
284  EXTI_Init(&EXTI_InitStruct);
285  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON3_PIN);
286  EXTI_Init(&EXTI_InitStruct);
287 
288  /* Enable and set EXTI Line8 Interrupt to the lowest priority */
289  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0F;
290  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0F;
291  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
292  NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
293  NVIC_Init(&NVIC_InitStruct);
294  NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
295  NVIC_Init(&NVIC_InitStruct);
296  NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
297  NVIC_Init(&NVIC_InitStruct);
298  }
299  else {
300  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
301  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
302  EXTI_InitStruct.EXTI_LineCmd = DISABLE;
303  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON0_PIN);
304  EXTI_Init(&EXTI_InitStruct);
305  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON1_PIN);
306  EXTI_Init(&EXTI_InitStruct);
307  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON2_PIN);
308  EXTI_Init(&EXTI_InitStruct);
309  EXTI_InitStruct.EXTI_Line = CARME_GPIO_TO_EXTILINE(CARME_IO1_BUTTON3_PIN);
310  EXTI_Init(&EXTI_InitStruct);
311  }
312 }
313 
323 void CARME_IO1_PIO_Write(CARME_IO1_PIO_PORT port, uint8_t data) {
324 
325  if (port == CARME_IO1_PORT_A) {
326  PortA_Value = data;
327  *PIO_PortA = PortA_Value;
328  }
329  if (port == CARME_IO1_PORT_C) {
330  PortC_Value = data;
331  *PIO_PortC = PortC_Value;
332  }
333  if (port == CARME_IO1_PORT_C_L) {
334  PortC_Value &= 0xF0;
335  PortC_Value |= (0xF & data);
336  *PIO_PortC = PortC_Value;
337  }
338  if (port == CARME_IO1_PORT_C_H) {
339  PortC_Value &= 0xF;
340  PortC_Value |= ((0xF & data) << 4);
341  *PIO_PortC = PortC_Value;
342  }
343 }
344 
354 void CARME_IO1_PIO_Read(CARME_IO1_PIO_PORT port, uint8_t *data) {
355 
356  uint8_t tmp;
357 
358  if (port == CARME_IO1_PORT_A) {
359  *data = *PIO_PortA;
360  }
361  if (port == CARME_IO1_PORT_C) {
362  *data = *PIO_PortC;
363  }
364  if (port == CARME_IO1_PORT_C_L) {
365  tmp = *PIO_PortC;
366  *data = (tmp & 0xF);
367  }
368  if (port == CARME_IO1_PORT_C_H) {
369  tmp = *PIO_PortC;
370  *data = ((tmp & 0xF0) >> 4);
371  }
372 }
373 
385 void CARME_IO1_PIO_Set(CARME_IO1_PIO_PORT port, uint8_t pio) {
386 
387  switch (port) {
388  case CARME_IO1_PORT_A:
389  PortA_Value |= (1 << pio);
390  *PIO_PortA = PortA_Value;
391  break;
392  case CARME_IO1_PORT_C_L:
393  case CARME_IO1_PORT_C_H:
394  case CARME_IO1_PORT_C:
395  PortC_Value |= (1 << pio);
396  *PIO_PortC = PortC_Value;
397  break;
398  }
399 }
400 
412 void CARME_IO1_PIO_Clear(CARME_IO1_PIO_PORT port, uint8_t pio) {
413 
414  switch (port) {
415  case CARME_IO1_PORT_A:
416  PortA_Value &= ~(1 << pio);
417  *PIO_PortA = PortA_Value;
418  break;
419  case CARME_IO1_PORT_C_L:
420  case CARME_IO1_PORT_C_H:
421  case CARME_IO1_PORT_C:
422  PortC_Value &= ~(1 << pio);
423  *PIO_PortC = PortC_Value;
424  break;
425  }
426 }
427 
440 
441  uint8_t PIO_Controlword = 0x80;
442 
443  if (cmd & CARME_IO1_PORT_A_IN) {
444  PIO_Controlword |= 0x10;
445  }
446  if (cmd & CARME_IO1_PORT_A_OUT) {
447  PIO_Controlword &= ~0x10;
448  }
449  if (cmd & CARME_IO1_PORT_C_IN) {
450  PIO_Controlword |= 0x09;
451  }
452  if (cmd & CARME_IO1_PORT_C_OUT) {
453  PIO_Controlword &= ~0x09;
454  }
455  if (cmd & CARME_IO1_PORT_C_L_IN) {
456  PIO_Controlword |= 0x01;
457  }
458  if (cmd & CARME_IO1_PORT_C_L_OUT) {
459  PIO_Controlword &= ~0x01;
460  }
461  if (cmd & CARME_IO1_PORT_C_H_IN) {
462  PIO_Controlword |= 0x08;
463  }
464  if (cmd & CARME_IO1_PORT_C_H_OUT) {
465  PIO_Controlword &= ~0x08;
466  }
467 
468  *PIO_Control = PIO_Controlword;
469 }
470 
471 #ifdef __cplusplus
472 }
473 #endif /* __cplusplus */
474 
void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
Selects the GPIO pin used as EXTI Line.
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
Initializes the NVIC peripheral according to the specified parameters in the NVIC_InitStruct.
Definition: misc.c:136
static __IO uint8_t LED_Value
CARME IO1 current led value.
Definition: carme_io1.c:143
uint8_t NVIC_IRQChannelPreemptionPriority
Definition: misc.h:61
#define CARME_AGPIO_PIN_103
Definition: carme.h:117
static __IO uint8_t * PIO_Control
Pointer to the register which controls the CARME IO1 PIO Control Value.
Definition: carme_io1.c:128
EXTIMode_TypeDef EXTI_Mode
enum _CARME_IO1_PIO_PORT CARME_IO1_PIO_PORT
This enum contains all available Ports of the PIO device.
#define FSMC_CARME_EXTENSION1_BASE
Definition: carme.h:86
void CARME_IO1_BUTTON_Get(uint8_t *pStatus)
Get the CARME IO1 button status.
Definition: carme_io1.c:235
void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct)
Initializes the EXTI peripheral according to the specified parameters in the EXTI_InitStruct.
void CARME_IO1_PIO_Read(CARME_IO1_PIO_PORT port, uint8_t *data)
Read the PIO value.
Definition: carme_io1.c:354
void CARME_IO1_PIO_Clear(CARME_IO1_PIO_PORT port, uint8_t pio)
Clears the PIO on the position of the input value. For example the input value 0x4 clears the pin nu...
Definition: carme_io1.c:412
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
enum _CARME_IO1_PIO_CONTROL CARME_IO1_PIO_CONTROL
This contains all possible commands for the PIO device.
NVIC Init Structure definition.
Definition: misc.h:54
#define CARME_AGPIO_PIN_102
Definition: carme.h:118
static CARME_Port_Pin_t CARME_IO1_Port_Pin[]
CARME IO1 Port and Pin association.
Definition: carme_io1.c:133
void CARME_IO1_PIO_Write(CARME_IO1_PIO_PORT port, uint8_t data)
Sets the PIOs in order with the input-value.
Definition: carme_io1.c:323
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct)
Fills each GPIO_InitStruct member with its default value.
uint8_t NVIC_IRQChannel
Definition: misc.h:56
void CARME_IO1_LED_Set(uint8_t write, uint8_t mask)
Set a byte to the CARME IO1 LEDs.
Definition: carme_io1.c:182
FunctionalState NVIC_IRQChannelCmd
Definition: misc.h:71
CARME port and pin association structure.
Definition: carme.h:245
EXTI Init Structure definition.
#define CARME_GPIO_TO_EXTIPINSOURCE(GPIO_PIN)
Get EXTI_PinSourcex from GPIO_Pin_x.
Definition: carme.h:186
void CARME_IO1_SWITCH_Get(uint8_t *pStatus)
Get the CARME IO1 switch status.
Definition: carme_io1.c:222
uint8_t NVIC_IRQChannelSubPriority
Definition: misc.h:66
#define CARME_AGPIO_PIN_101
Definition: carme.h:119
static __IO uint8_t PortA_Value
CARME IO1 current PortA value.
Definition: carme_io1.c:148
#define CARME_AGPIO_PIN_99
Definition: carme.h:120
GPIO Init structure definition.
static __IO uint8_t * LED_Port
Pointer to the register which controls the CARME IO1 LEDs.
Definition: carme_io1.c:103
void CARME_IO1_PIO_Set(CARME_IO1_PIO_PORT port, uint8_t pio)
Sets the PIO on the position of the input value. For example the input value 0x4 sets the pin number...
Definition: carme_io1.c:385
void CARME_IO1_BUTTON_Interrupt(FunctionalState NewState)
Set the CARME IO1 interrupt enable/disable.
Definition: carme_io1.c:256
void CARME_IO1_PIO_Control(CARME_IO1_PIO_CONTROL cmd)
Sets the PIO Control Register. This function must be called to change the Port direction.
Definition: carme_io1.c:439
static __IO uint8_t * PIO_PortA
Pointer to the register which controls the CARME IO1 PIO PortA Value.
Definition: carme_io1.c:113
static __IO uint8_t PortC_Value
CARME IO1 current PortC value.
Definition: carme_io1.c:153
EXTITrigger_TypeDef EXTI_Trigger
CARME IO1 extension module board support package.
#define CARME_GPIO_TO_EXTILINE(GPIO_PIN)
Get EXTI_Linex from GPIO_Pin_x.
Definition: carme.h:208
static __IO uint8_t * Switch_Port
Pointer to the register which controls the CARME IO1 Switchs.
Definition: carme_io1.c:108
static __IO uint8_t * PIO_PortC
Pointer to the register which controls the CARME IO1 PIO PortB Value.
Definition: carme_io1.c:123
void CARME_AGPIO_Get(uint32_t *pStatus)
Get the AGPIO state.
Definition: carme.c:592
FunctionalState EXTI_LineCmd
void CARME_IO1_Init(void)
CARME IO1 initialization.
Definition: carme_io1.c:163
#define CARME_GPIO_TO_EXTIPORTSOURCE(GPIO_PORT)
Get EXTI_PortSourceGPIOx from GPIOx.
Definition: carme.h:171
void CARME_IO1_LED_Get(uint8_t *pStatus)
Get the CARME IO1 LED status.
Definition: carme_io1.c:209