current_v/Src/nec_infrared.c

440 lines
13 KiB
C
Raw Normal View History

2025-12-31 08:21:43 +08:00
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file nec_infrared.c
* @author Motor Control SDK Team, Yuwell Software XiangenWang
* @brief Voice Recognition Module Initialization Section,
including peripheral initialization and message node insertion, etc.
* @version 1.0
* @changelog version 1.0 <EFBFBD><EFBFBD>ʼ<EFBFBD> 2025.11.13
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China.
* All rights reserved.</center></h2>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted, provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of Yuwell Software nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for Yuwell Software.
* 5. Redistribution and use of this software other than as permitted under
* this license is void and will automatically terminate your rights under
* this license.
*
* THIS SOFTWARE IS PROVIDED BY Yuwell Software AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL Yuwell Software OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* USER CODE END Header */
#include "nec_infrared.h"
#include "string.h"
#include "fm33lg0xx_queue.h"
#include "fm33lg0xx_event.h"
#include "ht24lc02_eeprom.h"
/************************** ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **************************/
Infrared infrared_info; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壬״̬Ĭ<CCAC><C4AC>ΪIDLE
/************************** ˽<>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **************************/
static uint32_t nec_calc_pulse_width(Infrared* info, uint32_t current_val);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param NONE
* @retval NONE
* @note 1. <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>LPTIM32Ϊ1MHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>64MHzϵͳʱ<EFBFBD>ӷ<EFBFBD>Ƶ64<EFBFBD><EFBFBD>
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LPTIM32<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ˫<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NVIC<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>LPTIM32<EFBFBD>ж<EFBFBD>
* @author jarvis
* @date 2025.11.25
*/
void nec_infrared_init(void)
{
FL_LPTIM32_InitTypeDef timInit;
FL_LPTIM32_IC_InitTypeDef timICInit;
FL_GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.pin = NEC_INFRARED_GPIO_PIN;
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_ENABLE;
GPIO_InitStruct.remapPin = FL_DISABLE;
GPIO_InitStruct.analogSwitch = FL_DISABLE;
FL_GPIO_Init(NEC_INFRARED_GPIO_PORT, &GPIO_InitStruct);
FL_LPTIM32_StructInit(&timInit);
timInit.clockSource = FL_CMU_LPTIM32_CLK_SOURCE_APBCLK; // ϵͳƵ<CDB3><C6B5>Ϊ64Mhz
timInit.mode = FL_LPTIM32_OPERATION_MODE_NORMAL;
timInit.prescalerClockSource = FL_LPTIM32_CLK_SOURCE_INTERNAL;
timInit.prescaler = FL_LPTIM32_PSC_DIV64; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʷ<EFBFBD>ƵΪ1Mhz
timInit.autoReload = 300000 - 1; // <20><><EFBFBD>󲨳<EFBFBD>Ϊ500ms
timInit.onePulseMode = FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS;
timInit.triggerEdge = FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH;
timInit.countEdge = FL_LPTIM32_ETR_COUNT_EDGE_FALLING;
FL_LPTIM32_Init(LPTIM32, &timInit);
timICInit.ICSource = FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0;
timICInit.ICEdge = FL_LPTIM32_IC_EDGE_FALLING; // ˫<><CBAB>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>
FL_LPTIM32_IC_Init(LPTIM32, FL_LPTIM32_CHANNEL_3, &timICInit);
FL_LPTIM32_ClearFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
FL_LPTIM32_ClearFlag_Update(LPTIM32);
FL_LPTIM32_EnableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_3); // <20>ж<EFBFBD>ʹ<EFBFBD><CAB9>
FL_LPTIM32_EnableIT_Update(LPTIM32);
NVIC_DisableIRQ(LPTIMx_IRQn); // ʹ<>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>NVIC
NVIC_SetPriority(LPTIMx_IRQn,1); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
NVIC_EnableIRQ(LPTIMx_IRQn);
FL_LPTIM32_Enable(LPTIM32); // ʹ<><CAB9>LPTIM32
infrared_info.ir_state = IR_STATE_IDLE;
infrared_info.pulse_width_index = 0;
infrared_info.code_464_ing = 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param current_val: <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><EFBFBD>1MHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ+500000-<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
* 2. 500000ΪLPTIM32<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @author jarvis
* @date 2025.12.12
*/
static uint32_t nec_calc_pulse_width(Infrared* info, uint32_t current_val)
{
uint32_t pulse_width = 0;
info->ic_value_last = info->ic_value_current;
info->ic_value_current = current_val;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ < <20><>һ<EFBFBD><D2BB>ֵ<EFBFBD><D6B5>
if (info->ic_value_current >= info->ic_value_last)
{
pulse_width = info->ic_value_current - info->ic_value_last;
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ = <20><>ǰֵ + (<28>Զ<EFBFBD><D4B6><EFBFBD>װֵ + 1) - <20><>һ<EFBFBD><D2BB>ֵ
pulse_width = (info->ic_value_current + 500000)- info->ic_value_last;
}
return pulse_width;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NEC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>߼<EFBFBD>
* @note <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Чָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ͬ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǡ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD>Ϣ
* @retval <EFBFBD><EFBFBD>
* @attention 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ33<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󲢷<EFBFBD><EFBFBD><EFBFBD>
* 3. ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ȫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰߳<EFBFBD>ȫ
*/
static void nec_command_decode(Infrared* info)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t i = 0;
info->received_data = 0;
info->received_data_index = 0;
MsgQueueItem queue_item;
MsgQueueItem filter_item;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((info->pulse_width_array[0] > NEC_START_FALLING_MIN)&&(info->pulse_width_array[0] < NEC_START_FALLING_MAX))
{
for(i = 1;i < 33; i++)
{
if((info->pulse_width_array[i] > NEC_DATA0_FALLING_MIN)&&(info->pulse_width_array[i] < NEC_DATA0_FALLING_MAX))
{
info->received_data_index++;
}else if((info->pulse_width_array[i] > NEC_DATA1_FALLING_MIN)&&(info->pulse_width_array[i] < NEC_DATA1_FALLING_MAX))
{
info->received_data += (1 << info->received_data_index++);
}else{
info->decode_error = true;
info->received_data = 0;
info->received_data_index = 0;
return;
}
}
}
info->decode_error = false;
// vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
// OK<4F><4B><EFBFBD><EFBFBD>˸һ<CBB8><D2BB>
if(info->received_data == NEC_CODE_NUM_4)
{
if(info->code_464_ing == 2)
{
vOxygenEventGroupSetBits(&global_event, EVENT_464_CLEAR); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
info->code_464_ing = 0;
}else if(info->code_464_ing == 0){
info->code_464_ing = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У׼<D0A3><D7BC>
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
}else{
info->code_464_ing = 0;
}
}
if(info->received_data == NEC_CODE_NUM_6)
{
if(info->code_464_ing == 1)
{
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
info->code_464_ing = 2;
}else{
info->code_464_ing = 0;
}
}
#if PROGREMA_DEBUG_MODE
if(info->received_data == NEC_CODE_TIMER)
{
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κβ<CEBA><CEB2><EFBFBD>
queue_item.type = MSG_TYPE_HOUR_SAVE;
queue_item.data.hour_meter.hour = 0;
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_HOUR_SAVE, queue_item);
queue_item.type = MSG_TYPE_MINUTE_SAVE;
queue_item.data.hour_meter.minute = 0;
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_MINUTE_SAVE, queue_item);
ht24lc02_word_write(7200, INDEX_E4_ELEC_HIGH);
ht24lc02_word_write(20, INDEX_E1_PRESS_LOW);
ht24lc02_word_write(280, INDEX_E2_PRESS_HIGH);
ht24lc02_word_write(180, INDEX_E7_220V_LOW);
filter_item.data.filter_server.last_clean_filter_hours = 0;
filter_item.data.filter_server.last_replace_filter_hours = 0;
filter_item.data.filter_server.clean_filter_time_need_stored = true;
filter_item.data.filter_server.replace_filter_time_need_stored = true;
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_FILTER_TIME_SAVE, filter_item);
}
#endif
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>صIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param Cap_Val: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @retval NONE
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>8λΪ1<EFBFBD>ֽڣ<EFBFBD>4<EFBFBD>ֽ<EFBFBD>Ϊһ֡<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>У<EFBFBD><EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULLʱֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD>
* @author jarvis
* @date 2025.11.25
*/
static void user_infrared_IRQHandle(Infrared* info, uint32_t Cap_Val)
{
if (info == NULL)
{
return;
}
info->pulse_width = nec_calc_pulse_width(info, Cap_Val); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((info->pulse_width >= NEC_START_FALLING_MIN)&&(info->pulse_width <= NEC_START_FALLING_MAX))
{
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
info->pulse_width_index = 0;
info->ir_state = IR_STATE_WAIT_DATA_END;
}
info->pulse_width_array[info->pulse_width_index++] = info->pulse_width;
info->clear_delay = 0;
if(info->pulse_width_index >= 33)
{
info->pulse_width_index = 0;
info->ir_state = IR_STATE_IDLE;
info->ok_count++;
// <20>Խ<EFBFBD><D4BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD>
nec_command_decode(info);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval NONE
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źű<EFBFBD><EFBFBD><EFBFBD>
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ų<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10ʱ<EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULLʱֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD>
* @author jarvis
* @date 2025.11.25
*/
static void user_infrared_Updata_IRQHandle(Infrared* info)
{
if (info == NULL)
{
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.<2E><><EFBFBD><EFBFBD><E2B4A6>IDLEģʽ<C4A3><CABD> 2.<2E><><EFBFBD><EFBFBD>IR_STATE_WAIT_DATA_ENDģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>100ms<6D><73>
if((info->ir_state == IR_STATE_IDLE)&&(info->pulse_width_array[0] != 0))
{
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
info->pulse_width_index = 0;
}
if(info->ir_state == IR_STATE_WAIT_DATA_END)
{
if(info->clear_delay >= 2)
{
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
info->pulse_width_index = 0;
info->clear_delay = 0;
info->ir_state = IR_STATE_IDLE;
}else{
info->clear_delay++;
}
}
}
/**
* @brief LPTIM32<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param NONE
* @retval NONE
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD>׵<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @author jarvis
* @date 2025.11.25
*/
void LPTIM_IRQHandler(void)
{
uint32_t Cap_Val;
if(FL_LPTIM32_IsActiveFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3))
{
FL_LPTIM32_ClearFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3);
Cap_Val = FL_LPTIM32_ReadCaptureCH3(LPTIM32);
user_infrared_IRQHandle(&infrared_info, Cap_Val); // <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBAAF>
}
if(FL_LPTIM32_IsActiveFlag_Update(LPTIM32))
{
FL_LPTIM32_ClearFlag_Update(LPTIM32);
user_infrared_Updata_IRQHandle(&infrared_info); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}