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這個軟體,在嘗試之後實在是感覺,太方便了。所以,並沒有使用標準庫,而是直接用