/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : nce_infrared.h * @brief : 消息队列头文件 * @version : 1.0 * @changelog : version 1.0 初始版本 2025.11.13 ****************************************************************************** * @attention * * Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China * THIS SOFTWARE is licensed under the Mulan PSL v1. * can use this software according to the terms and conditions of the Mulan PSL v1. * You may obtain a copy of Mulan PSL v1 at: * http://license.coscl.org.cn/MulanPSL * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR * PURPOSE. * See the Mulan PSL v1 for more details. * ****************************************************************************** */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __NCE_INFRARED_H #define __NCE_INFRARED_H #ifdef __cplusplus extern "C" { #endif #include #include "fm33lg0xx_fl.h" /* 增加对Malloc函数的支持 */ #include "stdlib.h" #define NEC_INFRARED_GPIO_PORT GPIOC #define NEC_INFRARED_GPIO_PIN FL_GPIO_PIN_15 /************************** NEC红外协议宏定义 **************************/ // NEC协议核心时序(分高低电平,1MHz计数频率) #define NEC_START_LOW_US 9000 // 起始位低电平:9ms #define NEC_START_HIGH_US 4500 // 起始位高电平:4.5ms #define NEC_DATA_LOW_US 560 // 数据位低电平:560μs(0和1的低电平相同) #define NEC_DATA0_HIGH_US 560 // 数据0高电平:560μs #define NEC_DATA1_HIGH_US 1690 // 数据1高电平:1690μs // 容错范围(±20%,预计算整数,避免浮点数) #define NEC_TOLERANCE_85(x) ((x) * 80 / 100) #define NEC_TOLERANCE_115(x) ((x) * 120 / 100) // 起始位高低电平容错范围 #define NEC_START_LOW_MIN NEC_TOLERANCE_85(NEC_START_LOW_US) // 7650 #define NEC_START_LOW_MAX NEC_TOLERANCE_115(NEC_START_LOW_US) // 10350 #define NEC_START_HIGH_MIN NEC_TOLERANCE_85(NEC_START_HIGH_US) // 3825 #define NEC_START_HIGH_MAX NEC_TOLERANCE_115(NEC_START_HIGH_US) // 5175 // 数据位容错范围 #define NEC_DATA_LOW_MIN NEC_TOLERANCE_85(NEC_DATA_LOW_US) // 476 #define NEC_DATA_LOW_MAX NEC_TOLERANCE_115(NEC_DATA_LOW_US) // 644 #define NEC_DATA0_HIGH_MIN NEC_TOLERANCE_85(NEC_DATA0_HIGH_US) // 476 #define NEC_DATA0_HIGH_MAX NEC_TOLERANCE_115(NEC_DATA0_HIGH_US) // 644 #define NEC_DATA1_HIGH_MIN NEC_TOLERANCE_85(NEC_DATA1_HIGH_US) // 1436 #define NEC_DATA1_HIGH_MAX NEC_TOLERANCE_115(NEC_DATA1_HIGH_US) // 1943 #define NEC_START_FALLING_MIN (NEC_START_LOW_MIN + NEC_START_HIGH_MIN) #define NEC_START_FALLING_MAX (NEC_START_LOW_MAX + NEC_START_HIGH_MAX) #define NEC_DATA0_FALLING_MIN (NEC_DATA_LOW_MIN + NEC_DATA0_HIGH_MIN) #define NEC_DATA0_FALLING_MAX (NEC_DATA_LOW_MAX + NEC_DATA0_HIGH_MAX) #define NEC_DATA1_FALLING_MIN (NEC_DATA_LOW_MIN + NEC_DATA1_HIGH_MIN) #define NEC_DATA1_FALLING_MAX (NEC_DATA_LOW_MAX + NEC_DATA1_HIGH_MAX) // 数据长度定义0 #define NEC_DATA_BYTES 4 // 地址+地址反码+数据+数据反码 #define NEC_BITS_PER_BYTE 8 // 每字节8位 #define NEC_TOTAL_BITS (NEC_DATA_BYTES * NEC_BITS_PER_BYTE) #define NEC_CODE_NUM_4 0xEB142322 #define NEC_CODE_NUM_6 0xE9162322 #define NEC_CODE_TIMER 0xF6092322 /************************** 红外状态枚举 **************************/ typedef enum { IR_STATE_IDLE, // 空闲状态 等待开始信号的第一个下降沿 IR_STATE_WAIT_DATA_END, // 开始不断收集数据中 } IR_State; /************************** 红外结构体定义 **************************/ typedef struct { IR_State ir_state; // 红外解码状态机 uint16_t pulse_width_array[33]; // 用于储存包括开始段在内的长度数据 uint16_t pulse_width_index; // 用来记录当前存储数据的位置 uint8_t clear_delay; // 数据清空延时 uint32_t received_data; uint32_t received_data_index; uint32_t pulse_width; uint32_t ic_value_last; uint32_t ic_value_current; uint8_t ok_count; bool decode_error; uint16_t code_464_ing; // 是否进行了464校验 } Infrared; /************************** 红外函数定义 **************************/ void nec_infrared_init(void); // 初始化红外模块 void LPTIM_IRQHandler(void); #ifdef __cplusplus } #endif #endif /* __FM33_QUEUE_H */ /************************ (C) COPYRIGHT Yuwell *****END OF FILE****/