Tutorial: PinName Configuration
Pinmap Configuration
Instead of inserting Port_name and Pin_name separately in the function argument, we can combine them as one argument.
Compare these two similar function argument. Which is easier to use?
GPIO_mode(GPIOA, 5, OUTPUT);
GPIO_mode(PA_5, OUTPUT);
We can combine PORT and PIN as one information by user-defined PinNames header file ecPinNames.h
. Here we have defined PA_0 to PC_15.
You can also define additional Port and Pins in the header file.
Examples
Usage example 1
// GPIO Mode : Input(00), Output(01), AlterFunc(10), Analog(11, reset)
void GPIO_mode(PinNames_t pinName, int mode){
// Separate port-name and pin-number from pinName
GPIO_TypeDef *Port;
unsigned int pin;
ecPinmap(pinName, &Port, &pin);
Port->MODER &= ~(3UL<<(2*pin));
Port->MODER |= mode<<(2*pin);
}
// In MAIN()
GPIO_mode(PA_5, OUTPUT);
GPIO_mode(PC_15, INPUT);
////////////////////////////////////////////////////////////////////////////////////
//
// You can also use PORT name and PIN name separately for the function argument
/*
void GPIO_mode(GPIO_TypeDef *Port, int pin, int mode){
Port->MODER &= ~(3UL<<(2*pin));
Port->MODER |= mode<<(2*pin);
}
*/
/* In MAIN()
GPIO_mode(GPIOA, 5, OUTPUT);
GPIO_mode(GPIOC, 15, INPUT);
*/
Usage example 2
Different syntax for the same result
// Option 1)
#define LED2_PIN PA_5
GPIO_mode2(LED2_PIN, OUTPUT);
// Option 2)
PinName_t ledPin=PA_5;
GPIO_mode2(ledPin, OUTPUT);
// Option 3)
unsigned int led2Pin=PA_5;
GPIO_mode2(led2Pin, OUTPUT);
PinName Header File
ecPinNames.h
#ifndef EC_PINNAMES_H
#define EC_PINNAMES_H
#include "stm32f411xe.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
PortA = 0,
PortB = 1,
PortC = 2,
PortD = 3,
PortE = 4,
PortF = 5,
PortG = 6,
PortH = 7,
PortI = 8,
PortJ = 9,
PortK = 10
} PortName_t;
typedef enum {
PA_0 = 0x00,
PA_1 = 0x01,
PA_2 = 0x02,
PA_3 = 0x03,
PA_4 = 0x04,
PA_5 = 0x05,
PA_6 = 0x06,
PA_7 = 0x07,
PA_8 = 0x08,
PA_9 = 0x09,
PA_10 = 0x0A,
PA_11 = 0x0B,
PA_12 = 0x0C,
PA_13 = 0x0D,
PA_14 = 0x0E,
PA_15 = 0x0F,
PB_0 = 0x10,
PB_1 = 0x11,
PB_2 = 0x12,
PB_3 = 0x13,
PB_4 = 0x14,
PB_5 = 0x15,
PB_6 = 0x16,
PB_7 = 0x17,
PB_8 = 0x18,
PB_9 = 0x19,
PB_10 = 0x1A,
PB_12 = 0x1C,
PB_13 = 0x1D,
PB_14 = 0x1E,
PB_15 = 0x1F,
PC_0 = 0x20,
PC_1 = 0x21,
PC_2 = 0x22,
PC_3 = 0x23,
PC_4 = 0x24,
PC_5 = 0x25,
PC_6 = 0x26,
PC_7 = 0x27,
PC_8 = 0x28,
PC_9 = 0x29,
PC_10 = 0x2A,
PC_11 = 0x2B,
PC_12 = 0x2C,
PC_13 = 0x2D,
PC_14 = 0x2E,
PC_15 = 0x2F,
PD_2 = 0x32,
PH_0 = 0x70,
PH_1 = 0x71,
// Arduino connector namings
A0 = PA_0,
A1 = PA_1,
A2 = PA_4,
A3 = PB_0,
A4 = PC_1,
A5 = PC_0,
D0 = PA_3,
D1 = PA_2,
D2 = PA_10,
D3 = PB_3,
D4 = PB_5,
D5 = PB_4,
D6 = PB_10,
D7 = PA_8,
D8 = PA_9,
D9 = PC_7,
D10 = PB_6,
D11 = PA_7,
D12 = PA_6,
D13 = PA_5,
D14 = PB_9,
D15 = PB_8,
// Not connected
NC = (int)0xFFFFFFFF
} PinName_t;
void ecPinmap(PinName_t pinName, GPIO_TypeDef **GPIOx, unsigned int *pin);
#ifdef __cplusplus
}
#endif
#endif
ecPinNames.c
#include "ecPinNames.h"
void ecPinmap(PinName_t pinName, GPIO_TypeDef **GPIOx, unsigned int *pin)
{
unsigned int pinNum= pinName & (0x000F);
*pin=pinNum;
unsigned int portNum=(pinName>>4);
if (portNum==0)
*GPIOx=GPIOA;
else if (portNum==1)
*GPIOx=GPIOB;
else if (portNum==2)
*GPIOx=GPIOC;
else if (portNum==3)
*GPIOx=GPIOD;
else if (portNum==7)
*GPIOx=GPIOH;
else
*GPIOx=GPIOA;
}
Last updated
Was this helpful?