|
# 433 發(fā)送和接收模塊
## 1. 433發(fā)送
* 433發(fā)送過(guò)程:
(1)電平時(shí)間設(shè)置 **Witty433_Init()**
(2)發(fā)送內(nèi)容和次數(shù)設(shè)置 **SendInput_433()**
(3)發(fā)送 **StartSend_433()**
* 433自定義內(nèi)容:
芯片類型、管腳操作、延時(shí)函數(shù)**delay_us_433**、**delay_ms_433**及芯片ID隨芯片/操作系統(tǒng)不同由用戶定義。
* 433的各個(gè)電平時(shí)間,433的地址碼,433的控制碼,433的發(fā)送次數(shù)由用戶自定義。
## 2. 433接收
* 433接收過(guò)程:
(1)電平時(shí)間設(shè)置,定時(shí)器初始化為PWM輸入模式(注意CLK大。
(2)定時(shí)器pwm輸入捕獲低電平時(shí)長(zhǎng),接收傳輸?shù)?33數(shù)據(jù)
(3)在433信號(hào)處理線程 **deal433_entry()** 中對(duì)接收的數(shù)據(jù)進(jìn)行處理
* 433自定義內(nèi)容:
定時(shí)器PWM輸入模式的初始化,各個(gè)電平時(shí)間初始化,接收校驗(yàn)次數(shù),數(shù)據(jù)處理。
- #include <rtthread.h>
- #include <rtdevice.h>
- #include <board.h>
- #include <433_receive.h>
- /**
- * 遙控器使用說(shuō)明:使用433遙控器前要進(jìn)行配對(duì),將遙控器的地址碼獲取到存在flash當(dāng)中,每次控制時(shí)進(jìn)行校驗(yàn)。
- * 配對(duì)時(shí),設(shè)備上長(zhǎng)按配對(duì)按鍵,配對(duì)遙控器的LED燈開始閃爍,此時(shí)連續(xù)按遙控器上的配對(duì)按鍵,直到設(shè)備上的配對(duì)燈滅
- * 則表示配對(duì)完成
- */
- /**
- * 程序名稱:接收并處理433信號(hào)
- * 433接收過(guò)程:利用定時(shí)器的PWM捕獲,捕獲PWM信號(hào),捕獲完成后在deal433_entry(void *parameter)線程中進(jìn)行處理
- * 433接收自定義內(nèi)容:高低電平時(shí)長(zhǎng),地址碼長(zhǎng)度,控制碼長(zhǎng)度,控制指令處理相關(guān)內(nèi)容
- * 其它:華泰自己的433信號(hào)沒(méi)有結(jié)束碼
- */
- TIM_HandleTypeDef htim2;
- int add_low_level(unsigned int low_level, unsigned int * re_Data);
- static unsigned int RxData = 0xFF; //433接收數(shù)據(jù)
- static int RxOk = 0; //433接收標(biāo)志位
- /* 433電平時(shí)長(zhǎng)定義(自定義部分)*/
- #define start_high 4 //起始碼高電平時(shí)長(zhǎng),單位CLK,CLK大小通過(guò)定時(shí)器分頻系數(shù)來(lái)改,默認(rèn)100us
- #define start_low 124 //起始碼低電平時(shí)長(zhǎng)
- #define one_high 4 //數(shù)字1的高電平時(shí)長(zhǎng)
- #define one_low 4 //數(shù)字1的低電平時(shí)長(zhǎng)
- #define zero_high 4 //數(shù)字0的高電平時(shí)長(zhǎng)
- #define zero_low 12 //數(shù)字0的低電平時(shí)長(zhǎng)
- //#define stop_high 10 //結(jié)束碼的高電平時(shí)長(zhǎng)
- //#define stop_low 0 //結(jié)束碼的低電平時(shí)長(zhǎng)
- #define time_range 2 //電平時(shí)長(zhǎng)有效范圍
- /* 數(shù)據(jù)長(zhǎng)度定義(自定義部分)*/
- /* || 起始碼 || 數(shù)據(jù)碼(地址碼和控制代碼)(自定義部分)|| */
- #define data_full_len 32 //數(shù)據(jù)碼總長(zhǎng)(位)地址碼和控制代碼加起來(lái)的長(zhǎng)度
- #define addr_len 24 //地址碼長(zhǎng)度(位)
- #define control_len 8 //控制代碼(位)
- /* 已配對(duì)的433遙控器地址(自定義部分) */
- unsigned int remote_addr=0x000001;
- /**
- * 捕獲回調(diào)函數(shù)
- */
- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
- {
- static uint32_t m_pulse;
- if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- {
- m_pulse = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2); //得到低電平的時(shí)間
- add_low_level(m_pulse, &RxData); //獲取數(shù)據(jù)
- }
- }
- /**
- * 433輸入信號(hào)處理
- * @parm1 出入?yún)?shù),低電平時(shí)間
- * @parm2 傳出參數(shù),接收成功就是接收成功的數(shù)據(jù)
- * @return (0---沒(méi)有一個(gè)完整的數(shù)據(jù))(1---有一個(gè)完整的數(shù)據(jù))
- */
- int add_low_level(unsigned int low_level, unsigned int * re_Data)
- {
- static int Start = 0;
- static unsigned int Num;
- static unsigned int Data = 0; //最新數(shù)據(jù)
- static unsigned int Data1 = 0; //上次數(shù)據(jù)
- static unsigned int Data2 = 0; //上上次數(shù)據(jù)
-
- if(low_level>start_low-time_range*2) // 確定起始碼
- {
- Start = 1;
- Data = 0;
- Num = 0;
- }
- else if((Start == 1)&&(low_level>zero_low-time_range)&&(low_level<zero_low+time_range)) //數(shù)據(jù)0
- {
- Data = Data<<1;
- Num++;
- }
- else if((Start == 1)&&(low_level>one_low-time_range)&&(low_level<one_low+time_range)) //數(shù)據(jù)1
- {
- Data = Data<<1;
- Data = Data +1;
- Num++;
- }
- else //錯(cuò)誤數(shù)據(jù)
- {
- Start = 0;
- }
-
- if((Num == data_full_len)&&(Start == 1)) //收到全部數(shù)據(jù)
- {
- Start = 0;
- if(((Data == Data1)||(Data == Data2))&&(Data != 0xFF)) //收到兩遍相同的
- {
- *re_Data = Data; //得到數(shù)據(jù)
- RxOk = 1;
-
- Data = 0xFF;
- Data1 = 0xFF;
- Data2 = 0xFF;
- }
- else
- {
- Data2 = Data1;
- Data1 = Data;
- }
- }
- return 0;
- }
- /**
- * 定時(shí)器初始化為pwm輸入捕獲(CLK為100us)
- * @brief TIM2 Initialization Function
- * @param None
- * @retval None
- */
- static void MX_TIM2_Init(void)
- {
- /* USER CODE BEGIN TIM2_Init 0 */
- /* USER CODE END TIM2_Init 0 */
- TIM_SlaveConfigTypeDef sSlaveConfig = {0};
- TIM_IC_InitTypeDef sConfigIC = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- /* USER CODE BEGIN TIM2_Init 1 */
- /* USER CODE END TIM2_Init 1 */
- htim2.Instance = TIM2;
- htim2.Init.Prescaler = 7200-1; //CLK大小改這里,現(xiàn)在為100us
- htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim2.Init.Period = 50000;
- htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
- if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
- {
- Error_Handler();
- }
- sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
- sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
- sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
- sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1;
- sSlaveConfig.TriggerFilter = 0;
- if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
- sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
- sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
- sConfigIC.ICFilter = 0;
- if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
- sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
- if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != 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 */
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); //打開定時(shí)器中斷
- /* USER CODE END TIM2_Init 2 */
- }
- /**
- * 433通信處理線程
- */
- void deal433_entry(void *parameter)
- {
- unsigned int receive_addr; //接收到433信號(hào)的地址
- unsigned int receive_control; //接收到433信號(hào)的功能代碼
- MX_TIM2_Init();
- while(1)
- {
- if(RxOk == 1) //接收完成
- {
- RxOk = 0;
- /*接收到數(shù)據(jù)進(jìn)行數(shù)據(jù)處理*/
- rt_kprintf("receive data is %#X\n",RxData);
- receive_addr = RxData >> control_len ; //得到433信號(hào)地址
- receive_control = RxData & 0xFF ; //得到433信號(hào)的功能代碼(根據(jù)需要的功能碼位數(shù)可能需要修改)
- /*對(duì)遙控器地址進(jìn)行校驗(yàn)*/
- if(receive_addr==remote_addr) //校驗(yàn)通過(guò)
- {
- /********************(自定義部分)***********************/
- /*執(zhí)行相應(yīng)的功能*/
- switch(receive_control)
- {
- case 0x11:
- {
-
- }break ;
-
-
-
-
-
-
-
-
-
-
- }
- /*********************************************************/
- }
-
- }
- rt_thread_mdelay(1);
- }
- }
復(fù)制代碼- #include "433_send.h"
- #include <rtthread.h>
- #include <rtdevice.h>
- #include <board.h>
- //#include "delay.h"
- //#include "gpio.h"
- /**
- * 程序名稱: 433信號(hào)發(fā)送
- * 433發(fā)送過(guò)程:1.電平時(shí)間設(shè)置 Witty433_Init(unsigned int set_level_buf[8]) -->
- * 2.發(fā)送內(nèi)容和次數(shù)設(shè)置 SendInput_433(unsigned char *data,unsigned int dataBitNum,unsigned char sendNum) -->
- * 3.發(fā)送 StartSend_433()
- * 433自定義內(nèi)容: 芯片類型、管腳操作、延時(shí)函數(shù)delay_us_433、delay_ms_433及芯片ID隨芯片/操作系統(tǒng)不同由用戶定義。
- * 433的各個(gè)電平時(shí)間,433的地址碼,433的控制碼,433的發(fā)送次數(shù)由用戶自定義。
- */
- /* 選擇芯片類型(用戶自定義) */
- #define STM32FL151
- /* 433發(fā)射管腳操作函數(shù)(用戶自定義) */
- #define Pin_433_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_SET)
- #define Pin_433_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_RESET)
- /* 433延時(shí)函數(shù) */
- static void (*delay_us_433)(unsigned int us);
- static void (*delay_ms_433)(unsigned short ms);
- static void delay_long_us(unsigned int long_us);
- /* 433地址碼默認(rèn)設(shè)置*/
- static unsigned int GetAddrFromChipID(unsigned char *addr);
- static Witty433 witty433;
- static unsigned char addr[3];
- static unsigned int addr_len = 24;
- void delay_long_us(unsigned int long_us)
- {
- unsigned short ms = long_us/1000;
- unsigned int us = long_us%1000;
-
- if(ms)delay_ms_433(ms);
- if(us)delay_us_433(us);
- }
- unsigned int GetAddrFromChipID(unsigned char *addr)
- {
- #ifdef STM32F10X
- addr[0]=*(unsigned char*)(0x1ffff7ed); //芯片ID第5、6、7位作為addr
- addr[1]=*(unsigned char*)(0x1ffff7ee);
- addr[2]=*(unsigned char*)(0x1ffff7ef);
- #elif defined STM32FL151
- addr[0]=*(unsigned char*)(0x1ff80055);
- addr[1]=*(unsigned char*)(0x1ff80056);
- addr[2]=*(unsigned char*)(0x1ff80057);
- #elif defined ESP32 //esp32用戶自定義選擇--默認(rèn)隨機(jī)數(shù)
- addr[0]=srand()%255;
- addr[1]=srand()%255;
- addr[2]=srand()%255;
- #else
- addr[0]=srand()%255; //未選擇芯片類型則隨機(jī)指定地址
- addr[1]=srand()%255;
- addr[2]=srand()%255;
- #endif
-
- return 3*8; //地址碼位數(shù)
- }
- /**********************************電平時(shí)間參數(shù)設(shè)置初始化(自定義部分)************************************/
- void Witty433_Init(unsigned int set_level_buf[8]) //這個(gè)set_level_buf[8]數(shù)組保存的是各個(gè)電平時(shí)間,單位是us
- {
- SetStartLevelTime_433(set_level_buf[0],set_level_buf[1]); //設(shè)置起始碼 高 低 電平時(shí)間
- SetOneLevelTime_433(set_level_buf[2],set_level_buf[3]); //設(shè)置bit1 高 低 電平時(shí)間
- SetZeroLevelTime_433(set_level_buf[4],set_level_buf[5]); //設(shè)置bit0 高 低 電平時(shí)間
- SetEndLevelTime_433(set_level_buf[6],set_level_buf[7]); //設(shè)置結(jié)束碼 高 低 電平時(shí)間
-
- addr_len = GetAddrFromChipID(addr); //默認(rèn)選擇芯片ID的24Bit作為433地址碼,用戶可自行更改
- SetAddr_433(addr,addr_len);
-
- delay_us_433 = delay_us; //設(shè)置433微秒延時(shí)函數(shù)(自定義部分)
- delay_ms_433 = delay_ms; //設(shè)置433毫秒延時(shí)函數(shù)(自定義部分)
- witty433.delay_433 = delay_long_us;
- }
- /************************************* 433電平時(shí)間參數(shù)設(shè)置函數(shù) ****************************************/
- /* 設(shè)置起始碼電平時(shí)間 */
- void SetStartLevelTime_433(unsigned int time_H,unsigned int time_L)
- {
- witty433.StartLevelTime_H = time_H;
- witty433.StartLevelTime_L = time_L;
- }
- /* 設(shè)置結(jié)束碼電平時(shí)間 */
- void SetEndLevelTime_433(unsigned int time_H,unsigned int time_L)
- {
- witty433.EndLevelTime_H = time_H;
- witty433.EndLevelTime_L = time_L;
- }
- /* 設(shè)置bit0電平時(shí)間 */
- void SetZeroLevelTime_433(unsigned int time_H,unsigned int time_L)
- {
- witty433.ZeroLevelTime_H = time_H;
- witty433.ZeroLevelTime_L = time_L;
- }
- /* 設(shè)置bit1電平時(shí)間 */
- void SetOneLevelTime_433(unsigned int time_H,unsigned int time_L)
- {
- witty433.OneLevelTime_H = time_H;
- witty433.OneLevelTime_L = time_L;
- }
- /******************************* 433發(fā)送參數(shù)設(shè)置函數(shù) ****************************************/
- /* 設(shè)置地址碼 */
- void SetAddr_433(unsigned char *addr,unsigned int addrBitNum)
- {
- witty433.Addr = addr;
- witty433.AddrBitNum = addrBitNum;
- }
- /* 設(shè)置數(shù)據(jù)域 */
- void SetSendData_433(unsigned char *sendData,unsigned int sendDataBitNum)
- {
- witty433.SendData = sendData;
- witty433.SendDataBitNum = sendDataBitNum;
- }
- /* 設(shè)置連續(xù)發(fā)送次數(shù) */
- void SetSendNumber_433(unsigned char sendNumber)
- {
- witty433.SendNumber = sendNumber;
- }
- /******************************* 發(fā)送初始化函數(shù) ****************************************/
- /* 傳入發(fā)送參數(shù)內(nèi)容--數(shù)據(jù)域及發(fā)送次數(shù) */
- void SendInput_433(unsigned char *data,unsigned int dataBitNum,unsigned char sendNum)
- {
- SetSendNumber_433(sendNum); //設(shè)置sendNum連續(xù)發(fā)送次數(shù),不同廠商的可能不一樣,需要注意
- SetSendData_433(data,dataBitNum); //data數(shù)組是具體的控制數(shù)據(jù),dataBitNum是數(shù)據(jù)的位數(shù)
- }
- /*******************************發(fā)送一次433信號(hào)***************************************/
- void StartSend_433() //先傳入發(fā)送參數(shù),再發(fā)送
- {
- int i = 0;
-
- for(i = 0; i < witty433.SendNumber; i++)
- {
- SendStart_433();
- SendAddr();
- SendData();
- }
- SendEnd_433();
- }
- /************************************************************************************/
- /* 發(fā)送起始碼 */
- void SendStart_433()
- {
- Pin_433_H;
- witty433.delay_433(witty433.StartLevelTime_H);
-
- Pin_433_L;
- witty433.delay_433(witty433.StartLevelTime_L);
- }
- /* 發(fā)送地址碼 */
- void SendAddr()
- {
- unsigned char byteNum = witty433.AddrBitNum/8;
- unsigned char bitNum = witty433.AddrBitNum%8;
- unsigned char i = 0;
-
- for(i = 0; i < byteNum; i++)
- {
- SendBit_433(witty433.Addr[i],8);
- }
-
- SendBit_433(witty433.Addr[i],bitNum);
-
- }
- /* 發(fā)送數(shù)據(jù)域 */
- void SendData()
- {
- unsigned char byteNum = witty433.SendDataBitNum/8;
- unsigned char bitNum = witty433.SendDataBitNum%8;
- unsigned char i = 0;
-
- for(i = 0; i < byteNum; i++)
- {
- SendBit_433(witty433.SendData[i],8);
- }
-
- SendBit_433(witty433.SendData[i],bitNum);
-
- }
- /* 發(fā)送結(jié)束碼 */
- void SendEnd_433()
- {
- Pin_433_H;
- witty433.delay_433(witty433.EndLevelTime_H);
-
- Pin_433_L;
- witty433.delay_433(witty433.EndLevelTime_L);
- }
- /* 發(fā)送bit0 */
- void SendBit0_433()
- {
- Pin_433_H;
- witty433.delay_433(witty433.ZeroLevelTime_H);
-
- Pin_433_L;
- witty433.delay_433(witty433.ZeroLevelTime_L);
- }
- /* 發(fā)送bit1 */
- void SendBit1_433()
- {
- Pin_433_H;
- witty433.delay_433(witty433.OneLevelTime_H);
-
- Pin_433_L;
- witty433.delay_433(witty433.OneLevelTime_L);
- }
- /* 發(fā)送16進(jìn)制數(shù)據(jù)--1Byte */
- void SendHex_433(unsigned char byte)
- {
- SendBit_433(byte,8);
- }
- /* 發(fā)送bit數(shù)據(jù)--待發(fā)送數(shù)據(jù)及待發(fā)送數(shù)據(jù)bit數(shù)0~8 */
- void SendBit_433(unsigned char byte,unsigned char bitNum)
- {
- unsigned short data = (0x01<<bitNum)>>1; //
- unsigned char i = 0;
- for(i = 0;i < bitNum;i++)
- {
- if(byte & data)
- {
- SendBit1_433();
- }
- else
- {
- SendBit0_433();
- }
- data=data>>1;
- }
- }
復(fù)制代碼
51hei.png (4.79 KB, 下載次數(shù): 21)
下載附件
2023-10-25 02:55 上傳
程序不完整:
deal433-master.zip
(18.93 KB, 下載次數(shù): 17)
2023-10-24 22:21 上傳
點(diǎn)擊文件名下載附件
|
|