[STM32] 求教:stm32F030 定时器怎么进不来中断?

[复制链接]
7647|6
 楼主| sisyphos 发表于 2014-3-22 15:21 | 显示全部楼层 |阅读模式
本帖最后由 sisyphos 于 2014-3-22 15:32 编辑

定时器1 channel4,采用输入捕获模式
初始化如下:
void Tim1Init(void)
{
    //端口PA11初始化
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);                //使能PA端口时钟
        
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.GPIO_Pin = SIGNAL_CAPTURE_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;                //悬空输入
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(SIGNAL_CAPTURE_PORT,&GPIO_InitStruct);

        //Tim1,AF功能配置
        GPIO_PinAFConfig(SIGNAL_CAPTURE_PORT,SIGNAL_CAPTURE_PIN,GPIO_AF_2);
   
    //Tim1初始化
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                   // 使能时钟单元
        TIM_PrescalerConfig(TIM1, TIM1_CLK_DIV_NUM, TIM_PSCReloadMode_Immediate);            
        TIM_SetAutoreload(TIM1, TIM1_WORK_RELOAD_NUM);                                       //  

        TIM_ICInitTypeDef TIM1_ICInitStruct;
        
        TIM1_ICInitStruct.TIM_Channel = TIM_Channel_4;
        TIM1_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM1_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;        
        TIM1_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM1_ICInitStruct.TIM_ICFilter = 0x0;                                

        TIM_ICInit(TIM1,&TIM1_ICInitStruct);

        TIM1->SR = 0;
        TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);
        TIM_Cmd(TIM1, ENABLE);                        //使能定时器

}

void TIM1_CC_IRQHandler(void)
{
        INT32 tempccr = 0;
        INT32 capturedata = 0;
        INT32 err;
        
        if (TIM_GetITStatus(TIM1,TIM_IT_CC4))
        {
                TIM_ClearFlag(TIM1, TIM_IT_CC4);
        
                tempccr = TIM_GetCapture4(TIM1);                //获取当前捕获的计数值
        }
}
static void _system_IntSet(void)
{  
  __set_PRIMASK(1);//关中断

  NVIC_InitTypeDef NVIC_InitStructure;   

  NVIC_InitStructure.NVIC_IRQChannel =  TIM1_CC_IRQn;  //TIM1_BRK_UP_TRG_COM_IRQn,  TIM1_CC_IRQn
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

 楼主| sisyphos 发表于 2014-3-22 15:25 | 显示全部楼层
用示波器量过IO口PA11,是有方波信号的,约200KHz,但是死活不进中断,一次都没有,求教高手
airwill 发表于 2014-3-23 09:04 | 显示全部楼层
是不是跟这个设置有关?

static void _system_IntSet(void)
{  
  __set_PRIMASK(1);//关中断
 楼主| sisyphos 发表于 2014-3-24 09:18 | 显示全部楼层
airwill 发表于 2014-3-23 09:04
是不是跟这个设置有关?

static void _system_IntSet(void)

应该不是这个问题,我开了tim16用的是更新中断,是可以正常进中断的。
shangwei4444 发表于 2014-3-24 16:45 | 显示全部楼层
建议把别的无关代码都屏蔽,其他中断都关掉,看看能不能进。
hehui000 发表于 2014-3-27 09:53 | 显示全部楼层
我也碰到过这个问题,应该是AF设置时, GPIO_PinAFConfig(SIGNAL_CAPTURE_PORT,SIGNAL_CAPTURE_PIN,GPIO_AF_2);SIGNAL_CAPTURE_PIN应该为GPIO_PinSource11而不是GPIO_Pin_11
 楼主| sisyphos 发表于 2014-3-27 10:00 | 显示全部楼层
hehui000 发表于 2014-3-27 09:53
我也碰到过这个问题,应该是AF设置时, GPIO_PinAFConfig(SIGNAL_CAPTURE_PORT,SIGNAL_CAPTURE_PIN,GPIO_AF ...

牛呀,果然是这个原因,不同函数调用的引脚定义还有这个区别,:L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部