初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2014-2-14
- 在线时间
- 23 小时
|
我输入频率为20Hz矩形波,高电平时间应为25ms,而通过定时器读出的高电平时间是50ms,正好是高电平的两倍。我用的是STM32F103CBT6,将TIM2_CH4映射到PB11捕获。捕获程序时参考原子哥的教程。不知是哪处问题了,小弟求教一下!配置也检查了没啥问题。
程序部分:配置定时器TIM2_CH4:
void Tim2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM2_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
TIM_TimeBaseStructure.TIM_Prescaler=71;//
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//
TIM_TimeBaseStructure.TIM_Period=0xFFFF;//
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//TDTS=Tck_tim
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM2_ICInitStructure.TIM_Channel=TIM_Channel_4;//TIM2_CH4
TIM2_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//
TIM2_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//
TIM2_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//
TIM2_ICInitStructure.TIM_ICFilter=0x00;//IF
TIM_ICInit(TIM2,&TIM2_ICInitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC4,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
中断函数:
void TIM2_IRQHandler(void)
{
if((TIM2CH4_CAPTURE_STA&0x80)==0)//
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//
{
if(TIM2CH4_CAPTURE_STA&0x40)//
{
if((TIM2CH4_CAPTURE_STA&0x3F)==0x3F)//
{
TIM2CH4_CAPTURE_STA|=0x80;//
TIM2CH4_CAPTURE_VAL=0xFFFF;
}else TIM2CH4_CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)//
{
if(TIM2CH4_CAPTURE_STA&0x40)//
{
TIM2CH4_CAPTURE_STA|=0x80;//
TIM2CH4_CAPTURE_VAL=TIM_GetCapture4(TIM2);//
TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising);//
}else //
{
TIM2CH4_CAPTURE_STA=0;
TIM2CH4_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH4_CAPTURE_STA|=0x40;//
TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Falling);//
}
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update | TIM_IT_CC4);//
}
主函数:#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart1.h"
#include "AD5628.h"
#include "sin_exti.h"
#include "timer.h"
uint16_t m_Light_Frist[8]={300,300,300,300,300,300,300,300};
extern uint8_t TIM2CH4_CAPTURE_STA;
extern uint16_t TIM2CH4_CAPTURE_VAL;
int main(void)
{
uint32_t temp=0;
// uint16_t m_value=4000;
SystemInit();
Delay_Init();
USART1_Config();
NVIC_Configuration();
LED_GPIO_Config();
USART1_Config();
Tim2_GPIO_Config();
while(1)
{
if(TIM2CH4_CAPTURE_STA&0x80)//
{
temp=TIM2CH4_CAPTURE_STA&0x3F;
temp*=65536;//
temp+=TIM2CH4_CAPTURE_VAL;//
printf("HIGH:%d us\r\n",temp);
TIM2CH4_CAPTURE_STA=0;//
}
}
}
|
|