调试key LCD rs485都正常运行,修复了bug,但是DMA接收的问题没有解决

This commit is contained in:
2026-01-26 15:48:15 +08:00
parent 2b93c00a16
commit f9f0016f69
14 changed files with 1600 additions and 3523 deletions

View File

@@ -18,21 +18,13 @@
#include "main.h"
/* ============================================================================
* 宏定义
* ============================================================================ */
#define TIMER 5 /**< 定时器周期(毫秒) */
#define LED_TOGGLE_TIME 1000 /**< 系统运行指示灯闪烁周期(毫秒),即 LED 点亮持续时间 */
/* ============================================================================
* 全局变量定义
* ============================================================================ */
volatile static uint32_t sysRunTime = 0; /**< 系统运行时间计数器单位5ms */
volatile static KEY_TYPE keyStatus = KEY_NONE; /**< 按键状态指示(当前按键值) */
volatile static KEY_TYPE keyStatusBack = KEY_NONE; /**< 按键状态指示(当前按键值) */
volatile static uint8_t LED_ToggleFlag = 0; /**< LED 闪烁定时标志位1=需要翻转) */
static KEY_TYPE keyStatus = KEY_NONE; /**< 按键状态指示(当前按键值) */
static uint8_t ConnectFlg = 0; /**< 连接标志1=已连接0=未连接 */
volatile static uint32_t KEY_RUN_Count = 0; /**< 按键按下时 LCD 屏幕显示计时计数器单位5ms */
/* ============================================================================
* 内部函数实现
* ============================================================================ */
@@ -51,32 +43,8 @@ volatile static uint32_t KEY_RUN_Count = 0; /**< 按键按下时 LCD 屏
static void Key_ProcessCallback(KEY_TYPE key_type)
{
BackLight_ON(); /**< 任意按键按下,都打开背光 */
KeyRun_Disp(1); /**< 有按键按下LCD 显示按键指示 */
KEY_RUN_Count = 0; /**< 重置按键显示计时器 */
keyStatus = key_type; /**< 更新按键状态,供主循环处理 */
}
/**
* @brief 按键显示自动关闭处理
* @note 在定时器中断中调用,用于自动关闭按键按下后的 LCD 显示指示
* 处理逻辑:
* - KEY_RUN_Count 递增(每 5ms 一次)
* - 当计数达到 15约 75ms关闭按键显示
* - 计数限制在 15防止溢出
* @retval 无
*/
void KeyRun_Disp_Close(void)
{
KEY_RUN_Count++;
if (KEY_RUN_Count >= 15)
{
KEY_RUN_Count = 15; /**< 限制最大计数,防止溢出 */
KeyRun_Disp(0); /**< 关闭按键显示指示 */
}
}
/* ============================================================================
* 主程序入口
* ============================================================================ */
@@ -128,28 +96,29 @@ int main(void)
/* ========== 通信与显示初始化 ========== */
Process_Init(); /**< Modbus 通信任务初始化 */
NL_LOGO_Printf(); /**< 显示存储的 LOGO从 Flash 读取) */
/* ========== 定时器与回调注册 ========== */
gtim_timx_int_init(50-1, 7200-1); /**< 定时器初始化5ms 周期50×0.1ms7200 分频) */
Key_RegisterCallback(Key_ProcessCallback); /**< 注册按键回调函数 */
/* ========== 主循环 ========== */
while (1)
{
/* LED 指示灯闪烁控制(仅在已连接状态下闪烁) */
if (ConnectFlg == 1)
if (LED_ToggleFlag == 1)
{
if (LED_ToggleFlag == 1)
{
LED_ToggleFlag = 0; /**< 清除闪烁标志 */
LED_Toggle(LED_RUN); /**< 翻转运行指示灯 */
}
LED_ToggleFlag = 0; /**< 清除闪烁标志 */
// LED_Toggle(15); /**< 翻转运行指示灯 */
}
/* 快速的处理 keyStatus 的状态,避免与中断处理冲突*/
if(keyStatus != KEY_NONE)
{
keyStatusBack = keyStatus;
keyStatus = KEY_NONE;
}
/* RS485 Modbus 通信处理(包含按键上报) */
ConnectFlg = RS485_Process(keyStatus, ConnectFlg);
keyStatus = KEY_NONE; /**< 清除按键状态(已处理) */
RS485_Process(keyStatusBack);
keyStatusBack = KEY_NONE;
/* 系统运行时间监控与自动复位保护 */
if (sysRunTime > 1000000) /**< 约 5000 秒1000000 × 5ms */
@@ -157,6 +126,7 @@ int main(void)
HAL_NVIC_SystemReset(); /**< 系统立即复位(防止长时间运行异常) */
sysRunTime = 0;
}
}
}
@@ -177,7 +147,7 @@ int main(void)
*
* 定时器配置5ms 周期
* 中断标志TIM_FLAG_UPDATE定时器溢出标志
* @retval 无
* @retval 无
*/
void GTIM_TIMX_INT_IRQHandler(void)
{
@@ -185,18 +155,15 @@ void GTIM_TIMX_INT_IRQHandler(void)
if (__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET)
{
sysRunTime++; /**< 系统运行时间计数递增 */
/* LED 闪烁标志更新:每 200 次中断1 秒)翻转一次 */
if (sysRunTime % (LED_TOGGLE_TIME / 5) == 0)
if (sysRunTime % 200 == 0)
{
LED_ToggleFlag = 1; /**< 设置 LED 闪烁标志 */
}
Button_Ticks(); /**< 按键检测扫描MultiButton 库) */
Clear_Watchdog(); /**< 看门狗喂狗 */
BackLight_Close(); /**< 背光关闭检测 */
Process_Count(); /**< Modbus 通信轮询计数 */
KeyRun_Disp_Close(); /**< LCD 屏幕按键指示自动关闭处理 */
__HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE); /**< 清除定时器溢出中断标志 */
}