軟體:
iar 7.4
stm32cubemx 4.14.0
硬體:stm32f103vbt6
原理圖,和手冊建議的基本一致,只是上拉電阻不是手冊建議的10k以上,這裡的面板距離控制器比較遠,可能是考慮到線阻。
hal配置,使用cubemx。
hs0038a2的輸出,帶有上拉電阻,接著乙個led燈,因此tim3的ic腳浮空。
設計者恰好把ir設計在tim3的通道4上。如果使用了通道1/2, 就可以使用pwm輸入方式來捕捉紅外脈衝,可以拿到每個脈衝的資料。
ic模式使用下降沿。
紅外控制這裡是常用的nec協議。遙控器輸出高電平,而hs0038a2轉換低電平輸出。 如,乙個9ms高+4.5ms的低,組成乙個header,out資料線上訊號是 9ms低+4ms高,空閒時資料線是高(避免干擾)。
因此,我們只檢測下降沿中斷,就可以識別紅外的乙個脈衝訊號(1幀訊號發出,9ms一開始就拉底,而後4.5ms拉高再拉低)。邏輯1為2.25ms,邏輯0為1.12ms.
tim3還給其他外設提供即時,所以這裡使用了1us的解析度。
需要啟用tim3的中斷,因為使用了freertos,所以其中斷設定到最低15級。也不怕其他外設中斷紅外讀取。
**.h
/*
* hs0038a2
* ir.h**/
#ifndef _ir_h
#define _ir_h
#include "tim.h"
#include "cmsis_os.h"
#define delta 200
#define header_min 13500 - delta
#define header_max 13500 + delta
#define data1_min 2250 - delta
#define data1_max 2250 + delta
#define data0_min 1120 - delta
#define data0_max 1120 + delta
#define ir_addr 2
typedef enum nec_state;
#endif
**.c:
/*
* ir.c
*/#include "ir.h"
extern osmessageqid q_irhandle;
static uint32_t ccr_prev = 0;
static uint32_t ccr_cur = 0;
static uint32_t timeout = 0;
static uint8_t pulse_cnt = 0;
static uint32_t ir_code;
nec_state state = necstate_idle;
void hal_tim_ic_capturecallback(tim_handletypedef *htim)
else
// 接收到資訊頭,就接收4個8位元組。。
。
// 校驗
if ((uint8_t)(~code[0])!=code[1] || (uint8_t)(~code[2])!=code[3])
return;
if (code[0] != ir_addr)
return;
// 放到佇列
if (q_irhandle != null)
}// 超時 110ms
if (timeout >= 110*1000)
ccr_prev = ccr_cur;
} //
}
檢測到資訊頭後,連續讀32bit到乙個uint32_t資料中。
這裡沒有依靠最後1給560us來做結束判斷,只是乙個 pulse_cnt>=32 來做判斷,開始寫到 pulse_cnt>=31,結果反碼總是差0x80。
最後分離出4個位元組,做位址檢測,以及校驗。 校驗是使用 ~ 取反碼,iar下需要強制轉換到uint8_t,否則判斷條件為假。
也沒有做連續按鍵處理。
超時處理,乙個是判斷脈衝持續時間在3ms內,另乙個是判斷脈衝總時間在110ms內。
因為板子用可控矽控制罩極電機,啟動電機後,能看到out輸出干擾訊號,但是被headr判斷給擋掉了。
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
STM32F103啟動檔案
目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...
關於STM32F103精確延時
為了相容freertos,所以將延時函式統一規範,後續使用方便移植。此延時針對無晶振,示例為系統倍頻64mhz,型號 stm32f103c8t6。新建system資料夾,新增兩個檔案,delay.c和delay.h 以下為delay.c內容 其中系統已倍頻為64m include stm32f10x...