[STM32] STM32F407ZGT6高级定时器TIM1的输入捕获问题

[复制链接]
1167|0
 楼主| bestfei 发表于 2016-7-18 19:36 | 显示全部楼层 |阅读模式
我写的程序实现不了STM32F407ZGT6高级定时器TIM1的输入捕获,编译没有问题,10ms定时可以实现,但就是捕获不了高电平和低电平,求高手指点!
  1. ////****以下是主程序main.c//*****
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "led.h"
  6. #include "timer.h"

  7. int main(void)
  8. {
  9.         u16 t=0;
  10.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  11.   delay_init(168);
  12.         uart_init(115200);
  13.         LED_Init();
  14.         timer1_cap1_init (9999,167);//10msÒç³öÒ»´Î
  15.         while(1)
  16.         {
  17.                 delay_ms(10);
  18.                 t++;
  19.                 if(t==50)
  20.                 {
  21.                         t=0;
  22.                   LED0 =!LED0;
  23.                        
  24.                 }
  25.         }
  26. }
  27. ///*****以下是定时器初始化和中断服务函数
  28. #include"timer.h"
  29. #include"sys.h"
  30. #include"led.h"

  31. u8 sta=0;//[7]: 0,没有成功的捕获;1,成功捕获到一次。
  32.               //[6]: 0,没有捕获到上升沿; 1,已经捕获到上升沿。
  33.               //[5:0];捕获到高电平后溢出的次数。
  34. u16 timer1_val=0;

  35. void timer1_cap1_init(u16 arr,u16 psc)
  36. {
  37.         GPIO_InitTypeDef GPIO_InitStructure;
  38.   TIM_TimeBaseInitTypeDef TIM_TimeBseInitStructure;
  39.         TIM_ICInitTypeDef TIM_ICInitStructure;
  40.         NVIC_InitTypeDef NVIC_InitSructure;
  41.        
  42.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  43.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  44.        
  45.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  46.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
  47.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
  48.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  49.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
  50.        
  51.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  52.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1);
  53.        
  54.         TIM_TimeBseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  55.         TIM_TimeBseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
  56.         TIM_TimeBseInitStructure.TIM_Period=arr;
  57.         TIM_TimeBseInitStructure.TIM_Prescaler=psc;
  58.         //TIM_TimeBseInitStructure.TIM_RepetitionCounter=
  59.        
  60.         TIM_TimeBaseInit(TIM1,&TIM_TimeBseInitStructure);
  61.        
  62.         TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
  63.         TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
  64.         TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
  65.         TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
  66.         TIM_ICInitStructure.TIM_ICFilter=0x00;
  67.        
  68.         TIM_ICInit(TIM1,&TIM_ICInitStructure);
  69.        
  70.         TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);
  71.         TIM_Cmd(TIM1,ENABLE);
  72.        
  73.         NVIC_InitSructure.NVIC_IRQChannel=TIM1_UP_TIM10_IRQn;
  74.         NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority=1;
  75.         NVIC_InitSructure.NVIC_IRQChannelSubPriority=2;
  76.         NVIC_InitSructure.NVIC_IRQChannelCmd=ENABLE;
  77.         NVIC_Init(&NVIC_InitSructure);
  78.        
  79.         NVIC_InitSructure.NVIC_IRQChannel=TIM1_CC_IRQn;
  80.         NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority=1;
  81.         NVIC_InitSructure.NVIC_IRQChannelSubPriority=3;
  82.         NVIC_InitSructure.NVIC_IRQChannelCmd=ENABLE;
  83.         NVIC_Init(&NVIC_InitSructure);

  84.        
  85. }


  86. void TIM1_UP_TIM10_IRQHandler(void)
  87. {
  88.        
  89.         if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
  90.         {
  91.                 if(sta&0x40)//判断是否已经捕获到上升沿
  92.                  {
  93.                          sta++;
  94.               if(sta&0x3f==0x3f)
  95.                                 {
  96.                                   sta|=0x80;
  97.                                         timer1_val=0xffff;
  98.                                 }
  99.                          
  100.                  }               
  101.         }
  102.         TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
  103.        
  104. }


  105. void TIM1_CC_IRQHandler(void)
  106. {
  107.   if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET)
  108.         {
  109.           if((sta&0x80)==0)//判断是否已经完成一次捕获
  110.                 {
  111.                   if(sta&0x40) //判断是否已经捕获到高电平
  112.                         {
  113.                                 timer1_val=TIM_GetCapture1(TIM1);
  114.                                 TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising);
  115.                                 sta|=0x80;
  116.                                 LED1=!LED1;
  117.                         }
  118.                        
  119.                         else  //之前没有捕获到高电平,现在是第一次捕获到高电平
  120.                         {
  121.                                 sta=0;
  122.                                 timer1_val=0;
  123.                                 sta=0x40;//标记已经捕获到高电平
  124.                                 TIM_Cmd(TIM1,DISABLE);
  125.                                 TIM_SetCounter(TIM1,0);
  126.                                 TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling);
  127.                                 TIM_Cmd(TIM1,ENABLE);
  128.                         }
  129.                        
  130.                 }
  131.                
  132.         }
  133.         TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
  134. }       

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

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