來源:百問網_嵌入式Linux wiki_jz2440 新1期視頻維基教程 (視頻文字版)
作者:韋東山
本文字數:1687,閱讀時長:2分鐘
先打印出原始數據
irda_raw.c irda_raw.h
獲取電平極性方式,當前引腳極性電平取反
#include ../../s3c2440_soc.h #include irda_raw.h /* IRDA引腳 : EINT1/GPF1 */ static unsigned long long g_last_time = 0; /* * 配置GPIO, 注冊中斷 * 在中斷處理函數裡: 記錄中斷發生的時間, 跟上次中斷的時間比較, 計算出脈沖寬度 讀取引腳極性 把數據放入環型緩沖區 */ /* 先實現GPIO的基本操作 */ static void irda_data_cfg_as_eint(void) { /* 配置為中斷引腳 */ GPFCON GPFCON |= (2 /* 設置中斷觸發方式: 雙邊沿觸發 */ EXTINT0 |= (7 /* eint1 */ } static int irda_data_get(void) { /*如果bit1 等于1就表明高電平,返回1 */ if (GPFDAT 1)) return 1; else return 0; } /*irda中斷處理函數*/ void irda_irq(int irq) { /* 在中斷處理函數裡: 記錄中斷發生的時間, 跟上次中斷的時間比較, 計算出脈沖寬度 讀取引腳極性 把數據放入環型緩沖區 */ irda_raw_event event; /*獲得當前時間并賦值給cur*/ unsigned long long cur = get_system_time_us(); /*上次時間和這次時間的差值,也就是周期*/ event.duration = delta_time_us(g_last_time, cur); /*獲取引腳極性*/ event.pol = !irda_data_get(); /*我們需要環形緩沖區的函數放入環形緩沖區 */ ir_event_put( /*更新時間*/ g_last_time = cur; } /* 注冊中斷 仿照之前的按鍵中斷程序 */ void irda_init(void) { /*1. 配置為中斷引腳 * 2. 配置為雙邊沿觸發 */ irda_data_cfg_as_eint(); /*注冊中斷*/ register_irq(1, irda_irq); } /*測試原始數據*/ void irda_raw_test(void) { irda_raw_event event; unsigned long long pre = 0, cur; irda_init(); while (1) { /*如果從喚醒緩沖區讀到數據,就把它打印出來*/ if (0 == ir_event_get(&event)) { cur = get_system_time_us(); /*如果這次時間和上次時間相差遠的話,就打印回車換行*/ if (delta_time_us(pre, cur) 1000000) printf(\n\r pre = cur; /*使用三目運算符來判斷pol是高電平還是低電平*/ printf(%s %d us | , event.pol? hight : low, event.duration); } } }
irda_raw.h定義極性和脈沖寬度結構體
#ifndef _IRDA_RAW_H #define _IRDA_RAW_H typedef struct irda_raw_event { int pol; /* 極性 */ int duration; /* 脈沖寬度, us */ }irda_raw_event, *p_irda_raw_event; #endif /* _IRDA_RAW_H */
測試代碼 修改main.c 在main主函數中增加
irda_rae_test();
修改Makefile 增加
objs = sensors/irda/irda_raw.o
編譯執行
一開始時間很長是因為一上電的時候高電平,值打印的特别大,說明有問題
irda中斷函數中沒有更新上一次的時間
/*更新時間*/ g_last_time = cur;
再次更新
時間和數據格式符合時序要求
「新品首發」STM32MP157開發闆火爆預售!首批僅300套
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!