#include "stm32_matlab_gpio.h"

void __GPIO_BSRR_Sim(GPIO_TypeDef* port);

void Simulate_GPIO_BSRR(void)
{
#ifdef GPIOA
    __GPIO_BSRR_Sim(GPIOA);
#endif
#ifdef GPIOB
    __GPIO_BSRR_Sim(GPIOB);
#endif
#ifdef GPIOC
    __GPIO_BSRR_Sim(GPIOC);
#endif
#ifdef GPIOD
    __GPIO_BSRR_Sim(GPIOD);
#endif
#ifdef GPIOE
    __GPIO_BSRR_Sim(GPIOE);
#endif
#ifdef GPIOF
    __GPIO_BSRR_Sim(GPIOF);
#endif
#ifdef GPIOG
    __GPIO_BSRR_Sim(GPIOG);
#endif
#ifdef GPIOH
    __GPIO_BSRR_Sim(GPIOH);
#endif
}



void __GPIO_BSRR_Sim(GPIO_TypeDef* port)
{
    // Сохраняем значение регистра BSRR
    uint32_t bsrr = port->BSRR;

    // Нижние 16 бит — установка соответствующих битов ODR
    port->ODR |= (uint16_t)(bsrr & 0xFFFF);

    // Верхние 16 бит — сброс соответствующих битов ODR
    port->ODR &= ~(uint16_t)((bsrr >> 16) & 0xFFFF);

    // Обнуляем BSRR после обработки (в реальных STM32 он не сохраняет значение)
    port->BSRR = 0;
}