#include "stm32f1xx_hal.h" #include #include #include uint8_t gpio_status[4][64]; static uint8_t get_1st_pin_from_bitmask(uint16_t bitmask){ for(int i = 0; i < 16; i++){ if(bitmask & (1 << i)) return i; } return 0; } void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin){ uint8_t pin = get_1st_pin_from_bitmask(GPIO_Pin); gpio_status[GPIOx->index][pin] = !gpio_status[GPIOx->index][pin]; printf("toggling pin\n"); } GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin){ printf("reading pin\n"); uint8_t pin = get_1st_pin_from_bitmask(GPIO_Pin); return gpio_status[GPIOx->index][pin]; } void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState){ uint8_t pin = get_1st_pin_from_bitmask(GPIO_Pin); gpio_status[GPIOx->index][pin] = PinState; printf("writing pin\n"); } static void* tim_handler(void* arg){ TIM_HandleTypeDef* htim = arg; while(htim->started){ uint64_t delay_ps = 15625 * htim->presc * htim->period; printf("delay : %lu\n", delay_ps); usleep(delay_ps / 1000000); HAL_TIM_PeriodElapsedCallback(htim); } return NULL; } HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim){ printf("starting timer\n"); htim->started = 1; pthread_t tim_thread; pthread_create(&tim_thread, NULL, tim_handler, htim); return HAL_STATUS_OK; } HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim){ printf("stopping timer\n"); htim->started = 0; return HAL_STATUS_OK; }