pse-uisim/stm32f1xx_hal.c
2023-09-13 18:09:37 +02:00

54 lines
1.5 KiB
C

#include "stm32f1xx_hal.h"
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
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;
}