/** * @file hal_mock.c * @brief HAL 层 PC 模拟实现 * 在 PC 上编译运行时使用,模拟 GPIO 读写和系统时钟 * 上板时替换为真实 STM32 HAL 实现 */ #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309L #endif #include "hal_gpio.h" #include #include /* ======== 模拟 GPIO 状态 ======== */ static uint8_t g_pin_state[GPIO_PORT_COUNT][14]; /* 14 pins per port */ static uint8_t g_pin_mode[GPIO_PORT_COUNT][14]; /* ======== 模拟按键输入(测试用) ======== */ static uint8_t g_mock_button_level = 1; /* 默认未按下(高电平) */ void mock_set_button(uint8_t pressed) { g_mock_button_level = pressed ? 0 : 1; /* 低有效 */ } /* ======== HAL 实现 ======== */ void HAL_GPIO_Init(GPIO_Port_TypeDef port, GPIO_Pin_TypeDef pin, GPIO_Mode_TypeDef mode) { if (port < GPIO_PORT_COUNT) { for (int i = 0; i < 14; i++) { if (pin & (1U << i)) { g_pin_mode[port][i] = (uint8_t)mode; } } } printf("[HAL] GPIO Init: Port=%d Pin=0x%04X Mode=%d\n", port, pin, mode); } void HAL_GPIO_WritePin(GPIO_Port_TypeDef port, GPIO_Pin_TypeDef pin, GPIO_PinState_TypeDef state) { if (port < GPIO_PORT_COUNT) { for (int i = 0; i < 14; i++) { if (pin & (1U << i)) { g_pin_state[port][i] = (uint8_t)state; } } } /* 模拟 LED 输出 */ if (port == GPIO_PORT_B && (pin & GPIO_PIN_0)) { printf("[LED] %s\n", state ? "ON ■" : "OFF ·"); } } uint8_t HAL_GPIO_ReadPin(GPIO_Port_TypeDef port, GPIO_Pin_TypeDef pin) { /* 模拟按键读取 */ if (port == GPIO_PORT_A && (pin & GPIO_PIN_0)) { return g_mock_button_level; } if (port < GPIO_PORT_COUNT) { for (int i = 0; i < 14; i++) { if (pin & (1U << i)) { return g_pin_state[port][i]; } } } return 0; } void HAL_GPIO_TogglePin(GPIO_Port_TypeDef port, GPIO_Pin_TypeDef pin) { if (port < GPIO_PORT_COUNT) { for (int i = 0; i < 14; i++) { if (pin & (1U << i)) { g_pin_state[port][i] = !g_pin_state[port][i]; } } } } /* ======== 时基 ======== */ static uint32_t g_start_ms = 0; static uint32_t get_system_ms(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (uint32_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); } void HAL_Delay(uint32_t ms) { /* PC 模拟: 忙等(仅测试用) */ uint32_t start = get_system_ms(); while ((get_system_ms() - start) < ms) { /* spin */ } } uint32_t HAL_GetTick(void) { if (g_start_ms == 0) { g_start_ms = get_system_ms(); } return get_system_ms() - g_start_ms; }