stm32定时器中断解码433m无线信号,测试过可用直接用
单片机源程序如下:
- #include "rf433.h"
- #include "usart.h"
- #include "includes.h"
- #include "stm32f10x_tim.h"
- /* USER CODE BEGIN 0 */
- uint8_t rf_data[3] = {0};
- uint8_t RF;
- uint8_t decode_ok; //解码成功
- uint8_t hh_w,ll_w; //高,低电平宽度
- uint8_t ma_x; //接收到第几位编码了
- uint8_t bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码,编码比较两次,这是第一次
- uint8_t mma1,mma2,mma3,mma4;
- uint8_t mmb1,mmb2,mmb3,mmb4; // 用于接收过程存放遥控编码,第二次
- //extern uint8_t mmb1,mmb2,mmb3,mmb4;
- uint8_t rf_ok1,rf_ok2,rf_ok; //解码过程中的临时接收成功标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了
- uint8_t old_rc5; //保存上一次查询到的电平状态
- uint8_t tb_ok; //接收到同步的马时置1
- uint8_t D0,D1,D2,D3 ;
- uint16_t s ,s1;
- uint8_t bt_auto; //自动设置遥控接收波特率标志
- /* 存放学习数据 即存储在flash里的 */
- //u8 rf433_save_data[3] = { 0x6d, 0xab, 0x26 };
- u8 rf433_save_data[3] = {0};
- /* 433数据接收成功标志位 */
- u8 rf433_msg_rev_success = NO;
- /* 是否刚刚解析完数据 用于给应用层提供一次输出 滤除掉发送端多次发送数据 */
- u8 isJustParser = NO;
- /* 学习状态 */
- u8 isLearnStatus = NO;
- /* 433初始化 */
- void RF433_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // EXTI_InitTypeDef EXTI_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- /* 开启时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
- /* RF433引脚功能定义 */
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = RF433_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
- GPIO_Init(RF433_PORT, &GPIO_InitStructure);
- /* learnKey引脚功能定义 */
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 上拉输入
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- #if 0
- /* EXTI line mode config */
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
- EXTI_InitStructure.EXTI_Line = EXTI_Line3;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断;
- //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //中断
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- #endif
- /* ??TIM2CLK ? 72MHZ */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
- //TIM_DeInit(TIM2);
-
- /* ????????????(???) */
- TIM_TimeBaseStructure.TIM_Period=49;
-
- /* ?? TIM_Period?????????????? */
- /* ???????72 */
- TIM_TimeBaseStructure.TIM_Prescaler= 71;
-
- /* ??????????????,?????? */
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
-
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
- TIM_ClearFlag(TIM2, TIM_FLAG_Update);
-
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //ê1?ü°′?üWK_UP?ù?úμ?ía2??D??í¨μà
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //?à??ó??è??2£?
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04; //×óó??è??3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
- NVIC_Init(&NVIC_InitStructure);
- TIM_Cmd(TIM2, ENABLE);
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /*???????*/
-
- }
- /* 50us中断 */
- void TIM2_IRQHandler(void)
- {
- /* 用于滤除 */
- static u16 cnt = 0x0;
- static u32 decode_ok_cnt = 0;
- if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
- {
- /* 刚解析成功一次数据 则延时一定时间 再进行数据接收 */
- if( isJustParser == YES )
- {
- /* 用于滤除 */
- decode_ok_cnt++;
- if( decode_ok_cnt < 18000 ) // 900ms
- {
- /* 900ms之后 再进行判断 */
- TIM_ClearITPendingBit( TIM2, TIM_FLAG_Update );
- return;
- }
- }
- isJustParser = NO;
- decode_ok_cnt = 0;
- /* 读取电平 */
- RF = RF433_DATA;
- /* 硬件电路 三极管反向 */
- if( RF == 1 )
- {
- ll_w++;
- old_rc5=0;
- } // 检测到低电平 低电平时间加1,记录本次电平状态old_rc5
- else // 检测到高电平
- {
- hh_w++;
- if (!old_rc5) // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
- {
- //if (((hh_w>=2)&&(hh_w<=5))&&((ll_w>=60)&&(ll_w<=180))) //判同步码 2/5 100/130
- if (((hh_w>=1)&&(hh_w<=20))&&((ll_w>=50)&&(ll_w<=190))) //判同步码 2/5 100/130
- {
- tb_ok = 1 ;
- ma_x = 0;
- bma1=0; bma2=0; bma3=0; bma4=0;
- }
- else if ((tb_ok)&&((ll_w>=12)&&(ll_w<=18))) // 8/13
- {
- ma_x++; //已经接收到同步码,判0 // 800us
- if(ma_x>23)
- {
- if(!rf_ok1) //rf_ok1 临时接收成功
- {
- mma1=bma1;
- mma2=bma2;
- mma3=bma3;
- mma4=bma4; //将接收到的编码复制到解码寄存器中
- rf_ok1=1; // 通知解码子程序可以解码了
- tb_ok=0;
- // bt_auto=0;
- s=800;
-
- }
- else
- {
- mmb1=bma1;
- mmb2=bma2;
- mmb3=bma3;
- mmb4=bma4; //将接收到的编码复制到解码寄存器中
- rf_ok2=1; // 通知解码子程序可以解码了
- tb_ok=0;
- // bt_auto=0;
- }
- }
- }
- else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=7))) // 2/7
- {
- /* 1 */ /* 200us */
- switch (ma_x)
- {
- /* 合成数据位 */
- /* 同步头1 */
- case 0 : { bma1=bma1 | 0x80; break; }
- case 1 : { bma1=bma1 | 0x40; break; }
- case 2 : { bma1=bma1 | 0x20; break; }
- case 3 : { bma1=bma1 | 0x10; break; }
- case 4 : { bma1=bma1 | 0x08; break; }
- case 5 : { bma1=bma1 | 0x04; break; }
- case 6 : { bma1=bma1 | 0x02; break; }
- case 7 : { bma1=bma1 | 0x01; break; }
- /* 同步头2 */
- case 8 : { bma2=bma2 | 0x80; break; }
- case 9 : { bma2=bma2 | 0x40; break; }
- case 10: { bma2=bma2 | 0x20; break; }
- case 11: { bma2=bma2 | 0x10; break; }
- case 12: { bma2=bma2 | 0x08; break; }
- case 13: { bma2=bma2 | 0x04; break; }
- case 14: { bma2=bma2 | 0x02; break; }
- case 15: { bma2=bma2 | 0x01; break; }
- /* 同步头3 */
- case 16: { bma3=bma3 | 0x80; break; }
- case 17: { bma3=bma3 | 0x40; break; }
- case 18: { bma3=bma3 | 0x20; break; }
- case 19: { bma3=bma3 | 0x10; break; }
- case 20: { bma3=bma3 | 0x08; break; }
- case 21: { bma3=bma3 | 0x04; break; }
- case 22: { bma3=bma3 | 0x02; break; }
- case 23: { bma3=bma3 | 0x01;
-
- if(!rf_ok1)
- {
- mma1=bma1;
- mma2=bma2;
- mma3=bma3;
-
- rf_ok1=1; // 通知解码子程序可以解码了
- tb_ok=0;
- // bt_auto=0;
- s=1000;
- break;
- }
- else
- {
- mmb1=bma1;
- mmb2=bma2;
- mmb3=bma3;
-
- rf_ok2=1; // 通知解码子程序可以解码了
- tb_ok=0;
- break;
- }
-
- }
- }
- ma_x++;
- }
- else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; hh_w=1;ll_w=0;} //接收到不符合的高-低电平序列
- ll_w=0;hh_w=1;
- }
- old_rc5=1; // 记录本次电平状态
- }
- if(rf_ok1) //规定时间内接受到2帧相同的编码数据才有效
- {
- s--;
- if(!s) rf_ok1=0;
- if(rf_ok2)
- {
- if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
- {
- rf_ok=1;
- rf_ok1=0;
- rf_ok2=0;
- }
- else
- {
- rf_ok=0;
- rf_ok1=0;
- rf_ok2=0;
- }
- }
- }
- #if 1
- if((rf_ok)) //判断是否接收成功
- {
- /* 关闭定时器 取出数据 */
- TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
- rf_ok = 0;
- rf_data[0] = mma1;
- rf_data[1] = mma2;
- rf_data[2] = mma3;
-
- /* 接收433数据成功 */
- rf433_msg_rev_success = YES;
- /* 开启定时器 */
- TIM_ITConfig(TIM2 , TIM_IT_Update, ENABLE);
- }
- #endif
- /* 清除标志位 */
- TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
- }
- #if SYSTEM_SUPPORT_OS //??SYSTEM_SUPPORT_OS??,?????OS.
- OSIntExit();
- #endif
- }
- /* 内存块比较 */
- u8 memCompare( u8 *src, u8 *dsc, u8 length )
- {
- while( length > 0 )
- {
- if( *src == *dsc )
- {
- length--;
- src++;
- dsc++;
- continue;
- }
- return NO;
- }
- return YES;
- }
- /* 433数据解析 报警返回YES 1 否则 NO 0 */
- /* 调用这个函数时 如果是学习状态 这不是报警 在此之前 需定义一个学习状态 */
- u8 RF433_Data_Parser(void)
- {
- /* 433数据接收成功 */
- if( rf433_msg_rev_success == YES )
- {
- /* 清除标志位 */
- rf433_msg_rev_success = NO;
- isJustParser = YES;
- printf("------> Have 433 msg!!!\n");
-
- printf("------> rf_data[0] = 0x%2x\n",rf_data[0]);
- printf("------> rf_data[1] = 0x%2x\n",rf_data[1]);
- printf("------> rf_data[2] = 0x%2x\n",rf_data[2]);
- printf("\n");
- if( isLearnStatus == YES )
- {
- /* 学习状态 存储数据 */
- printf("-------> Is learn status,please save data!!\n");
- /* 此处调用flash存放函数 存储成功 需 isLearnStatus 清除 */
-
- /* 学习状态 非报警 */
- return 2;
- }
- /* 解析数据 */
- if( (rf433_save_data[0]==rf_data[0]) && \
- (rf433_save_data[1]==rf_data[1]) && \
- (rf433_save_data[2]==rf_data[2]) )
- {
- /* 烟感同步头与学习到存储的数据一致 */
- /* 即使烟感报警 */
- printf("------> The smoker sensor is alarming!!!!!!\n\n");
- return YES;
- }else
- {
- printf("------> The another smoker sensor's data!\n\n");
- }
- }
- return NO;
- }
- /*********************************************END OF FILE**********************/
复制代码
所有资料51hei提供下载:
433定时器中断解码.rar
(4.66 KB, 下载次数: 185)
|