1. 程式人生 > >STM32HAL----紅外遙控(NEC)

STM32HAL----紅外遙控(NEC)

整理了一個NEC協議的紅外程式,NEC協議,物理環境為F103原子戰艦V3,使用STM32CubeMX生成初始程式。

定時器配置72分頻,9999裝載值(10MS)

NEC協議:

資料格式: 同步碼頭 + 地址碼 +地址反碼 + 按鍵碼 + 按鍵反碼 (LSB先行

同步碼頭:9ms低電平 + 4.5ms高電平

連發碼 :   9ms低電平 + 2.5ms高電平

邏輯1:      560us  +  1680us

邏輯0:      560us  +  560us

程式:

標頭檔案:

#ifndef __Fun_Infrared_H
#define __Fun_Infrared_H


#include "stm32f1xx_hal.h"
#include "tim.h"


#define  RangJudge(val,min,max)   (val>min? (val<max? 1 : 0) : 0)


typedef struct T4_Infrared
{
        uint32_t  KEY_VALUE;   //記錄32位地址以及按鍵碼
	uint16_t  TriTime[2];  //記錄電平持續時間 0:低電平  1:高電平
	uint8_t   DataBit;
	uint8_t   FrameStart;
        uint8_t   KEY_Count;	
	uint8_t   TriPolarity;
	
}T4_InfraredDev;


extern T4_InfraredDev  *T4Infra;






void T4InfraInit(void);

void TIM4_InfraPeriodHandle(void);

void TIM4_InfraCaptureHandle(void);

uint8_t  GetInfraredKey(void);
	
uint8_t  GetInfraredAddr(void);

#endif

原始檔:

#include "Fun_Infrared.h"


T4_InfraredDev  T4Infra_S, *T4Infra = &T4Infra_S;


void T4InfraInit(void)
{
        HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);
	__HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);  //使能更新中斷
	
	T4Infra->TriPolarity = 0;
	T4Infra->FrameStart = 0;
}


//改變TIM4 CHANNEL4的捕獲極性
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
{
  uint16_t tmpccer = 0;

  tmpccer = TIMx->CCER;

  tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P);
  tmpccer |= (uint16_t)(TIM_OCPolarity << 12);

  TIMx->CCER = tmpccer;
}


//捕獲中斷處理函式
void TIM4_InfraPeriodHandle(void)
{
	T4Infra->TriPolarity = 0;
        T4Infra->FrameStart = 0;
	T4Infra->TriTime[0] = 0;
	T4Infra->TriTime[1] = 0;
}


//捕獲中斷處理函式
void TIM4_InfraCaptureHandle(void)
{

	  T4Infra->TriPolarity = !T4Infra->TriPolarity;
	
	  /************************** 切換極性以及捕獲電平持續時間 **************************/
	
	     if(!T4Infra->TriPolarity)  //上升沿觸發
		{
			TIM_OC4PolarityConfig(TIM4, TIM_INPUTCHANNELPOLARITY_FALLING);			
			
			T4Infra->TriTime[T4Infra->TriPolarity] = \
                        HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);			
		}
		else  //下降沿觸發
		{
			TIM_OC4PolarityConfig(TIM4, TIM_INPUTCHANNELPOLARITY_RISING);
			
                         if(T4Infra->FrameStart == 1) 
			{
                             T4Infra->TriTime[T4Infra->TriPolarity] = \
                             HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);
			}					
			
                        T4Infra->FrameStart = 1;	//開始接收幀	   			
		}	
		
		TIM4->CNT = 0; 	//清除TIM4計數值

	  /**************************** 判斷同步碼以及重複碼 ***************************/
		
		if(RangJudge(T4Infra->TriTime[0],8500,9500) && \
                   RangJudge(T4Infra->TriTime[1],4000,5000) ) 
		{
			 T4Infra->KEY_VALUE = 0;  //同步碼
			 T4Infra->KEY_Count = 0;  
                         T4Infra->DataBit = 0;  		
		}		
		else if(RangJudge(T4Infra->TriTime[0],8500,9500) && \
                        RangJudge(T4Infra->TriTime[1],2000,3000) ) 
		{
			 if(++T4Infra->KEY_Count > 250) T4Infra->KEY_Count = 250;    //連發碼
		}
	
	  /********************************* 接收資料 *********************************/		
		if( T4Infra->TriPolarity == 1) 
		{
                      if(RangJudge(T4Infra->TriTime[0],450,650) && \
                         RangJudge(T4Infra->TriTime[1],450,650) ) 
			{
			   T4Infra->KEY_VALUE &= ~(1<T4Infra->DataBit++);
			}
			 
                        else if(RangJudge(T4Infra->TriTime[0],450,650) && \
                              RangJudge(T4Infra->TriTime[1],1450,1750) ) 
			{
			   T4Infra->KEY_VALUE |= 1<<T4Infra->DataBit++;
			}
		}	
		
		
}


//獲取按鍵值
uint8_t  GetInfraredKey(void)
{
   //通過與反碼異或,驗證按鍵碼的正確性
   if( (uint8_t)( (T4Infra->KEY_VALUE >> 24) ^ (T4Infra->KEY_VALUE >> 16) ) == 0xff  )
   return (uint8_t)(T4Infra->KEY_VALUE>>16);
	 
   else  return 0;
}


//獲取地址
uint8_t  GetInfraredAddr(void)
{
   if( (uint8_t)( (T4Infra->KEY_VALUE ) ^ (T4Infra->KEY_VALUE >> 8) ) == 0xff  )
   return (uint8_t)(T4Infra->KEY_VALUE);
	 
   else  return 0;
}

主函式:

#include "Fun_Infrared.h"

int main(void)
{
  HAL_Init();


  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM4_Init();
  MX_USART1_UART_Init();

  T4InfraInit();  //啟動TIM4

  while (1)
  {
		printf("按鍵次數:%d\r\n",T4Infra->KEY_Count);
                printf("鍵值:0x%02X\r\n",GetInfraredKey() );
		printf("地址:0x%02X\r\n",GetInfraredAddr() );
		HAL_Delay(2000);
  }

}



//更新中斷
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM4)
	{
	  TIM4_InfraPeriodHandle();
	}
}



//捕獲中斷
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{

    if(htim->Instance == TIM4)
	{
		TIM4_InfraCaptureHandle();
	}
}

實驗現象:

相關推薦

STM32HAL----紅外遙控NEC

整理了一個NEC協議的紅外程式,NEC協議,物理環境為F103原子戰艦V3,使用STM32CubeMX生成初始程式。 定時器配置72分頻,9999裝載值(10MS) NEC協議: 資料格式: 同步碼頭 + 地址碼 +地址反碼 + 按鍵碼 + 按鍵反碼 (LSB先行)

STM32Hal庫學習CubeMx學習點亮LED燈[轉載]

STM32Hal庫學習(一)CubeMx學習點亮LED燈 2018年07月10日 01:05:03 靜守己心 閱讀數:174更多 個人分類: STM32 cubemx安裝: MDK5安裝+破解+pack 言歸正傳 新建工程選擇是STM32型

STM32Hal庫學習CubeMx學習外部中斷

外部中斷主要是在CubeMx中設定好GPIO在引腳介面配置成中斷然後configuration裡對GPIO配置對於低電平觸發中斷,需要把GPIO設定為上拉,然後下降沿觸發,反之高電平觸發,反過來對NVIC配置在生成的程式裡stm32f1xx_it.c裡有EXTI0中斷處理函式

紅外遙控協議-NEC協議

為方便理解所看到的波形是從紅外接收管出來的訊號,跟協議所說的訊號高低(0或1)剛好相反。    NEC協議是眾多紅外遙控協議的其中一種,除NEC外,還有RC5、RC6等其它的。市面上買到的非學習型萬能電視遙控器大多整合一種或多種編碼是NEC型的,我買的二個遙控器中就有

android 空調遙控器——紅外裝置基礎

最近專案中需要用到 用android 手機控制空調,於是小編就下了心思研究了一下紅外開發,去網上查了查,這方面的內容少之又少,所以決定自己搞一搞,好了廢話不多說,開搞! 1、要求:呼叫手機紅外裝置需要注意,你得看看手機上有沒有紅外發射器(本人的是榮耀V8,自帶

紅外線遙控協議簡介NEC格式

      平常工作中接觸的都是NEC格式的遙控器,這裡也只講NEC格式的。      當按下遙控器的一個按鍵時,會發出一幀的資料,這一幀的資料的組成分別是:引導碼、地址碼、地址碼的反碼、資料碼和資料碼的反碼。當傳送的地址為00h(00000000b),傳送的紅外資料為ADh

51微控制器萬能紅外遙控學習通過波形學習

最近公司需要開發一款紅外萬能學習模組,利用手機app控制,紅外模組需要帶有紅外接收模組,和發射模組。剛開始我用普遍的紅外四位元組時序成功的學習到資料和發射,但後來發現空調的編碼位元組數是不一樣的,公司要求只需要學習到空調的碼就可以,不需要像空調一樣,一個按鍵多次按發射不同的

基於ardunio的遙控小車含有藍芽遙控紅外遙控、有線手柄遙控、無線手柄遙控、無線收發遙控

遙控小車是每個人童年的最愛,不僅好奇它的奇妙,更是喜歡它帶來的刺激。小編為大家帶來幾篇部落格,來給大家講講製作遙控小車的程式。 看大標題可知我們一共有五個方法去製作一款帶有遙控功能的小車,小編分開來給大家講解。 本文是基於arduino的手柄(有線)遙控小車

46.Linux-分析rc紅外遙控平臺驅動框架,修改內核的NEC解碼函數BUG(1)

進入 checksum 開始 紅外遙控 中斷函數 height clas margin 復習 內核版本 : Linux 3.10.14 rc紅外接收類型: GPIO 類型的NEC紅外編碼 本章內容 1) rc體系結構分析 2)

Scratch小課堂2遙控汽車

1、案例演示: 2、手把手教學: 程式設計超人手把手教你學Scratch(2):遙控汽車 Scratch軟體各部分介紹: 程式設計超人手把手教你學Scratch(2):遙控汽車 第二步:增加背景: 滑鼠點選,舞臺下方的【從背景庫中選擇背景】按

jzoj1207. 遙控二分

1207. 遙控車 Description 平平帶著韻韻來到了遊樂園,看到了n輛漂亮的遙控車,每輛車上都有一個唯一的名字name[i]。韻韻早就迫不及待地想玩名字是s的遙控車。可是韻韻畢竟還小,她想象的

46.Linux-分析rc紅外遙控平臺驅動框架,修改核心的NEC解碼函式BUG(1)

static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) { struct nec_dec *data = &dev->raw->nec; u32 scancode

基於樹莓派3B+,一個可以遙控的小車

#include <linux/init.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/platform_device.h> #include <linux/gpi

PiLarm: 行動式樹莓派警報器紅外感應+拍照+警報

本文由 極客範 - 克拉克101 翻譯自 Jeff Highsmith。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末尾處的要求。 我一直在尋找一些能給自己孩子帶來教益的瞬間。當我五歲的兒子來尋求我的幫助,別再讓他的弟弟偷偷溜進他的房間的時候,我突然靈光一

無需程式設計,DIY自己智慧小車的Android藍芽遙控軟體

 很多熱衷於玩微控制器小車、機器人的童靴,往往也向往著有天能自己編寫一個Android手機的遙控程式,通過自己的手機遙控小車,微控制器程式用C語言或者彙編什麼的都可以容易完成,,無奈要寫一個上位機的Android控制程式就要會java、還要學一點xml知識,對於只學過C

樹梅派3B紅外、433&315全連線及家居智慧控制315&433篇

315&433篇硬體:樹莓派3B ,315&433發射、接收器     軟體:433Utils  系統:raspbian(最新版(2017-11-29-raspbian-stretch)測試不通過,原因不明,我使用的是2017-04-10-raspbian-j

HC-SR505紅外感應模組驅動STM32

一、前期準備 微控制器:STM32F103ZET6 開發環境:MDK5.14 庫函式:標準庫V3.5 HC-SR505紅外感應模組:淘寶有售 二、實驗效果 三、驅動原理 這個模組比較簡單,當有人靠近時候其IO輸出3.3V,STM32可以直接採集。 需要完整工

基於背景建模的紅外運動目標檢測

前邊講到前景檢測後形態學處理,濾除大部分孤立噪點,並且能夠將距離相近,屬於同一目標的區域連線在一起。 在進行形態學處理後,二值圖上分佈著為數不多的亮點連通區域。在我們的思維裡,每個連通區域隸屬於同一個目標,但是計算機並不知道,在計算機眼裡,它依然是一幅影象,是一

bluetooth控制Arduino微控制器的紅外發射裝置——Arduino部分

開學初,聽到某同學在臺灣留學時候,成功使用Android手機通過bluetooth裝置控制Arduino微控制器來實現對宿舍空調的遙控。當時就覺得蠻有趣的,但是他的Android手機程式是通過Appinventor寫的,我就想是否自己能夠通過Eclipse來重新實現這一過程

STM32HAL----USB模擬串列埠VCP

      想要實現的功能是,USB模擬串列埠收發資料。串列埠助手傳送資料至MCU,MCU接收後返回給串列埠助手。       當初是想用標準庫做這個功能的。但是因為後來瞭解到STM32CubeMX這個軟體,在嘗試之後實在是感覺,太方便了。所以,並沒有使用標準庫,而是直接用