good decoder and encoder send

This commit is contained in:
Yunhorn 2025-02-27 18:45:36 +08:00
parent 69d452721f
commit c54733fdf7
11 changed files with 541 additions and 151 deletions

View File

@ -51,4 +51,33 @@ void STS_RF_Send_AddressBit_and_CmdBit(uint8_t *rf_payload, uint8_t rf_length);
void EV1527Reset(void);
void EV1527Decode(uint32_t v);
#if 0
// #include "stm32f10x.h"
void EXTI_PB11_Config(void);
void IrDa_Init(void);
uint8_t Get_Pulse_Time(void);
uint8_t IrDa_Process(void);
#define IRDA_ID 0
//红外遥控使用的GPIO及时钟
#define IRDA_GPIO_PORT GPIOE
#define IRDA_GPIO_CLK RCC_APB2Periph_GPIOE
#define IRDA_GPIO_PIN GPIO_Pin_5
#define IRDA_GPIO_PORT_SOURCE GPIO_PortSourceGPIOE
#define IRDA_GPIO_PIN_SOURCE GPIO_PinSource5
//中断相关
#define IRDA_EXTI_LINE EXTI_Line5
#define IRDA_EXTI_IRQN EXTI9_5_IRQn
#define IRDA_EXTI_IRQHANDLER_FUN EXTI9_5_IRQHandler
//读取引脚的电平
#define IrDa_DATA_IN() GPIO_ReadInputDataBit(IRDA_GPIO_PORT,IRDA_GPIO_PIN)
#endif
#endif

View File

@ -90,8 +90,16 @@ void Error_Handler(void);
#define USART1_TX_GPIO_Port GPIOB
#ifdef RC
#define TIM1_PRESCALER_VALUE 47L // 1 us for stm32wle5xx 48Mhz
#define TIM1_PERIOD_VALUE 79L // 80 us
#define TIM1_PERIOD_VALUE 9L // 10 us
#define TIM2_PRESCALER_VALUE (uint32_t)(((SystemCoreClock) /(1000000)) - 1)
// make it 1 us interval
#define TIM2_PERIOD_VALUE (90 - 1)
// make it 40 us interval
#define PRESCALER_VALUE TIM2_PRESCALER_VALUE
#define PERIOD_VALUE TIM2_PERIOD_VALUE
// REMOTE CONTROL EV1527/HS1527 LORA-WAN RELAY NODE
@ -172,7 +180,7 @@ void Error_Handler(void);
#define RF_Receive_GPIO_Port GPIOA
#define RF_Receive_GPIO_Pin GPIO_PIN_9
#define RF_Receive_GPIO_CLK_EN() __HAL_RCC_GPIOA_CLK_ENABLE();
#define RF_Receive_Data_In() HAL_GPIO_ReadPin(RF_Receive_GPIO_Port, RF_Receive_GPIO_Pin)
#endif

View File

@ -39,8 +39,9 @@ extern TIM_HandleTypeDef htim1;
/* USER CODE BEGIN Prototypes */
void MX_TIM1_Init(void);
void MX_TIM2_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
uint8_t Get_Pulse_Time(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus

View File

@ -1,14 +1,15 @@
#include "ev1527.h"
volatile uint32_t TIM1_cnt=0;
// 定时周期
#define TIME_CYCLE 80
//#define TIME_CYCLE 80
#define TIME_CYCLE PERIOD_VALUE
// #define TIME_CYCLE 20
// 定义引导码的最小和最大持续时间单位us
#define MIN_LEAD_CODE (5600 / TIME_CYCLE)
#define MAX_LEAD_CODE (16000 / TIME_CYCLE)
// 定义数据位持续时间的最小和最大范围单位us
#define MIN_BIT_DURATION (80 / TIME_CYCLE)
#define MIN_BIT_DURATION (100 / TIME_CYCLE)
#define MAX_BIT_DURATION (2400 / TIME_CYCLE)
// 定义功能字节在接收缓冲区中的索引位置
@ -84,28 +85,21 @@ void RF_Signal_Decode(void)
// 判断是否低电平
if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_RESET)
{
// printf("_");
// Lead_Code_Count++;
// Lead_Code_Count = TIM1_cnt - Lead_Code_Count_Start;
Lead_Code_Count++;
}
else // 高电平判断范围
{
Lead_Code_Count = TIM1_cnt - Lead_Code_Count_Start;
printf("+");
// 判断引导码范围是否合法
if (Lead_Code_Count >= MIN_LEAD_CODE && Lead_Code_Count <= MAX_LEAD_CODE)
{
Lead_Code_Count = 0;
Reset_Decode_Parameters(); // 重置解码参数
RF_Decode_State = HIGH_BIT; // 进入高位数据位判断状态
printf("+");
}
else
{
printf(".");
Reset_Decode_Parameters(); // 引导码范围不合法,重置解码参数
}
}
@ -115,20 +109,16 @@ void RF_Signal_Decode(void)
// 判断是否高电平
if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_SET)
{
// High_Bit_Count++;
// High_Bit_Count = TIM1_cnt;
High_Bit_Count_Start = TIM1_cnt;
High_Bit_Count++;
}
else // 低电平判断范围
{
High_Bit_Count = TIM1_cnt - High_Bit_Count_Start;
// 判断高位数据位范围是否合法
if (High_Bit_Count >= MIN_BIT_DURATION && High_Bit_Count <= MAX_BIT_DURATION)
{
High_Bit_Duration = High_Bit_Count; // 保存计数值用于区分0和1
High_Bit_Count = 0;
RF_Decode_State = LOW_BIT; // 进入低位数据位判断状态
printf("-");
}
else
{
@ -141,20 +131,16 @@ void RF_Signal_Decode(void)
// 判断是否低电平
if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_RESET)
{
//Low_Bit_Count++;
// Low_Bit_Count = TIM1_cnt;
Low_Bit_Count_Start = TIM1_cnt;
Low_Bit_Count++;
}
else // 高电平判断范围
{
Low_Bit_Count = TIM1_cnt - Low_Bit_Count_Start;
// 判断低位数据位范围是否合法
if (Low_Bit_Count >= MIN_BIT_DURATION && Low_Bit_Count <= MAX_BIT_DURATION)
{
Low_Bit_Duration = Low_Bit_Count; // 保存计数值用于区分0和1
Low_Bit_Count = 0;
RF_Decode_State = DATA_PROCESS; // 进入数据处理状态
printf("o");
}
else
{
@ -302,10 +288,6 @@ void Reset_Decode_Parameters(void)
High_Bit_Duration = 0;
Low_Bit_Duration = 0;
RF_Decode_State = LEAD_CODE;
Lead_Code_Count_Start = TIM1_cnt;
High_Bit_Count_Start = TIM1_cnt;
}
/**----------------------------------------------------------------------------------------------**
@ -383,12 +365,13 @@ void Execute_Function(void)
default:
// 默认操作
printf("\r\n --- code =%02x",Received_Buffer[FUNCTION_BYTE_INDEX]);
// printf("\r\n --- code =%02x",Received_Buffer[FUNCTION_BYTE_INDEX]);
printf("\r\n ADDR= %02x %02x %02x CMD=%02x",Received_Buffer[0],Received_Buffer[1],Received_Buffer[2], 0x0F&Received_Buffer[FUNCTION_BYTE_INDEX]);
break;
}
}
#if 0
uint8_t RF;
uint8_t decode_ok; //解码成功
uint8_t hh_w,ll_w; //高,低电平宽度
@ -404,6 +387,7 @@ uint8_t old_rc5; //保存上一次查询到的电平状态
uint8_t tb_ok; //接收到同步的马时置1
uint8_t D0,D1,D2,D3;
uint16_t s,s1;
#endif
uint8_t bt_auto; //自动设置遥控接收波特率标志
extern uint8_t rf_data[4];
@ -541,5 +525,358 @@ void STS_RF_Send_AddressBit_and_CmdBit(uint8_t *rf_payload, uint8_t rf_length)
// printf("ending bits ...\r\n");
}
#if 0
/**
******************************************************************************
* @file bsp_irda.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief
******************************************************************************
* @attention
*
* : F103- STM32
* :http://www.firebbs.cn
* :https://fire-stm32.taobao.com
*
******************************************************************************
*/
//#include "./IrDa/bsp_irda.h"
//#include "./systick/bsp_SysTick.h"
//#include "./led/bsp_led.h"
uint32_t frame_data=0; /* 一帧数据缓存 */
uint8_t frame_cnt=0;
uint8_t frame_flag=0; /* 一帧数据接收完成标志 */
/**
* @brief NVIC
* @param
* @retval
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置P[A|B|C|D|E]11为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = IRDA_EXTI_IRQN;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/* 初始化红外接收头1838用到的IO */
void IrDa_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* config the extiline clock and AFIO clock */
RCC_APB2PeriphClockCmd(IRDA_GPIO_CLK | RCC_APB2Periph_AFIO,ENABLE);
/* config the NVIC */
NVIC_Configuration();
/* EXTI line gpio config */
GPIO_InitStructure.GPIO_Pin = IRDA_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(IRDA_GPIO_PORT, &GPIO_InitStructure);
/* EXTI line mode config */
GPIO_EXTILineConfig(IRDA_GPIO_PORT_SOURCE, IRDA_GPIO_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line = IRDA_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/* 获取高电平的时间 */
uint8_t Get_Pulse_Time(void)
{
uint8_t time = 0;
while( IrDa_DATA_IN() )
{
time ++;
Delay_us(2); // 延时 20us
if(time == 250)
return time; // 超时溢出
}
return time;
}
/*
* 4ID
*
*/
uint8_t IrDa_Process(void)
{
uint8_t first_byte, sec_byte, tir_byte, fou_byte;
first_byte = frame_data >> 24;
sec_byte = (frame_data>>16) & 0xff;
tir_byte = frame_data >> 8;
fou_byte = frame_data;
/* 记得清标志位 */
frame_flag = 0;
if( (first_byte==(uint8_t)~sec_byte) && (first_byte==IRDA_ID) )
{
if( tir_byte == (u8)~fou_byte )
return tir_byte;
}
return 0; /* 错误返回 */
}
// IO 线中断, 接红外接收头的数据管脚
void IRDA_EXTI_IRQHANDLER_FUN(void)
{
uint8_t pulse_time = 0;
uint8_t leader_code_flag = 0; /* 引导码标志位,当引导码出现时,表示一帧数据开始 */
uint8_t irda_data = 0; /* 数据暂存位 */
if(EXTI_GetITStatus(IRDA_EXTI_LINE) != RESET) /* 确保是否产生了EXTI Line中断 */
{
while(1)
{
if( IrDa_DATA_IN()== SET ) /* 只测量高电平的时间 */
{
pulse_time = Get_Pulse_Time();
/* >=5ms 不是有用信号 当出现干扰或者连发码时也会break跳出while(1)循环 */
if( pulse_time >= 250 )
{
break; /* 跳出while(1)循环 */
}
if(pulse_time>=200 && pulse_time<250) /* 获得前导位 4ms~4.5ms */
{
leader_code_flag = 1;
}
else if(pulse_time>=10 && pulse_time<50) /* 0.56ms: 0.2ms~1ms */
{
irda_data = 0;
}
else if(pulse_time>=50 && pulse_time<100) /* 1.68ms1ms~2ms */
{
irda_data =1 ;
}
else if( pulse_time>=100 && pulse_time<=200 ) /* 2.1ms2ms~4ms */
{/* 连发码,在第二次中断出现 */
frame_flag = 1; /* 一帧数据接收完成 */
frame_cnt++; /* 按键次数加1 */
isr_cnt ++; /* 进中断一次加1 */
break; /* 跳出while(1)循环 */
}
if( leader_code_flag == 1 )
{/* 在第一次中断中完成 */
frame_data <<= 1;
frame_data += irda_data;
frame_cnt = 0;
isr_cnt = 1;
}
}
}// while(1)
EXTI_ClearITPendingBit(IRDA_EXTI_LINE); //清除中断标志位
//LED2_TOGGLE;
}
}
#define CLI() __set_PRIMASK(1) /* 关闭总中断 */
#define SEI() __set_PRIMASK(0) /* 开放总中断 */
extern uint8_t frame_flag;
extern uint8_t isr_cnt;
extern uint8_t frame_cnt;
/**
* @brief
* @param
* @retval
*/
int irda_main(void)
{
uint8_t key_val;
/* config the led */
LED_GPIO_Config();
LED1_ON;
/* 配置SysTick 为10us中断一次 */
SysTick_Init();
/* 重新配置SysTick的中断优先级为最高要不然SysTick延时中断抢占不了IO EXTI中断
* SysTick初始化时默认配置的优先级是最低的
* IO EXTI中断的优先级
*/
NVIC_SetPriority (SysTick_IRQn, 0);
/* USART1 config 115200 8-N-1 */
USART_Config();
printf("\r\n 这是一个红外遥控发射与接收实验 \r\n");
/* 初始化红外接收头CP1838用到的IO */
IrDa_Init();
for(;;)
{
if( frame_flag == 1 ) /* 一帧红外数据接收完成 */
{
key_val = IrDa_Process();
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 按键次数frame_cnt=%d \r\n",frame_cnt);
printf("\r\n 中断次数isr_cnt=%d \r\n",isr_cnt);
/* 不同的遥控器面板对应不同的键值,需要实际测量 */
switch( key_val )
{
case 0:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n Error \r\n");
break;
case 162:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n POWER \r\n");
break;
case 226:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n MENU \r\n");
break;
case 34:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n TEST \r\n");
break;
case 2:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n + \r\n");
break;
case 194:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n RETURN \r\n");
break;
case 224:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n |<< \r\n");
break;
case 168:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n > \r\n");
break;
case 144:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n >>| \r\n");
break;
case 104:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 0 \r\n");
break;
case 152:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n - \r\n");
break;
case 176:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n C \r\n");
break;
case 48:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 1 \r\n");
break;
case 24:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 2 \r\n");
break;
case 122:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 3 \r\n");
break;
case 16:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 4 \r\n");
break;
case 56:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 5 \r\n");
break;
case 90:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 6 \r\n");
break;
case 66:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 7 \r\n");
break;
case 74:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 8 \r\n");
break;
case 82:
LED1_TOGGLE;
printf("\r\n key_val=%d \r\n",key_val);
printf("\r\n 9 \r\n");
break;
default:
break;
}
}
}
}
#endif

View File

@ -125,8 +125,8 @@ void MX_GPIO_Init(void)
#if 1
GPIO_InitStruct.Pin = RF_Receive_GPIO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; //GPIO_MODE_INPUT; //GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //GPIO_MODE_INPUT; //GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(RF_Receive_GPIO_Port, &GPIO_InitStruct);
#endif

View File

@ -32,7 +32,7 @@
// #include "sts_aq_o3.h"
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim1, htim2;
//uint8_t rf_payload[3]={0xF8,0xCD,0x07}, rf_length=3;
uint8_t rf_payload[3]={0x1F,0xB3,0xE0}, rf_length=3; // RC_PROJECTOR
uint8_t sos_rf_payload[3]={0x82,0x73,0xA0}, sos_rf_length=3; // sos_button
@ -137,10 +137,26 @@ int main(void)
// MX_USART1_UART_Init();
MX_TIM1_Init();
//MX_TIM1_Init();
MX_TIM2_Init();
/*## Start the TIM Base generation in interrupt mode ####################*/
/* Start Channel1 */
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
{
/* Starting Error */
Error_Handler();
}
printf("start \r\n");
while(1)
{
}
// EV1527_Init();
#if 0
@ -506,6 +522,8 @@ void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
__disable_irq();
while (1)
{

View File

@ -150,35 +150,18 @@ void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* htim_ic)
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim_base->Instance==TIM1)
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO Configuration
PA9 ------> TIM1_CH2
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* TIM1 interrupt Init */
HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
HAL_NVIC_SetPriority(TIM1_UP_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
HAL_NVIC_SetPriority(TIM1_TRG_COM_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_IRQn);
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
/* TIM1 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
@ -194,27 +177,19 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
*/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM1)
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
__HAL_RCC_TIM2_CLK_DISABLE();
/**TIM1 GPIO Configuration
PA9 ------> TIM1_CH2
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
/* TIM2 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* TIM1 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM1_BRK_IRQn);
HAL_NVIC_DisableIRQ(TIM1_UP_IRQn);
HAL_NVIC_DisableIRQ(TIM1_TRG_COM_IRQn);
HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
}

View File

@ -63,7 +63,7 @@ extern DMA_HandleTypeDef hdma_usart2_tx;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef huart1;
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim1, htim2;
/* USER CODE BEGIN EV */
@ -197,7 +197,7 @@ void PendSV_Handler(void)
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
// HAL_IncTick();
/* USER CODE END SysTick_IRQn 0 */
/* USER CODE BEGIN SysTick_IRQn 1 */
@ -459,10 +459,9 @@ void SUBGHZ_Radio_IRQHandler(void)
}
/* USER CODE BEGIN 1 */
#if 0
#if 1
void TIM1_IRQHandler(void)
{
TIM1_cnt++;
HAL_TIM_IRQHandler(&htim1);
}
#endif
@ -499,4 +498,20 @@ void TIM1_IC_IRQHandler(void)
}
#endif
/**
* @brief This function handles TIM2 Global Interrupt.
*/
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
/* USER CODE END TIM2_IRQn 1 */
}
/* USER CODE END 1 */

View File

@ -382,86 +382,19 @@ void HAL_Delay(__IO uint32_t Delay)
/* USER CODE END HAL_Delay_2 */
}
/* USER CODE BEGIN Overload_HAL_weaks */
/**
* @note This function overwrites the __weak one from HAL
*/
void HAL_Delay_Us(uint32_t uDelay)
{
#if 0
uint32_t startval, tickn, delays, wait;
startval = SysTick->VAL;
tickn = HAL_GetTick();
delays = uDelay * 48;
if (delays > startval)
{
while (HAL_GetTick() == tickn) {}
wait = 48000 + startval -delays;
while (wait < SysTick->VAL) {};
}else {
wait = startval - delays;
while(wait < SysTick->VAL && HAL_GetTick() == tickn)
{
}
}
#endif
#if 0
uint32_t g_fac_us=48;
uint32_t ticks;
uint32_t told, tnow, tcnt =0;
uint32_t reload = SysTick->LOAD;
ticks = uDelay * g_fac_us;
told = SysTick->VAL;
while(1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told -tnow;
} else {
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
#endif
#if 1
__IO uint32_t delay= uDelay*48/8;
do {__NOP();} while(delay --);
#endif
#if 0
/* TIMER_IF can be based on other counter the SysTick e.g. RTC */
/* USER CODE BEGIN HAL_Delay_1 */
uint32_t startval, tickn, delays, wait;
startval = SysTick->VAL;
tickn = HAL_GetTick();
// sysclock = 48000
delays = uDelay*48;
if (delays > startval)
{
while(HAL_GetTick() == tickn) ;
wait = 48000 + startval - delays;
while(wait < SysTick->VAL) ;
} else {
wait = startval - delays;
while (wait < SysTick->VAL && HAL_GetTick() == tickn) ;
}
/* USER CODE END HAL_Delay_1 */
#endif
/* USER CODE BEGIN HAL_Delay_2 */
/* USER CODE END HAL_Delay_2 */

View File

@ -23,7 +23,7 @@
#include "stdio.h"
#include "ev1527.h"
/* USER CODE BEGIN 0 */
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim1, htim2;
// DMA_HandleTypeDef hdma_tim1_ch1; //PA8 WS2812B
@ -89,20 +89,24 @@ void MX_TIM1_Init(void)
htim1.Instance = TIM1;
htim1.Init.Prescaler = TIM1_PRESCALER_VALUE;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 0xffff; // TIM1_PERIOD_VALUE; // 0xffff; // TIM1_PERIOD_VALUE;
htim1.Init.Period = TIM1_PERIOD_VALUE; // TIM1_PERIOD_VALUE; // 0xffff; // TIM1_PERIOD_VALUE;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
#if 0
#if 1
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
#endif
#if 1
if (HAL_TIM_IC_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
#endif
#if 0
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;
@ -148,6 +152,54 @@ void MX_TIM1_Init(void)
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = PRESCALER_VALUE;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = PERIOD_VALUE;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
}
#if 1
#define EV1527_H4 328 // NARROW PULSE WIDTH us, varies on different remote control
@ -203,6 +255,13 @@ void EV1527Decode(uint32_t v)
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//printf(".");
RF_Signal_Decode();
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t uwICValue;
@ -214,9 +273,9 @@ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
//printf(" cc ");
// RF_Signal_Decode();
//if (TIM1 == htim->Instance)
if (TIM1 == htim->Instance)
{
//if ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2))
if ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2))
{
if (HAL_GPIO_ReadPin(RF_Receive_GPIO_Port,RF_Receive_GPIO_Pin)== GPIO_PIN_RESET)
{ // Falling edge
@ -665,6 +724,21 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
}
#endif
/* 获取高电平的时间 */
uint8_t Get_Pulse_Time(void)
{
uint8_t time = 0;
while( RF_Receive_Data_In() )
{
time ++;
HAL_Delay_Us(1);
if(time == 250)
return time; // 超时溢出
}
return time;
}
/* USER CODE BEGIN 1 */