stm32紅外遙控的外部中斷實現

2021-08-27 23:45:51 字數 1929 閱讀 7147

花了整整兩天時間終於算是基本把紅外解碼搞明白了,其實並不是很難,用了兩天時間,說來慚愧啊,原因就是細節上的問題,不過最終總算找出問題來了。使用外部中斷來解碼,就先對外部中斷進行配置吧

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可支援...