我想用TIM3的输入捕获来解码红外,需要使用到库函数TIM_GetITStatus,TIM_ClearITPendingBit和TIM_GetCapture3,我在开头添加了#include "stm32f10x_tim.h"
可是编译的时候一直说T“EST.axf: Error: L6218E: Undefined symbol TIM_ClearITPendingBit (referred from timer.o).”
是不是需要把库函数的那个stm32f10x_tim.c文件添加进工程,那个文件在哪里可以找到?还是有其他办法。
#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;
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
//void SysTick_Handler(void)
//{
// TimingDelay_Decrement();
//}
//定时器3中断服务程序
//
void TIM3_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( TIM3, TIM_IT_CC3 ))
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
//ccd[id ++ ] = TIM_GetCapture2(TIM3) ;
cur = TIM_GetCapture3(TIM3) ;
#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
}
last = cur ;
}
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
TIM3->EGR|=0X08;
TIM3->SR|=0X0808;
TIM3->CCMR2|=0X0001; //TI3输入,每个边沿采样
TIM3->CCER|=0X0300; //下降沿捕获,捕获使能
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
|