// // GPIO: configure general-purpose inputs/outputs // #include "stm32f3xx_hal.h" #include "gpio.h" #define CHANGE_PERIOD_MS 100 #define CHANGE_ELAPSED (HAL_GetTick() - change_time_reset) > CHANGE_PERIOD_MS #define CHANGE_RESET change_time_reset = HAL_GetTick() // Increase on each press, and increase at a fast rate after duration elapsed of continuously holding down... somehow... static uint32_t change_time_reset = 0; // Increment/decrement unsigned variable with up/down buttons void user_input(uint16_t* to_modify) { if(CHANGE_ELAPSED) { if(!HAL_GPIO_ReadPin(SW_UP) ) { CHANGE_RESET; (*to_modify)++; } else if(!HAL_GPIO_ReadPin(SW_DOWN) && (*to_modify) > 0) { CHANGE_RESET; (*to_modify)--; } } } // Increment/decrement signed variable with up/down buttons void user_input_signed(int32_t* to_modify) { //fixme: need to cast to 16/32 bits correctly if(CHANGE_ELAPSED) { if(!HAL_GPIO_ReadPin(SW_UP) ) { CHANGE_RESET; if (*to_modify < 32768) (*to_modify)++; } else if(!HAL_GPIO_ReadPin(SW_DOWN)) { CHANGE_RESET; if (*to_modify >= -32768) (*to_modify)--; } } } // Initialize GPIOs void gpio_init(void) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO Ports Clock Enable __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); __GPIOF_CLK_ENABLE(); // Configure LED GPIO pins GPIO_InitStruct.Pin = LED_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = SW_A_Pin|SW_B_Pin|SW_C_Pin|SW_D_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(SW_C_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = SW_BTN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(SW_BTN_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); // Define startup State HAL_GPIO_WritePin(LED, 0); }