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