花了整整兩天時間終於算是基本把紅外解碼搞明白了,其實並不是很難,用了兩天時間,說來慚愧啊,原因就是細節上的問題,不過最終總算找出問題來了。使用外部中斷來解碼,就先對外部中斷進行配置吧
void exti_init()
rcc->apb2enr|=1<<0;//使用外部中斷要開afio復用時鐘,因為要用到用到它的暫存器來選擇出發io口
afio->exticr[2]|=1<<4;//將出發外部中斷的io配置為pb.9
exti->imr|=1<<9;//中斷線9的中斷開啟
exti->emr|=1<<9;//時間也開啟
exti->rtsr|=1<<9;//上公升沿出發中斷
開始,弄了還幾次程式,發現總是我乙個勁的按遙控,訊號燈卻一直不閃爍,我勒個去。原來是把afio的exticr暫存器給忘了,預設值的出發中斷io當然是pa口啦,我用的是pb口,所以一定要配置一下啦,也是很久沒有使用外部中斷的緣故吧!老是不用忘了也是正常的!所以要多學多用啊!
pb.9口配置為上拉輸入,不解釋
外部中斷口配置好了,電路也是連線好的,接下來就是中斷服務程式了,中斷服務程式切記盡量不要新增任何延時,不然後果會很麻煩的!切記中斷的作用就是根據外部的環境變化迅速的作出反應,所以時間越短越好,如果做不到這一點,在大的工程中盡量少用,不然除了問題很難找到原因,浪費時間
中斷服務程式如下
void exti9_5_irqhandler(void)
if(exti->pr&0x200)//判斷是否是pb.9的邊沿觸發的中斷
if(cs==1)//發生上公升沿捕獲
exti->rtsr&=~(1<<9);
exti->ftsr|=1<<9;//中斷觸發方式改為下降沿
exti->pr|=1<<9;
dcb=1;//乙個資料位要根據高電平的持續時間來判定,故上公升沿和下降沿必然是成對出現的
num=0;//計數清零,開始計時
if(cs==0)//發生下降沿捕獲
if(dcb==1) //判斷之前是否有上公升沿
dcb=0;
exti->rtsr|=1<<9;//改為上公升沿捕獲
exti->ftsr&=~(1<<9);
if(num>210&&num<235)//判定是否為同步碼
led1=~led1;
ok1=1;//如果是同步碼 那麼第一把鑰匙就到手啦
if(ok1==1)//接收到同步碼以後,就可以開始接收資料了
if(num>70&&num<90)
data=(data<<1);
data|=1<<0;//邏輯1
ray_flag++;
if(num>15&&num<40)
data=(data<<1);
data&=~(1<<0);//邏輯0
ray_flag++;
if(ray_flag==32)//接收到4位元組資料
ok2=1;//得到第二把鑰匙
led0=~led0;
exti->pr|=1<<9;//掛起暫存器清零
服務程式也寫好了,接下來就要寫主程式了
int main()
stm32_clock_init(9);//時鐘初始化
delay_init(72);//延時初始化
gpio_init();//io初始化
nvic_init();//中斷編號初始化
exti_init();//外部中斷初始化
usart1_init();//串列埠初始化
while(1)
time();
if(ok1==1&&ok2==1)//兩把鑰匙都有啦,就可以把接收到的資料列印出來啦
exti->imr&=~(1<<9);
ok1=0;
ok2=0;
ray_flag=0;
usart1_senddata(data);
exti->imr|=1<<9;
STM32 紅外遙控器
紅外 原理 遙控器作為發射器,發射38khz的載波,接收器在接收到載波時為低電平 按照nec protocol的pwm,該協議的特點 1 8位位址和8位指令長度 2 位址和命令分兩次傳送,並有傳送位址和命令反碼,便於校驗,確保傳輸的準確 3 pwm脈衝位置調製,以發射紅外載波的占空比來表示 0 和 ...
STM32紅外遙控NEC協議
正點原子紅外遙控實驗 nec協議發出的一幀資料報括 同步 引導 碼,位址碼,位址反碼,控制碼,控制反碼,連發 重複 碼 其中位址碼,位址反碼,控制碼,控制反碼的邏輯 1 和邏輯 0 表示如下 邏輯 1 2.25ms 560us脈衝 1680us低電平 邏輯 0 1.125ms 560us脈衝 560...
STM32外部中斷
一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...