OpenEdv-开源电子网

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

求外部时钟模式的例子

[复制链接]

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
发表于 2013-3-28 22:34:09 | 显示全部楼层 |阅读模式

用定时器的外部时钟模式来数脉冲数,外部时钟模式1好像记一次就中断一次,所以最好是模式2的  谁有相关代码,给小弟参考一下!谢谢了  小弟有点白,弄了一天没弄出来,打印出来老是为0.  我的定时器是这么配置的,不晓得哪有问题,,,
void TIM3_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
 TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0);
 //TIM3的时钟源选择外部时钟模式2(即外部触发输入ETR)
 //无预分频器,捕获入口上检测到的每一个边沿都触发一次捕获。
 //TIM_ExtTRGPolarity_NonInverted上升沿极性
 //第四个参数必须是0x00-0x0F之间的数,表示输入捕获滤波器
  

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//不重映射时,PA6、7、PB0、1对应着四个通道
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz时钟速度
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入,当配置成外部触发时钟输入时要求为浮空输入
 GPIO_Init(GPIOA,&GPIO_InitStructure);//根据上面指定参数初始化GPIO结构体
TIM3->SMCR|=1<<14;//使能外部时钟模式2 ,不知道库函数怎么操作这句话 所以用寄存器操作
 
 TIM_Cmd(TIM3,ENABLE);//使能定时器3

 }
//然后我在主函数里面打印计数值
int main(void)
{
  u16 TIM3CH1_CAPTURE_VAL;
 SystemInit(); 
 TIM2_Config();
 TIM3_Config();
  UART1_Init();

 while(1)
 {
  TIM_GetCounter(TIM3);
  //u16 TIM3CH1_CAPTURE_VAL;
  TIM3CH1_CAPTURE_VAL=TIM3->CCR1; //[获取当前的计数值]
   printf("Pulse Count:%d \r\n",TIM3CH1_CAPTURE_VAL);//[把计数值打印出来]
  //printf("Pulse Count:%d \r\n",TIM_GetCounter(TIM3));//[把计数值打印出来]
  
 } 
}
//关于打印,我试了寄存器法操作也试了库函数法操作,打印出来的就是0,脉冲源没问题,这点我肯定。

有进步就好!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-3-28 23:25:41 | 显示全部楼层
这个参考下MDK安装目录下的例子吧(不过貌似只有MDK3.80A自带了,4.X好像砍了)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
 楼主| 发表于 2013-3-29 09:29:46 | 显示全部楼层
回复【2楼】正点原子:
这个参考下MDK安装目录下的例子吧(不过貌似只有MDK3.80A自带了,4.X好像砍了)
---------------------------------
我的是MDK3.80A的,一直是以原子老师的资料当我的学习教材。。。
原子老师说的MDK安装目录下的例子,是在哪里?问题或许有点白,让你闹心了!我找了下没找到。
有进步就好!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-3-29 12:10:36 | 显示全部楼层
D:\KEIL3.80A\ARM\Examples\ST\STM32F10xFWLib\Examples\TIM
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
 楼主| 发表于 2013-3-29 14:52:37 | 显示全部楼层
非常谢谢原子了!
里面是英文的,我用我薄弱的英语水平浏览了一遍里面的描述,没有用来当计数器使用的。
明明定时器的本质就是计数器,但是真正把它用来计数例子的咋就这么难找,
搞什么灰机,都忘本了!继续苦逼配置,我就不信这个邪了!
不过谁要是有计数器的例子还是给小弟分享一个咯,,please!
有进步就好!
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-3-29 15:21:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
 楼主| 发表于 2013-3-29 18:09:38 | 显示全部楼层
接收你的教导,请问你有把定时器用做计数器的例子么?用外部时钟模式驱动定时器的。
有进步就好!
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-3-5
在线时间
0 小时
发表于 2014-3-11 15:53:57 | 显示全部楼层
回复【7楼】caoyicheng626:
---------------------------------
楼主,跟你碰到了同样的问题。不知道外部时钟模式2究竟怎么陪着,总输不出计数值。。请教哈

硬件连接:PE.8输出脉冲,PE.7配置为外部输入,用线连接PE.8与PE.7
代码部分:void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Delay(__IO uint32_t nCount);
 void tim1_confi(void);
u16 counter=0;
int main(void)

u8 i=0; 
  /* System Clocks Configuration */
  RCC_Configuration();
      
    
  /* Configure the GPIO ports */
  GPIO_Configuration();
  /*Configure tim1*/
  tim1_confi();

  while (1)
  {
      for(i = 0; i < 100; i ++) 
  {
  GPIO_SetBits(GPIOE, GPIO_Pin_8);
  Delay(100);
  GPIO_ResetBits(GPIOE, GPIO_Pin_8);
  Delay(100);
  }
  counter=TIM_GetCounter(TIM1);
//  counter=TIM1->CNT;
  }
}

void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
/**
  * @brief  Configures the different system clocks.
  * @param  None
  * @retval: None
  */
void RCC_Configuration(void)
{
  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  
     initialize the LL and update the SystemFrequency variable. */
  SystemInit();
   
  /* EnableGPIO ort, GPIO_LED and AFIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE  | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   //使能定时器TIM1时钟
}


void GPIO_Configuration(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能PE端口时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   //使能定时器TIM1时钟
 GPIO_PinRemapConfig (GPIO_FullRemap_TIM1 ,ENABLE );   //重映射
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  // 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //输入
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
 GPIO_Init(GPIOE, &GPIO_InitStructure);  //根据设定参数初始化GPIOE.7

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  //PE.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
 GPIO_Init(GPIOE, &GPIO_InitStructure);  //根据设定参数初始化GPIOE.8
}

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* Enable the EXTI9_5 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

 void tim1_confi(void)   //TIM1初始化
 {
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit( TIM1 ) ;
  /* Time Base configuration */
TIM_TimeBaseStructure.TIM_Period = 0XFFFF;  //
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* TIM1-ETR Configuration */
   TIM_ETRClockMode2Config (TIM1,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
TIM_SetCounter( TIM1,0) ; //从零计数
TIM_Cmd(TIM1, ENABLE); //使能打开
 }

#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 23:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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