OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13640|回复: 6

运用STM32定时器捕获功能 不能进入中断(用库函数) 有代码 谢谢大家 初学

[复制链接]

36

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-3-23 13:57:16 | 显示全部楼层 |阅读模式

不知道哪里出问题了??不能进入中断。。   
 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 );
 }
}

天天实验室   却无成就。。。。。惨蛋!  感谢opendv的所有大虾。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-23 14:53:05 | 显示全部楼层
我也不知道哪里的问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-23 16:16:17 | 显示全部楼层
主函数中连个WHILE循环都没有…………

而且TIM4_IRQHandler();这个中断函数放不必在主程序中,当由中断时自己就能找到了……

库函数研究不深,这个基本编程问题就给你指出来了,具体的库函数是否能够捕获就需要请教那些用库函数的了
努力,前进。
回复 支持 反对

使用道具 举报

36

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-3-24 14:13:16 | 显示全部楼层
回复【3楼】5498折戟沉沙:
---------------------------------
谢谢指正。。初学。。愁啊!
天天实验室   却无成就。。。。。惨蛋!  感谢opendv的所有大虾。。
回复 支持 反对

使用道具 举报

36

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-3-24 14:16:44 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
回复【2楼】正点原子:
---------------------------------
那么  有没有明显的错误地方。。麻烦指正下。
天天实验室   却无成就。。。。。惨蛋!  感谢opendv的所有大虾。。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-24 14:25:44 | 显示全部楼层
请问楼主,你有没有用软件仿真单步调试过?有没有用软件仿真看过相关寄存器的配置?
比如NVIC,
比如定时器的寄存器,
也许这些问题你可以自己解决的,初学这两个字是不能拿来当思想懒惰的借口的
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-3-24 15:20:06 | 显示全部楼层
回复【6楼】Pony279:
---------------------------------没有。。我再看看先。。。谢谢你的良言。。
天天实验室   却无成就。。。。。惨蛋!  感谢opendv的所有大虾。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 08:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表