|
发表于 2012-10-16 22:54:31
|
显示全部楼层
同分享一个stm32的解码程序,自己写的,但是目前还之能解一个通道,大家可以一起完善……
中断配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //设TIM2输入捕获中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //配置优先级组
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;
TIM配置(用的是TIM2)
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_TimeBaseInitStruct.TIM_Period = 0xffff; // 计数上限为最大
TIM_TimeBaseInitStruct.TIM_Prescaler = 72; // 计数器频率
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; // 不分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct ); // 初始化TIM2的时基单元
TIM_ITConfig(TIM2,TIM_IT_Update, DISABLE );
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;// 选择通道1
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿触发(根据示波器实验观察结果调整)
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 每次检测到捕获输入就触发一次捕获
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择
TIM_ICInitStruct.TIM_ICFilter = 0x5;
TIM_ICInit(TIM2,&TIM_ICInitStruct );
TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE );
TIM_ClearFlag(TIM2,TIM_FLAG_CC1 );
中断函数
void TIM2_IRQHandler(void)
{
TIM_ICInitTypeDef TIM_ICInitStruct;
if(j==0)
{
j=1;
TIM2->CNT = 0x00;
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;// 选择通道4
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling; // 下降沿触发(根据示波器实验观察结果调整)
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 每次检测到捕获输入就触发一次捕获
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择
TIM_ICInitStruct.TIM_ICFilter = 0x5;
TIM_ICInit(TIM2,&TIM_ICInitStruct );
TIM_ClearFlag(TIM2,TIM_FLAG_CC1 );
TIM_ITConfig(TIM2, TIM_IT_CC1,ENABLE);
}
else
{
j=0;
buffer = TIM2->CNT;
USART_SendData(USART1, buffer);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;// 选择通道4
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿触发(根据示波器实验观察结果调整)
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 每次检测到捕获输入就触发一次捕获
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择
TIM_ICInitStruct.TIM_ICFilter = 0x5;
TIM_ICInit(TIM2,&TIM_ICInitStruct );
TIM_ClearFlag(TIM2,TIM_FLAG_CC1 );
TIM_ITConfig(TIM2, TIM_IT_CC1,ENABLE);
}
}
在主函数中: TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM2,ENABLE);
|
|