打印

STM32F4定时器应用--等精度测频法

[复制链接]
8204|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wfmartin28|  楼主 | 2013-1-25 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
等精度测量法:定时器1对被测信号计数65536个周期作为闸门时间,在这个闸门时间内定时器2对标准信号进行计数。假定在这个闸门时间内标准信号的计数值为M。则有:65536/fc=M/fb通过这个公式就可以算出被测信号:fc=65536*fb/M。
本程序利用定时器3产生30KHZ的被测信号。定时器1对被测信号进行65536个周期计数。
定时器4产生60KHZ的标准信号。定时器2对标准信号在定时器1产生的闸门时间内计数。
主程序如下:
/**
  ******************************************************************************
  * @file    app.c
  * @author  wangfei
  * @date    13-April-2012
  * @e-mail  wfmjj@hotmail.com
  * @brief   Initialize peripherals.
  *****************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "app.h"
#include "bsp.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern uint8_t TimeFlag;
extern uint32_t n_Counter;
uint16_t Counterh,Counterl;
uint8_t Data[5];
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*//**
* @brief   This function handles NMI exception.
  * @param  None
  * @retval None
  */
int main(void)
{
GPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间
Bsp_Init();
while(1)
{
   uint8_t i;
   TIM_ITConfig(TIM1,TIM_IT_Trigger,ENABLE);  //允许定时器1的触发中断
   GPIO_SetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));
     TIM_Cmd(TIM1,ENABLE);                 //打开定时器1,当检测到TIM1_CH1通道的上升沿后立即触发中断
    while(TimeFlag==0);     //等待定时器1溢出中断
   TIM1->DIER&=0X0000;     //失能定时器1的所有中断
   GPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间
   TimeFlag=0;    //定时器1溢出标志置0
Counterh=n_Counter>>16;  //得到32位数据中的高16位
   Counterl=n_Counter;     //得到32位数据中的低16位
   Data[0]=Counterh>>8;
   Data[1]=Counterh;
   Data[2]=Counterl>>8;
   Data[3]=Counterl;
  for(i=0;i<4;i++)
  {
   USART_SendData(USART3,Data);
      while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  }
   Delay(100000000);
  }
}
/**
  * @brief  Delay Function.
  * @param  nCount:specifies the Delay time length.
  * @retval None
  */
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}
外设初始化程序如下:
/**
  ******************************************************************************
  * @file    bsp.c
  * @author  wangfei
  * @date    13-April-2012
  * @e-mail  wfmjj@hotmail.com
  * @brief   Initialize peripherals.
  *****************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "bsp.h"/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*//**
  * @brief   This function handles NMI exception.
  * @param  None
  * @retval None
  */
void Bsp_Init(void)
{
Bsp_GPIO_Config();   //对用到的外设IO口进行设置
Bsp_TIM1_Config();   //对被测信号进行计数
Bsp_TIM2_Config();   //对标准信号进行计数
Bsp_TIM3_Config();   //产生被测信号
Bsp_TIM4_Config();   //产生标准信号
Bsp_NVIC_Config();   //配置本程序中使用的中断
Bsp_USART3_Config();  //将标准信号的测量数值传送给PC机
}
/**
  * @brief   This function config GPIO.
  * @param  None
  * @retval None
  */
void Bsp_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;  

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);   //打开外设GPIOE的时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);     //turn on gpioc clock
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);    //turn on GPIOA clock
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);   //打开GPIOB口的时钟TIM4_CH1--PB6
GPIO_InitStructure.GPIO_Pin=(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  //led口配置
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOE, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3);  //Connect USART3 pins to AF7
   GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_11;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOC, &GPIO_InitStructure);
  
   //Connect TIM3 Pin to AF2
  GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3);  //TIM3_Ch1
  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM3);  //TIM3_Ch2
  GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM3);  //TIM3_Ch3
  GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM3);  //TIM3_Ch4
// Config TIM3 Pin
GPIO_InitStructure.GPIO_Pin=(GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_TIM1); //PA9--TIM1_CH2
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

//配置TIM2_CH1通道PA0引脚
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);  //PA0--TIM2_CH1

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置TIM4_CHx通道
   GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);  //connect TIM4_CH1 to AF2
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);  //connect TIM4_CH2 to AF2
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM4);  //connect TIM4_CH3 to AF2
   GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM4);  //connect TIM4_CH4 to AF2
  
  GPIO_InitStructure.GPIO_Pin  =(GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
  * @brief   This function config timer1.
  * @param  None
  * @retval None
  */
void Bsp_TIM1_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);             //turn on timer1 clock

TIM_DeInit(TIM1);
  TIM_TimeBaseStructure.TIM_Prescaler=0;                       
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;      //定时器1向上计数
  TIM_TimeBaseStructure.TIM_Period=0xffff;                        
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

TIM1->CCMR1|=0X0100;  //配置定时器1为外部时钟模式1
TIM1->CCER&=0XFF5F;
TIM1->SMCR|=0X0067;
TIM_ClearFlag(TIM1,(TIM_FLAG_Update|TIM_FLAG_Trigger));
}
/**
  * @brief   This function config timer3.
  * @param  None
  * @retval None
  */
void Bsp_TIM3_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //Open TIM3  Clock

TIM_TimeBaseStructure.TIM_Prescaler=3;          //clk_cnt prescale
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode
TIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=21000000/700=30KHZ
TIM_TimeBaseStructure.TIM_ClockDivision=0;   

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: TIM3_Ch1 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output
TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable
TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc1 preload

/* PWM1 Mode configuration: TIM3_Ch2 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output
TIM_OCInitStructure.TIM_Pulse=200;                            //config TIM3_CCR2 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable
TIM_OC2Init(TIM3, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc2 preload
/* PWM1 Mode configuration: TIM3_CH3 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output
TIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable
TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc3 preload

/* PWM1 Mode configuration: TIM3_CH4 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output
TIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable
TIM_OC4Init(TIM3, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc4 preload
TIM_ARRPreloadConfig(TIM3, ENABLE);  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);
}
/**
  * @brief   This function config usart3.
  * @param  None
  * @retval None
  */
void Bsp_USART3_Config(void)
{
USART_InitTypeDef USART_InitStructure;
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //turn on usart3 clock
  
  USART_InitStructure.USART_BaudRate =115200 ;         //波特率设置
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART3, &USART_InitStructure);
  
  //USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
  USART_Cmd(USART3,ENABLE);
  USART_ClearFlag(USART3, USART_FLAG_TC);   //清除发送完成标志位
}
/**
  * @brief   This function config nvic.
  * @param  None
  * @retval None
  */
void Bsp_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  NVIC_InitStructure.NVIC_IRQChannel=TIM1_TRG_COM_TIM11_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_TIM10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
}
/**
  * @brief   This function config timer2.
  * @param  None
  * @retval None
  */
void Bsp_TIM2_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //打开定时器2的时钟
  TIM_DeInit(TIM2);

TIM_TimeBaseStructure.TIM_Prescaler=0;                       
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;      //定时器2向上计数
  TIM_TimeBaseStructure.TIM_Period=0xffff;                        
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM2->ARR|=0XFFFFFFFF;   //配置
//定时器2外部时钟模式1的配置
TIM2->CCMR1|=0X0001;   
TIM2->CCER&=0XFFF5;
TIM2->SMCR|=0X0057;

TIM_ClearFlag(TIM2,TIM_FLAG_Update);    //初始化时必须将溢出中断清0必须在开溢出中断之前。
}
/**
  * @brief   This function config timer4.
  * @param  None
  * @retval None
  */
void Bsp_TIM4_Config(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  //turn on TIM4 clock TIM_TimeBaseStructure.TIM_Prescaler=1;          //Fck_cnt=84MHZ/2=42MHZ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode
TIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=42000/700=60KHZ
TIM_TimeBaseStructure.TIM_ClockDivision=0;   

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

/* PWM1 Mode configuration: TIM4_Ch1 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output
TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc1 preload

/* PWM1 Mode configuration: TIM4_Ch2 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output
TIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR2 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable
TIM_OC2Init(TIM4, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc2 preload

/* PWM1 Mode configuration: TIM4_CH3 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output
TIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable
TIM_OC3Init(TIM4, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc3 preload
/* PWM1 Mode configuration: TIM4_CH4 */
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output
TIM_OCInitStructure.TIM_Pulse=600;                            //config TIM3_CCR1 vaule
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable
TIM_OC4Init(TIM4, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc4 preload

TIM_ARRPreloadConfig(TIM4, ENABLE);  /* TIM3 enable counter */
  TIM_Cmd(TIM4, ENABLE);

}
定时器1触发中断程序如下:
void TIM1_TRG_COM_TIM11_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Trigger)==SET)  //检查是否为触发中断
{
  TIM1->DIER&=0XFFBF;    //清除定时器1的触发中断
  TIM1->DIER|=0X0001;    //使能定时器1的溢出中断
  TIM2->CR1|=0X0001;    //打开定时器2使其对标准信号开始计数
  TIM1->SR&=0XFFBF;     //在退出中断之前必须清除其中断标志位
}
}
定时器1溢出中断如下:
void TIM1_UP_TIM10_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET)  //检查定时器1溢出标志位是否置1
{
  n_Counter=TIM2->CNT;  //读出计数器2的值
  TIM1->CR1&=0XFFFE;    //关闭定时器1
  TIM2->CR1&=0XFFFE;    //关闭定时器2
  TIM2->CNT&=0X0000;    //清除计数器2计数寄存器的值
  TimeFlag=1;          //1s标志位置1
  TIM1->SR&=0XFFFE;    //退出定时器1溢出中断之前,必须清除定时器1的溢出标志位
}
}







沙发
zhpg009| | 2013-1-28 16:26 | 只看该作者
这个有用!

使用特权

评论回复
板凳
wfmartin28|  楼主 | 2013-2-1 14:09 | 只看该作者

使用特权

评论回复
地板
wfmartin28|  楼主 | 2013-2-1 14:10 | 只看该作者

使用特权

评论回复
5
wfmartin28|  楼主 | 2013-2-1 14:12 | 只看该作者

使用特权

评论回复
6
kyoeheh| | 2013-3-20 20:44 | 只看该作者
赞!

使用特权

评论回复
7
SXZWR| | 2013-4-18 11:51 | 只看该作者
看了您的STM32F4等精度测频。也尝试着用STM32F103可是定时器1的触发中断就没有,想请教您一下问题出在哪了。

使用特权

评论回复
8
SXZWR| | 2013-4-18 11:57 | 只看该作者

使用特权

评论回复
9
wfmartin28|  楼主 | 2013-4-19 10:16 | 只看该作者
新建文件夹.rar (15.77 KB)

使用特权

评论回复
10
wfmartin28|  楼主 | 2013-4-19 10:16 | 只看该作者
SXZWR 发表于 2013-4-18 11:57

新建文件夹.rar (15.77 KB)

使用特权

评论回复
11
airwill| | 2013-4-19 11:26 | 只看该作者
STM32F4定时器, 为什么不考虑用那个 32 位的定时器呢

使用特权

评论回复
12
wfmartin28|  楼主 | 2013-4-20 21:46 | 只看该作者
airwill 发表于 2013-4-19 11:26
STM32F4定时器, 为什么不考虑用那个 32 位的定时器呢

定时器2和定时器5都是32位定时器!

使用特权

评论回复
13
lxr89c51| | 2013-4-21 16:18 | 只看该作者
用捕捉功能,不是更简单?

使用特权

评论回复
14
baidudz| | 2013-4-21 18:29 | 只看该作者
很不错的东东

使用特权

评论回复
15
hawksabre| | 2013-4-21 19:07 | 只看该作者
资料很给力   谢谢楼主的共享资料   呵呵   收藏一个   以后有机会慢慢坐下来看看   消化一下

使用特权

评论回复
16
hawksabre| | 2013-4-21 19:07 | 只看该作者
资料很给力   谢谢楼主的共享资料   呵呵   收藏一个   以后有机会慢慢坐下来看看   消化一下

使用特权

评论回复
17
SXZWR| | 2013-5-5 11:20 | 只看该作者
非常感谢您的帮助。我是STM32的初学者,习惯了对单片机的底层操作,对M3的编程习惯很不适应,非常希望得到您的帮助。

使用特权

评论回复
18
cjhk| | 2013-5-5 17:26 | 只看该作者
谢谢了   楼主   资料很给力   顶一个  需要好好玩一玩   顶起来

使用特权

评论回复
19
viper65| | 2013-8-5 19:36 | 只看该作者
本帖最后由 viper65 于 2013-8-5 19:42 编辑

你这个其实不算等精度测量,等精度测量要求 门限时间是和待测信号相关的。你这样说到底其实就是65536倍的T法。这样对于低频信号测量会很慢很慢吧。。。真正的等精度测量高低频率速度都很高 且都保证精度的吧

使用特权

评论回复
20
viper65| | 2013-8-5 19:54 | 只看该作者
我认为应该从T1的触发中断开始,打开T2的计数器,关闭T1的触发中断,然后主程序里循环读取T2的记数 当超过限定的数量之后 再打开T1的触发中断 在T1的触发中断里取出T2的计数值,和T1的计数值,关闭T1T2计数器,然后进行一次运算就可以得到频率了,但是这样做太浪费 cpu资源了 一直在等这个时间。比较麻烦。。。还有一种方法就是T2来计算门限 同时开一个同频率的T3,T2的溢出中断时,等待T1的上升沿,此时取出T3 T1数值运算。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

143

帖子

0

粉丝