diff --git a/Core/Inc/ev1527.h b/Core/Inc/ev1527.h index 040ef57..96088f2 100644 --- a/Core/Inc/ev1527.h +++ b/Core/Inc/ev1527.h @@ -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 diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 7d6dddb..c03903a 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -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 diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index efd1057..f811edd 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -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 diff --git a/Core/Src/ev1527.c b/Core/Src/ev1527.c index 48d1571..49fd96a 100644 --- a/Core/Src/ev1527.c +++ b/Core/Src/ev1527.c @@ -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; +} + +/* + * 帧数据有4个字节,第一个字节是遥控的ID,第二个字节是第一个字节的反码 + * 第三个数据是遥控的真正的键值,第四个字节是第三个字节的反码 + */ +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.68ms:1ms~2ms */ + { + irda_data =1 ; + } + else if( pulse_time>=100 && pulse_time<=200 ) /* 2.1ms:2ms~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 + diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 59c5973..0079795 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -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 diff --git a/Core/Src/main.c b/Core/Src/main.c index 5eaf1b7..785bc00 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -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) { diff --git a/Core/Src/stm32wlxx_hal_msp.c b/Core/Src/stm32wlxx_hal_msp.c index 73369f8..5e315e3 100644 --- a/Core/Src/stm32wlxx_hal_msp.c +++ b/Core/Src/stm32wlxx_hal_msp.c @@ -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 */ } } diff --git a/Core/Src/stm32wlxx_it.c b/Core/Src/stm32wlxx_it.c index d732eaa..ee6d2e7 100644 --- a/Core/Src/stm32wlxx_it.c +++ b/Core/Src/stm32wlxx_it.c @@ -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 */ diff --git a/Core/Src/sys_app.c b/Core/Src/sys_app.c index 1fc1cd1..aea649d 100644 --- a/Core/Src/sys_app.c +++ b/Core/Src/sys_app.c @@ -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 */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 7e86e12..67a6b18 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -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 */ diff --git a/STM32CubeIDE/Release/WL55JC_AS923.elf b/STM32CubeIDE/Release/WL55JC_AS923.elf index 9975a36..d80305a 100644 Binary files a/STM32CubeIDE/Release/WL55JC_AS923.elf and b/STM32CubeIDE/Release/WL55JC_AS923.elf differ