3882|0

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TIM1测频得到的数值了但是我的时钟定义的是72M为什么是36M中间我都没有设置分频 [复制链接]

/*******************TIM1定义***************************?
void Timer_Configuration(void) 
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure; 
  TIM_ICInitTypeDef     TIM_ICInitStructure; 

  //TIM1时基设定--捕获填充频率 
  TIM_DeInit(TIM1); 

  TIM_TimeBaseStructure.TIM_Period=0xFFFF;  //ARR的值 
  TIM_TimeBaseStructure.TIM_Prescaler=0; 
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样不分频,频率72M 
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 
 // TIM_TimeBaseStructure.TIM_RepetitionCounter=TIM_EncoderMode_TI2;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 
  TIM_PrescalerConfig(TIM1,0,TIM_PSCReloadMode_Immediate);//时钟分频系数0,系统时钟72MHZ 
  TIM_ARRPreloadConfig(TIM1, ENABLE);   //使能ARR预装载缓冲器 
   
//定时器1捕获设置 
 
  TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; 
  TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; 
  TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; 
  TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; 
  TIM_ICInitStructure.TIM_ICFilter=0;  
  TIM_ICInit(TIM1,&TIM_ICInitStructure); 
  //清中断,以免一启用中断后立即产生中断  
  TIM_ClearFlag(TIM1, TIM_IT_Update);//  TIM_FLAG_Update
//使能TIM1溢出中断源  
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);  
//TIM_ITConfig(TIM1, TIM_FLAG_CC1OF, ENABLE);
  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);//使能捕获中断 
  TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
  TIM_Cmd(TIM1, ENABLE);  //使能定时器1 




void NVIC_Configuration(void) 
  NVIC_InitTypeDef NVIC_InitStructure; 

  /* Enable the TIM2 global Interrupt */ 
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure); 
  
  NVIC_InitStructure.NVIC_IRQChannel =  TIM1_UP_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure);  



void GPIO_Configuration(void) 
  GPIO_InitTypeDef GPIO_InitStructure; 
  GPIO_DeInit(GPIOA);
  /* TIM2 channel 2 pin (PA.01) configuration */ 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 }

/****************定时器中断服务函数 *******************************/
//要想得到足够大的测频范围,只要定义相应的OV_count,cap_diff足够大就可以了 
//建议freq_1array[]可以设置成double类型的变量,那样可以有小数频率! 
void TIM1_CC_IRQHandler(void) 
{  
//捕获处理 
if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET) 
  TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); 
if(1==cap_count) //捕获频率 
{
OV_count=0; 
old_cap=TIM_GetCapture1(TIM1);//TIM_GetCounter

else if(cap_count>10)        //捕获十次
new_cap=TIM_GetCapture1(TIM1);// TIM_GetCounter
cap_diff=new_cap-old_cap+65535*OV_count;
freq_1array=720000000.0/cap_diff;//这里72000000*10是对10次捕获求平均值 *100是求小数后两位
cap_count=1; 
OV_count=0; 
cap_count++;

//TIM1溢出中断服务子程序:TIM1_FLAG_CC1OF  
void TIM1_UP_IRQHandler(void)  
{  
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清中断  
OV_count++;






void main(void)
  {
  /* config the sysclock to 72m */
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1|
                         RCC_APB2Periph_AFIO,ENABLE);  
 Timer_Configuration();
 GPIO_Configuration();
 NVIC_Configuration();
 
 while(1);
   
  }    

要把中断中的 freq_1array=720000000.0/cap_diff 改成360000000.0才正确
为什么呢。。

/**************"stm32f10x.h"**********************************/
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 #define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif
[ 本帖最后由 pk3725069 于 2012-3-14 18:06 编辑 ]
此帖出自stm32/stm8论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表