Estoy tratando de escribir una biblioteca para mi afición y está casi lista para una prueba de humo. Lo único que me molesta es una función llamada una vez:
(Nota: todas las frases en mayúsculas son constantes de macro)
{
/////////// Interface clock enable
LCD_CTRL_PORT_CLK_EN;
LCD_DATA_PORT_CLK_EN;
//////////// Config control pins
//// pull up
LCD_CTRL_PORT->PUPDR &= ~LCD_CTRL_PORT_32BIT_MASK;
LCD_CTRL_PORT->PUPDR |= ( (0b01 << (LCD_CS_POS*2U))
| (0b01 << (LCD_RS_POS*2U))
| (0b01 << (LCD_WR_POS*2U))
| (0b01 << (LCD_RD_POS*2U))
| (0b01 << (LCD_RST_POS*2U)) );
//// set output direction
LCD_CTRL_PORT->MODER &= ~LCD_CTRL_PORT_32BIT_MASK;
LCD_CTRL_PORT->MODER |= ( (0b01 << (LCD_CS_POS*2U))
| (0b01 << (LCD_RS_POS*2U))
| (0b01 << (LCD_WR_POS*2U))
| (0b01 << (LCD_RD_POS*2U))
| (0b01 << (LCD_RST_POS*2U)) );
//// Max output speed
LCD_CTRL_PORT->OSPEEDR &= ~LCD_CTRL_PORT_32BIT_MASK;
LCD_CTRL_PORT->OSPEEDR |= ( (0b11 << (LCD_CS_POS*2U))
| (0b11 << (LCD_RS_POS*2U))
| (0b11 << (LCD_WR_POS*2U))
| (0b11 << (LCD_RD_POS*2U))
| (0b11 << (LCD_RST_POS*2U)) );
//// all control pin set HIGH (idle)
LCD_CTRL_PORT->BSRR |= (LCD_CS | LCD_RS | LCD_WR | LCD_RD | LCD_RST);
////////
//////////// Config data pins
LCD_DATA_PORT->PUPDR &= ~LCD_CTRL_PORT_32BIT_MASK;
LCD_DATA_PORT->OSPEEDR &= ~LCD_DATA_PORT_32BIT_MASK;
LCD_DATA_PORT->MODER &= ~LCD_CTRL_PORT_32BIT_MASK;
#if LCD_USE8BIT_MODE == 1
LCD_DATA_PORT->PUPDR |= ( 0x5555 << (LCD_DATAPORT_OUTPUT_OFFSET*2U) );
LCD_DATA_PORT->OSPEEDR |= ( 0xFFFF << (LCD_DATAPORT_OUTPUT_OFFSET*2U) );
LCD_DATA_PORT->MODER |= ( 0x5555 << (LCD_DATAPORT_OUTPUT_OFFSET*2U) );
LCD_DATA_PORT->BSRR = ( 0xFF << (LCD_DATAPORT_OUTPUT_OFFSET*2U) );
#else
LCD_DATA_PORT->PUPDR |= 0x55555555;
LCD_DATA_PORT->OSPEEDR |= 0xFFFFFFFF;
LCD_DATA_PORT->MODER |= 0x55555555;
LCD_DATA_PORT->BSRR = 0xFFFF;
#endif
Estoy usando True Studio y la plataforma es STM32F3. La función simplemente modifica claramente algunos registros con constantes derivadas de algunas constantes macro.
¿Pero por qué cuesta casi 1 kB de flash (en la sección .text, estoy usando el analizador de compilación de Truestudio) aunque no es muy largo? Incluso la función HAL-GPIO es 3 veces más pequeña.
Ejemplo de macro:
#define LCD_XXXX_PORT GPIOX
#define LCD_XXX GPIO_PIN_X
#define LCD_XXX_POS POSITION_VAL(LCD_XXX)