|
一,定時(shí)器初始化
/*******************************************************************************
* 函 數(shù) 名 : time1_init
* 函數(shù)功能 : 定時(shí)器1端口初始化函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void time1_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //聲明一個(gè)結(jié)構(gòu)體變量,用來初始化GPIO
TIM_ICInitTypeDef TIM1_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 開啟定時(shí)器1時(shí)鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清除TIMx的中斷待處理位:TIM 中斷源
TIM_TimeBaseInitStructure.TIM_Period =9999;//設(shè)置自動重裝載寄存器周期的值100MS
TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//設(shè)置用來作為TIMx時(shí)鐘頻率預(yù)分頻值,100Khz計(jì)數(shù)頻率
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
/* 設(shè)置中斷參數(shù),并打開中斷 */
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_4; //捕獲通道
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //xia沿捕獲
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射
TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分頻每個(gè)變化捕獲
TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不濾波
TIM_ICInit(TIM1, &TIM1_ICInitStructure);
/* 設(shè)置NVIC參數(shù) */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn; ////TIM1 捕獲中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //搶占優(yōu)先級為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //響應(yīng)優(yōu)先級為1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC4,ENABLE); //使能更新中斷和捕獲中斷
TIM_Cmd(TIM1, ENABLE); //使能定時(shí)器//使能或者失能TIMx外設(shè)
TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 ); //清除標(biāo)識
}
二、中斷處理
/* 遙控器解碼
*/
void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //檢查TIM1更新中斷標(biāo)識
{
overflow++;
}
if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) //檢查TIM1通道4捕獲標(biāo)識
{
if(state==WAIT_FALLING) // 捕獲下降沿
{
TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);//獲得輸入捕獲的值
yktimvalue = TIM1CH4_CAPTURE_VAL + (overflow*720);
//判斷高電平持續(xù)時(shí)間 大于 208a-87776vs 80a=33760vs/3520 a=422vs 3a=1266 vs
if(yktimvalue>8770)
{
ykaj_num = 0;
ykaj_value= 0;
}
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_RISING;
TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Rising); //設(shè)置上升沿觸發(fā)
}
else if(state==WAIT_RISING) //捕獲上升沿
{
TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);
yktimvalue = TIM1CH4_CAPTURE_VAL;
//判斷低電平持續(xù)時(shí)間 422 1266 vs
if(yktimvalue>40 && yktimvalue<50)
{
ykaj_bit=0;//收到數(shù)據(jù) 0
}
else if(yktimvalue>125 && yktimvalue<135)
{
ykaj_bit=1;//收到數(shù)據(jù) 1
}
ykaj_value<<=1;
ykaj_value+=ykaj_bit;
ykaj_num++;
if(ykaj_num>=24)
{
yk_keys =(u16)ykaj_value;
yk_keys&=0x0fff;
ykaj_value>>=12;
if(yk_keys==(u16)ykaj_value)
{
ykaj_bzok=1;
}
else
{
ykaj_num = 0;
ykaj_value= 0;
}
}
if(yktimvalue<40 || yktimvalue>135)
{
ykaj_num = 0;
ykaj_value= 0;
}
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_FALLING;
TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Falling); //設(shè)置下降沿觸發(fā)
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 ); //清除標(biāo)識
}
|
-
-
工程模板 - 遙控.7z
2019-12-20 13:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
216.63 KB, 下載次數(shù): 39, 下載積分: 黑幣 -5
評分
-
查看全部評分
|