不知道哪里出问题了??不能进入中断。。
main()
{
#ifdef DEBUG
debug();
#endif
/*定时器中断的配置顺序:开启时钟→设置中断向量→引脚初始化→设置TIM_Cfg→开启TIM→中断函数*/
RCC_ConfigSelectHSE(); //初始化时钟
NVIC_Configuration2(); //设置中断向量
GPIO_cfg(); //初始化I/O
Init_TIM(); //初始化定时器
TIM4_IRQHandler();
}
void RCC_ConfigSelectHSE(void)
{
RCC_ClocksTypeDef RCC_Clocks;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Disable HSI */
RCC_HSICmd(DISABLE) ;
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
if(RCC_WaitForHSEStartUp() == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2); //时钟延迟,当系统时钟为72M时,
//此处应为 Flash 2 wait state ,这点非常重要!!!!
/* Disable PLL */
RCC_PLLCmd(DISABLE);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1); //72M
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); //36M
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); //72M
/* ADCCLK = PCLK2/8 */
RCC_ADCCLKConfig(RCC_PCLK2_Div8); //ADC_Clk=9M (the max clk is 14M)
/* PLLCLK = 12MHz*6= 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
RCC_GetClocksFreq(&RCC_Clocks);
/* Enable peripheral clocks --------------------------------------------------*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
}
void GPIO_cfg(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*初始化PB6作为信号接收端口---TIM4——CH1 无重映射*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*初始化PC5作为测试端口,若有中断进入拉高PC5脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*初始化PC5作为测试端口,若有中断进入拉高PC5脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*初始化PC6作为测试端口,若没有中断进入拉高PC6脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void NVIC_Configuration2(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel= TIM4_IRQChannel;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void Init_TIM(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
/* APB1 Periph clock enable */
TIM_DeInit(TIM4); //缺省TIMER配置
//设置TIM时钟
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //选择系统时钟;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; //向上计数方式;
TIM_TimeBaseStructure.TIM_Period = 65535 ; //重加载寄存器配置为65535 , 那么可捕获的最大脉冲就是65535/2400 = 27.3 ms
TIM_TimeBaseStructure.TIM_Prescaler = 29 ; //把TIM3的除数因子配置为29 , 那么TIM3的分辨率就是 1 / (72000 / (29+1)) = 1/ 2400 ms
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure) ;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ;
TIM_ICInitStructure.TIM_ICFilter =0x0;
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP ; //和TIM_ICMode_PWMI分别是输入捕获和PWM捕获模式
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //TIM_ICPolarity_Falling ; //下降沿捕获
TIM_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1 ;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit( TIM4, &TIM_ICInitStructure );
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1); //选择TIM4输入触发源---TIM经滤波定时器输入2
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset); //复位模式为从模式
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); //选择TIM4从模式----选中触发信号(TRGI)的上升沿初始化计数器并更新触发寄存器
TIM_Cmd( TIM4, ENABLE ); //使能定时器
TIM_ITConfig( TIM4, TIM_IT_CC1, ENABLE);//使能定时器中断
}
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2 , TIM_IT_CC1);
GPIO_SetBits( GPIOC, GPIO_Pin_5 );
}
else
{
GPIO_ResetBits( GPIOC, GPIO_Pin_6 );
}
}
|