原子大哥,我又来了。。。还是那个红外解码的问题,我尝试了用TIM2的CH2来做红外的输入捕获,然后解码。编了个程序,但是实现不了,由于刚上手,参考其他人的程序,再到例程里修改的,麻烦你帮我看看是中断没设置好,还是其他什么问题,拜托了。(还是对开发板附带的遥控解码)
#include <stm32f10x_lib.h>
#include "stm32f10x_tim.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
#include "timer.h"
#include "lcd.h"
//#include "24cxx.h"
//#include "flash.h"
//#include "24l01.h"
//#include "mmc_sd.h"
#include "remote.h"
//Mini STM32开发板范例代码21
//红外遥控 实验
//正点原子@ALIENTEK
//2010.6.17
extern vu8 startflag;
vu16 ccd [80] = {0} ;
int main(void)
{
int i;
u8 k1;
u8 k2;
// u8 k3;
// u8 k4;
// u8 k5;
// u8 k6;
Stm32_Clock_Init(9);//系统时钟设置
RCC->APB2ENR|=0X0000483D; //使能IOA,B,C,D,AFIO,USART1,TIM1,2,3,4
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LCD_Init(); //初始化液晶
LED_Init(); //LED初始化
  OINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"REMOTE TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"2010/6/17");
LCD_ShowString(30,130, "KEY1:");
// LCD_ShowString(30,150, "KEY2:");
// LCD_ShowString(30,170, "KEY3:");
Remote_Init(); //初始化红外接收
Timerx_Init(65535,29);
// LCD_ShowString(30,130, "KEYVAL:");
// LCD_ShowString(130,130,"KEYCNT:");
// LCD_ShowString(30,150, "SYMBOL:");
while (1)
{
delay_ms(10);
if(startflag==1) //接收到遥控码
{
startflag=0;
k1 = 0 ;
for(i= 0 ;i< 8 ; i++ )
{
k1 |= ccd[16+i]<<i ; //第三字节
}
k2 = 0 ;
for(i= 0 ;i< 8 ; i++ )
{
k2 |= ccd[24+i]<<i ; //第四字节
}
if(k1 + k2 == 255)
{
USART1->DR=k1;
LCD_ShowNum(40,130,k1,3,16);//显示设备码
printf("get key intput %2X \r\n" , k1 ) ;
}
}
}
}
#include "remote.h"
#include "delay.h"
//Mini STM32开发板
//红外遥控接收 驱动函数
//正点原子@ALIENTEK
//2010/6/17
//初始化红外接收引脚的设置
void Remote_Init(void)
{
RCC->APB2ENR|=1<<2; //PA时钟使能
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000080; //PA1输入
GPIOA->ODR|=1<<1; //PA.1上拉
Ex_NVIC_Config(GPIO_A,1,FTIR);//将line1映射到PA.1,下降沿触发.
}
#include <stm32f10x_lib.h>
#include "stm32f10x_tim.h"
#include "timer.h"
#include "led.h"
//Mini STM32开发板
//通用定时器 驱动代码
//正点原子@ALIENTEK
//2010/6/1
vu8 irtime,irCode; //红外用全局变量
vu8 irpro_ok,irok; //完成标志位
vu8 IRcord[4],irdata[33];
vu8 beginIRrcv=0;//开始接收到遥控的标志
vu8 irNum;
vu8 startflag;
//定时器2中断服务程序
//
void TIM2_IRQHandler(void)
{
//if(TIM3->SR&0X0001)//溢出中断
//{
// LED1=!LED1;
//}
//TIM3->SR&=~(1<<0);//清除中断标志位
extern vu8 startflag;
extern vu16 ccd [80] ;
static int id = 0 ;
static vu16 cur = 0 ;
static vu16 last = 0 ;
u16 step ;
int fh;
if(TIM_GetITStatus( TIM2, TIM_IT_CC2 ))
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
//ccd[id ++ ] = TIM_GetCapture2(TIM3) ;
cur = TIM_GetCapture2(TIM2) ;
#if 1
if(cur > last )
{
step = cur - last ;
}
else
{
step = 65535 - last + cur ;
}
//step 为两次捕获的计数值的差,为了避免浮点数运算,此处,把浮点数放大十倍,转换成整数计算。
fh = step *10 / (2400) ;
if( (fh > 130) && (fh <140) ) //同步开始头,13.5ms
{
id = 0 ;
}
else if( (fh > 9 ) && (fh <13 )) // 1.125ms
{
ccd[id ++ ] = 0 ;
}
else if( (fh > 20 ) && (fh <24 )) // 2.245ms
{
ccd[id ++ ] = 1 ;
}
// else if( (fh > 40 ) && (fh <60 )) // 5ms,后置单脉冲
// {
// id = 0 ;
// startflag=1;;
// }
#endif
if(id >=32)
{
id = 0 ;
startflag=1;
//TIM_Cmd(TIM3, DISABLE );
// cur =
//TIM_ITConfig( TIM3, TIM_IT_CC2 , DISABLE) ;
}
}
last = cur ;
}
|