current_v/Inc/nec_infrared.h
2025-12-31 08:21:43 +08:00

142 lines
4.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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 <stdint.h>
#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μs0和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****/