|
stm32F407 用的TIM的ETR功能,引脚是PA15,TIM2 ETR计数一直是0,不知哪里配置错了?
void TIM2_ETR_Config(void)//0.5s TIM2 32bit 42MHz
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIMER4 CLK = 18M MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* GPIOE clock enable */
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN;//GPIO_Mode_IN_FLOATING; //GPIO_Mode_IPU ;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设为推挽模式 //
GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;//GPIO_PuPd_UP;// GPIO_PuPd_NOPULL; // 无需上下拉电阻 //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_TIM2);//GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period =0xFFFF;//当计数器从0记到FFF为一个周期,自动装载寄存器ARR中的值
TIM_TimeBaseStructure.TIM_Prescaler = 0X00; //
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//设置时钟系数 不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration
TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF); //配置外部触发,否则不会计数
//TIM_ExtTRGPolarity设置TIMx外部触发极性。
//TIM_ExtTRGPolarity_Inverted:TIM外部触发极性翻转:低电平或下降沿有效
//TIM_ExtTRGPolarity_NonInverted:TIM外部触发极性非翻转:高电平或上升沿有效
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);//配置外部时钟模式2TIM_ExtTRGPolarity_NonInverted
TIM_SetCounter(TIM2, 0); //设置计数器为0
TIM_Cmd(TIM2, ENABLE);//Enables or disables the specified TIM peripheral.
}
void TIM3_IRQHandler(void)
{
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();
OSIntNestingCtr++;
CPU_CRITICAL_EXIT();
//if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
//{
// counter_capture = TIM4->CNT;
//TIM4->CNT = 0;
//counter_capture=TIM_GetCapture1(TIM2); //输入捕获值
//counter_val=TIM_GetCounter(TIM2);
//TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
//}
/* 在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换 */
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
Frequency_value = TIM_GetCounter(TIM2)*2;//单位khz
// TIM_SetCounter(TIM2, 0);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
OSIntExit();
} |
|