/** ****************************************************************************** * @文件 main.c * @作者 阜阳师范大学物电学院 * @版本 V0.1 * @日期 2026-01-15 * @简介 DTU 屏幕按键部分的驱动程序 ****************************************************************************** **/ #include "main.h" #define TIMER 5 /* 定时器定时时间 */ #define LED_TOGGLE_TIME 1000 /* 系统运行指示灯闪烁时间,也就是亮的时间*/ volatile static uint32_t sysRunTime = 0; /* 系统运行时间计数器 */ volatile static uint8_t LED_ToggleFlag = 0; /* LED闪烁定时标志位 */ static KEY_TYPE keyStatus = KEY_NONE; /* 按键状态指示 */ static uint8_t ConnectFlg = 0; /**< 连接标志:0x01=已连接,0x00=未连接 */ /** * @brief 按键业务逻辑回调函数 * @param key_type 按键类型 */ static void Key_ProcessCallback(KEY_TYPE key_type) { // IntValue_Printf(2, 32, key_type, RESET); BackLight_ON(); /* 任意按键按下,都打开背光 */ keyStatus = key_type; /* 更新按键状态 */ } int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ LED_Init(); /* LED灯初始化 */ Key_Init(); /* 初始化按键驱动 */ WDog_Init(); /* 看门狗初始化 */ RS485_DMA_init(); /* Rs485初始化 */ LcdInit(); Process_Init(); /* 通信任务初始化 */ NL_LOGO_Printf(); /* 显示存储的LOGO */ gtim_timx_int_init(50-1, 7200-1); /* 定时5毫秒 */ // 注册按键业务逻辑回调函数 Key_RegisterCallback(Key_ProcessCallback); /* 注册按键回调函数 */ while(1) { if(ConnectFlg == 1) { /* 指示灯闪烁 */ if(LED_ToggleFlag == 1) { LED_ToggleFlag = 0; LED_Toggle(LED_RUN); } } ConnectFlg = RS485_Process(keyStatus, ConnectFlg); keyStatus = KEY_NONE; /*系统运行超过一定时间立即复位重启*/ if(sysRunTime > 1000000) { HAL_NVIC_SystemReset(); /* 系统立即复位 */ sysRunTime = 0; } } } /** * @brief 定时器中断服务函数 * @param 无 * @retval 无 */ void GTIM_TIMX_INT_IRQHandler(void) { /*直接通过判断中断标志位来处理中断 */ if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET) { sysRunTime++; if(sysRunTime % (LED_TOGGLE_TIME / 5) == 0) { LED_ToggleFlag = 1; } Button_Ticks(); /* 按键检测 */ Clear_Watchdog(); /* 看门狗喂狗 */ BackLight_Close(); /* 背光关闭检测 */ Process_Count(); /* 通信任务处理计数器 */ } __HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE); /* 清楚定时器溢出中断 */ }