你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wfmjj 发布时间:2015-1-5 23:37
等精度测量法:定时器1对被测信号计数65536个周期作为闸门时间,在这个闸门时间内定时器2对标准信号进行计数。假定在这个闸门时间内标准信号的计数值为M。则有:65536/fc=M/fb通过这个公式就可以算出被测信号:fc=65536*fb/M。# X7 J' _0 }' o6 n; T& f/ R/ x  A
本程序利用定时器3产生30KHZ的被测信号。定时器1对被测信号进行65536个周期计数。
% R9 y0 z+ Z9 p- v定时器4产生60KHZ的标准信号。定时器2对标准信号在定时器1产生的闸门时间内计数。
0 N# Z% g+ G6 j主程序如下:6 g0 A; p; [4 H# y
/**
) s! ~/ F; ]) o6 l  ******************************************************************************
" z' R! N: C! t9 L; b  * @file    app.c % z& c& n% K  s  F7 J
  * @author  wangfei! z, d& P. v: ?1 B1 ]
  * @date    13-April-20125 e$ C: E0 e% x' r- w, [
  * @e-mail  wfmjj@hotmail.com
* l* e9 n8 {. ~/ E& U$ @  * @brief   Initialize peripherals.) Z- P% l% r$ j
  *****************************************************************************/5 w4 w  K) X6 V, K. t' H$ O
/* Includes ------------------------------------------------------------------*/$ F. Z$ P5 q: E( O# i
#include "stm32f4xx.h"& B' v' b" [* y9 G( X/ D
#include "app.h"
* x, ]8 D4 @- m1 i: P+ [) R#include "bsp.h"$ z. t/ |& c1 a
/* Private typedef -----------------------------------------------------------*/4 ~! A$ r' U) I- L& F1 y. X
/* Private define ------------------------------------------------------------*/
' C$ m7 @& T5 y# V/* Private macro -------------------------------------------------------------*/
) W( u! b3 s, o0 l/* Private variables ---------------------------------------------------------*/
4 y% _- T# x, M. d; bextern uint8_t TimeFlag;
, p- n- G* w# C8 Y5 c7 P7 Eextern uint32_t n_Counter;" x4 }6 b  K/ j% \
uint16_t Counterh,Counterl;6 k/ a/ H" T& ^' m
uint8_t Data[5];
0 I( U  }; `, m4 Z! O. v$ p, e/* Private function prototypes -----------------------------------------------*/
  W& g! B# P/ k8 Z9 S# m: U/* Private functions ---------------------------------------------------------*//**
; O) P4 M! D4 d# m+ n2 N0 M% a8 Y7 z* @brief   This function handles NMI exception.& h+ [: E+ a3 S) U4 }! l5 P
  * @param  None5 {. v8 ~3 p( w5 ]
  * @retval None$ B: I0 c4 I' e: N
  */
% T- ~) K5 ]4 r1 S0 ?0 P( Jint main(void)8 ?* _( S7 U, V! I
{
* d" h. }; j4 d$ d3 P+ o. \& G  iGPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间1 h* \6 |- ]8 Y, i/ _' w
Bsp_Init();9 W, L! y7 H2 w  _: s3 y
while(1)# {+ m, K: v+ O( f* N: k/ K
{
/ O9 i- T- Q0 @4 f7 ~   uint8_t i;9 k  w( ?. m. C: L, _
   TIM_ITConfig(TIM1,TIM_IT_Trigger,ENABLE);  //允许定时器1的触发中断
  e( T% s3 ~4 b1 {# h6 X   GPIO_SetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));) H2 r) S9 |( W& N% A
     TIM_Cmd(TIM1,ENABLE);                 //打开定时器1,当检测到TIM1_CH1通道的上升沿后立即触发中断# O* {# @* `: O$ C. l. R
    while(TimeFlag==0);     //等待定时器1溢出中断
9 E9 L5 I- ~1 j# R4 x9 W   TIM1->DIER&=0X0000;     //失能定时器1的所有中断. d' k* D+ \+ C# Y* R: O1 f0 B, y
   GPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间
8 B8 N+ T* ^/ v   TimeFlag=0;    //定时器1溢出标志置0
4 V3 U5 p7 x) t" pCounterh=n_Counter>>16;  //得到32位数据中的高16位
: U: O; T! x7 H- T! I& M   Counterl=n_Counter;     //得到32位数据中的低16位
# R' G, }! ?6 `   Data[0]=Counterh>>8;2 {7 `( L6 o: H1 @; S* W( k
   Data[1]=Counterh;
0 T8 D# `* T' S9 a9 b4 u4 x1 ~   Data[2]=Counterl>>8;
8 w+ O+ Q5 X0 {5 C; s   Data[3]=Counterl;
4 j' s: G. l$ F<span style="color: rgb(34, 34, 34); font-family: sans-serif; font-size: 18px; line-height: 27px; background-color: rgb(238, 238, 238); ">  for(i=0;iCCMR1|=0X0100;  //配置定时器1为外部时钟模式18 K6 v& v2 Q( v/ o( c9 Z
TIM1->CCER&=0XFF5F;9 O3 u% h2 I$ u7 W6 M% A: D
TIM1->SMCR|=0X0067;
0 f* g& Q* [' s1 k" H7 ZTIM_ClearFlag(TIM1,(TIM_FLAG_Update|TIM_FLAG_Trigger));9 ]! O7 a% o$ S+ z% q! I% \
}- A  u* F1 @3 i! M, X
/**2 N: G) Y# G( i% z
  * @brief   This function config timer3.
0 ^/ G& u. d& ?3 D/ A4 U* v: \  * @param  None* x1 p4 A( A, J8 A% A2 g3 x
  * @retval None
+ x; g( t1 T% F0 e' T2 t4 L8 ^4 i6 }  */
) T) ]; W5 h2 d( c' b2 A3 lvoid Bsp_TIM3_Config(void)
) Q# M) ]1 U+ I+ Y{: E! R5 P& A4 p9 x/ U5 [
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
) J. L4 p4 @. a8 m  W& M; p( MTIM_OCInitTypeDef TIM_OCInitStructure;5 |3 O6 q! d% j+ l$ y
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //Open TIM3  Clock
6 s$ |/ g7 E7 }+ z# F+ Y0 \& k' L2 N% l0 n
TIM_TimeBaseStructure.TIM_Prescaler=3;          //clk_cnt prescale
8 }9 c/ Q+ c8 C% b; OTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode
: F* T, `$ k3 @4 E! \TIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=21000000/700=30KHZ
5 B  A9 L9 R; x4 b- k$ TTIM_TimeBaseStructure.TIM_ClockDivision=0;   8 E, q$ t% X( a' e# r! X# |

+ n+ h: |: Q) A2 S" }5 a% V3 e7 g9 UTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);) y4 w  v. f& F7 g8 F
/* PWM1 Mode configuration: TIM3_Ch1 */
# L/ i9 ], X- c' i+ i9 hTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
4 b; l" D/ }- l0 `: {) ^0 M; MTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output
9 L6 G/ e* t) c6 ~* \TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule% |9 J* K, G/ F( q
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable4 d3 K4 L% W. K' M' d% J( t
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
" \- U  R6 B. }- i5 g/ |- g, ?3 L. d1 y$ z  g3 h/ X/ W
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc1 preload 9 @# C1 Q3 w/ p/ E) A
9 U; l; q% r7 L
/* PWM1 Mode configuration: TIM3_Ch2 */
. V" \+ @' k" R- u& }, c( k: bTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
* ^, I1 Q+ |6 U4 q2 V0 m7 X+ QTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output
! s# v7 |% a8 n8 B( W( _TIM_OCInitStructure.TIM_Pulse=200;                            //config TIM3_CCR2 vaule
# I: t: l' W; b; kTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable
6 _  G& g. E0 w& S" `9 uTIM_OC2Init(TIM3, &TIM_OCInitStructure);
) K3 H( L$ G; s9 c3 i! N% e1 U7 j( x; }) o1 j7 G
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc2 preload ) r) w& f  W! Q0 R% q. F
/* PWM1 Mode configuration: TIM3_CH3 */
7 f- t1 N" ~9 S7 V, m* UTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode: ]9 W/ o. }  |1 O" m( m; U
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output , t* O7 ~# x6 V% f; V& a
TIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule
1 g& X( N8 F& u# [/ O! v2 C2 fTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable8 A* d  H; }% A8 C
TIM_OC3Init(TIM3, &TIM_OCInitStructure);' _5 A, L4 N6 d

. V* G' F  f5 A9 ~: y, Q7 K' h+ lTIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc3 preload
8 L  |1 D0 D$ K' O$ J4 K
2 ?% s! ^- L9 m6 ?8 i* a/* PWM1 Mode configuration: TIM3_CH4 */" j2 Q9 r" M* B% L& K
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
- f) E/ V8 C3 n5 c* KTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output
1 g2 {! o' H8 y# c8 g4 E+ p# HTIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR1 vaule
4 s8 Q( F' l, E" VTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable
4 k1 p9 H9 H6 ?0 WTIM_OC4Init(TIM3, &TIM_OCInitStructure);
; @: p  Y9 K+ u9 O3 ^5 U& i2 x2 D/ k  C4 {2 ^: q% @  U: N8 L8 {
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc4 preload
4 w* O/ {0 y/ W' o% E4 P7 cTIM_ARRPreloadConfig(TIM3, ENABLE);  /* TIM3 enable counter */. R9 T2 n1 _. y3 ^6 M* H
  TIM_Cmd(TIM3, ENABLE);
+ X, @0 A  [% O6 U& B}
7 z# F2 v# v0 S9 y2 R8 @0 O. ?  W2 C4 W7 e0 p- ]  d3 S7 e
' G, E# a' n, V6 Y" `) Q! ^
赞 收藏 评论5 发布时间:2015-1-5 23:37

举报

5个回答
wfmjj 回答时间:2015-1-5 23:38:47
/**
7 C1 G3 k5 D* {7 }( t2 C  n: }  * @brief   This function config usart3.9 D5 n) {& _; K! B1 R- c
  * @param  None
0 L. E/ I8 d& Z# [  * @retval None4 x! q* ?$ g  ?5 @4 n& Y
  */$ A( k/ G1 ?! e7 H) c
void Bsp_USART3_Config(void)4 a1 J8 G$ Q% s! C& {4 J4 Z& @
{" ^5 j" H2 s) {
USART_InitTypeDef USART_InitStructure;
4 u& q+ R" T) x! u1 i( _, j  
( a5 i0 t$ A' _' i4 `6 m  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //turn on usart3 clock
+ p* ?- `$ y. `- E  Q  4 I7 c: i) n7 Q& ^& _; x
  USART_InitStructure.USART_BaudRate =115200 ;         //波特率设置' s* V7 q4 Y: S5 q5 M# R; _
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;" r/ g4 l3 c$ D3 P1 ^2 k# j
  USART_InitStructure.USART_StopBits = USART_StopBits_1;3 v% B) F( R4 U, @5 n- z* R
  USART_InitStructure.USART_Parity = USART_Parity_No;! A! P1 l1 ^% }* ]
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;: A+ ]( n: x- D) j% x* R! H, {: }
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; . w6 P5 T" j6 N# C1 j
  USART_Init(USART3, &USART_InitStructure);4 Q4 M. w) q4 a) w1 g7 K
  3 A4 `1 ?% @2 _" [7 a& H
  //USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
) Z9 U* j8 n0 F& C  USART_Cmd(USART3,ENABLE);
- J- ~1 [; l' Y  USART_ClearFlag(USART3, USART_FLAG_TC);   //清除发送完成标志位8 H0 N. V  `4 l- z. g! Z
}, B7 ]9 @0 ~  E( e2 x3 G  e! b2 w
/**. [  Q# o8 c& l, P6 D$ r1 F$ H
  * @brief   This function config nvic.+ P7 A- [7 o/ ?7 ?' r; h4 N
  * @param  None8 T# Y8 C  y6 w- l
  * @retval None! h4 E% Q& b* \. h
  */
& L6 G# \. e# d9 @void Bsp_NVIC_Config(void)
, R& L. Q6 \9 _+ u' O{9 p$ D& Z: A! E5 s6 a
  NVIC_InitTypeDef NVIC_InitStructure;1 l& l9 E! }; X) r/ a" U/ {( y
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
( v4 c) x+ c  P6 c8 g! W% u0 }: [, B1 {
  NVIC_InitStructure.NVIC_IRQChannel=TIM1_TRG_COM_TIM11_IRQn;9 V' q+ H4 y8 A3 H
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  _4 h3 Y% U+ m. N( W0 P
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
5 C; s& a  F, C: P- N( s   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;, z$ K" {- n) N+ E2 X% x8 x
   NVIC_Init(&NVIC_InitStructure);" Z5 z' T% F0 i/ {$ ~
& O, R9 a, B, X! S/ V+ [
  NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_TIM10_IRQn;& r# w9 w# B, J9 m2 }& f, A
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
6 x9 S8 S: g8 U2 q' h7 w   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  ~7 t' u0 u3 s/ O5 Z8 {! `3 i   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  ]3 ?, c. f0 G5 e+ M( H4 s' Y" n
   NVIC_Init(&NVIC_InitStructure);  T3 [" Q% f7 h7 I; u
}
/ Q' E3 f, I4 h+ m( b1 S/**- X3 o  z1 ^" D6 @/ O2 c
  * @brief   This function config timer2.! s6 r5 x- N# M8 h0 P
  * @param  None* I3 d1 l. S" r3 N' H0 @5 o
  * @retval None
4 |5 D$ s1 H' S4 w% Q( i9 b  */
8 B) r( ?0 [  J3 v) O$ U5 N! mvoid Bsp_TIM2_Config(void)
1 B& L3 }' T0 k2 ^# ]1 U7 o{
% `2 X, n5 S/ K. ?! k+ u+ H! K2 FTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;" o( [; ?& ?& }2 F
* v2 [7 @( a! U( Q# S6 u1 |5 M& J4 R+ Q
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //打开定时器2的时钟
( G/ \4 j% A9 z( N6 ~" `8 g7 V6 Q' `  TIM_DeInit(TIM2);
6 ^( ^) D' m: _+ h( r6 s/ d3 l2 `! u/ o
TIM_TimeBaseStructure.TIM_Prescaler=0;                       
9 L; R' d' d% L  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;      //定时器2向上计数9 u3 P) r% l* ?" F8 L
  TIM_TimeBaseStructure.TIM_Period=0xffff;                        
8 U7 [' }; q$ o4 s  TIM_TimeBaseStructure.TIM_ClockDivision = 0;# ]. O7 D# [  `" H
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
6 y" F7 g: G0 C# |
% x, ]& ]' e, n8 D/ CTIM2->ARR|=0XFFFFFFFF;   //配置; ?  V* C7 A- @3 J- I
//定时器2外部时钟模式1的配置
3 g8 O/ `. ^+ B$ ^TIM2->CCMR1|=0X0001;   
; T( Z1 i2 `( a' v, o  u% t* ETIM2->CCER&=0XFFF5;
: t7 s9 P' ~& _* v0 {% cTIM2->SMCR|=0X0057;
# Z2 M" x  W  h1 |( q3 j$ e
. h" C; o3 x* @1 c# z  H: F1 QTIM_ClearFlag(TIM2,TIM_FLAG_Update);    //初始化时必须将溢出中断清0必须在开溢出中断之前。4 Y1 V/ b, ^# q) ~
}0 d. k3 W( x9 j
/**
' p3 L7 Y# ~% f# F  * @brief   This function config timer4.
; ]  ?) `( ^( ^  k/ \# R" g8 s0 s& b  * @param  None
  ]4 v& K. x2 Q& |  y1 T" M9 |  * @retval None
* {5 V7 I/ o' I  */
# E+ t5 h! y) c# P+ o* |void Bsp_TIM4_Config(void)+ e( a5 D0 ?0 @. r
{
; q5 |$ J* K, z& ?8 A  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;0 b) [! o$ r1 `# t& z8 `
TIM_OCInitTypeDef TIM_OCInitStructure;1 A6 @) t3 i8 }4 W9 Y

+ V$ i( Z6 e6 P" M( |+ m# g" TRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  //turn on TIM4 clock TIM_TimeBaseStructure.TIM_Prescaler=1;          //Fck_cnt=84MHZ/2=42MHZ, K1 K( W! e0 ~
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode
* {. c! L* g7 zTIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=42000/700=60KHZ( D$ V2 f  e+ B# g8 u. ^2 n
TIM_TimeBaseStructure.TIM_ClockDivision=0;   
1 c1 [4 X% [' V2 h6 _6 J" o( [) t/ s; N6 D
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
5 Y1 w' }# T' v4 D/ `4 @# U+ t: N8 B0 q; ^: v
/* PWM1 Mode configuration: TIM4_Ch1 */
+ w( V6 g7 E, e$ I! r0 U9 B9 }7 aTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode; L: v% Y( b3 u. X8 w  D
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output ) `4 u  T0 B! a2 Q1 F* D" C4 \* f  K
TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule
5 O2 d) K* E9 ?( J3 p: PTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable+ d3 `8 z9 j" ?
TIM_OC1Init(TIM4, &TIM_OCInitStructure);1 p/ [3 A+ P# i3 r! ^  b7 D
8 z/ k' V1 d3 ^  H3 f' E) y: n
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc1 preload
/ A. y1 a3 H- n
1 k# ~6 i; J# V. A" n; {+ D/* PWM1 Mode configuration: TIM4_Ch2 */) V- C" q2 i( u: T
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode) t- e* [8 M) j# P
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output . E; k% f5 G, Y) N' O' ?# G' j
TIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR2 vaule: q: R6 H' [5 N
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable
, `: P$ P" s7 v9 ^% bTIM_OC2Init(TIM4, &TIM_OCInitStructure);
  S$ d9 f2 a+ d; I- m# t7 e% ~7 t, b- ?1 u! v
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc2 preload " h9 W3 S: V4 y' m: \/ x

' m# X: c" ?+ L/* PWM1 Mode configuration: TIM4_CH3 */
2 y- h: d0 n3 ?) k& CTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
$ Q! o8 v$ D  b. Y' iTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output
- X' p: v7 R( e3 P$ RTIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule5 T! @8 P9 b. D, Q* s; R
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable; E3 I# y( h  a8 U
TIM_OC3Init(TIM4, &TIM_OCInitStructure);: ]9 e( A# d7 t% Z( r2 d

8 l( u- K$ Q' zTIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc3 preload
0 `* @2 S/ g% ]! _6 }/* PWM1 Mode configuration: TIM4_CH4 */- a9 ]2 N/ L( F+ b( B4 h0 L3 I* _
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode. s& G- z6 V8 J- l) l* ^
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output
6 b4 R7 w) y5 D, X8 V% d! bTIM_OCInitStructure.TIM_Pulse=600;                            //config TIM3_CCR1 vaule8 \5 T0 }4 i0 @$ P; ]$ B0 v& m$ V" b8 X
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable4 G3 p2 n9 W% S, \: \* o0 ^
TIM_OC4Init(TIM4, &TIM_OCInitStructure);) Z( c6 y# @6 v

3 A7 ^9 W3 m6 X3 E+ |TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc4 preload
0 d' |8 C2 m" O  P" }
  D$ s5 @. r* T/ s" |TIM_ARRPreloadConfig(TIM4, ENABLE);  /* TIM3 enable counter *// k/ o* t7 X' [; \( G- y  F
  TIM_Cmd(TIM4, ENABLE);
5 r# X* N+ p  X2 Y, K2 T
+ a& i1 u! |; M}; O% X9 e1 D! J2 M! R0 l
定时器1触发中断程序如下:
: S0 b; n2 S9 Ovoid TIM1_TRG_COM_TIM11_IRQHandler(void)
" w7 [! o" N9 {" O{
0 D1 W# h& A6 e, k' Rif(TIM_GetITStatus(TIM1,TIM_IT_Trigger)==SET)  //检查是否为触发中断
: f: u1 F" O' J9 I# _" U: c{
, m3 i3 K( X  b  TIM1->DIER&=0XFFBF;    //清除定时器1的触发中断# F1 |) U& c- E- D+ m
  TIM1->DIER|=0X0001;    //使能定时器1的溢出中断
4 _3 j$ z! C. C; C  TIM2->CR1|=0X0001;    //打开定时器2使其对标准信号开始计数, d5 A1 D" W, i$ y4 I
  TIM1->SR&=0XFFBF;     //在退出中断之前必须清除其中断标志位4 Z# U7 ?/ ~, \! q+ S
}
3 u" p  `0 V4 v6 o& _: Q" S& p}5 O( k7 R" C) g0 K* M% g- c
定时器1溢出中断如下:
8 \! d) Y" w; }$ ?8 Mvoid TIM1_UP_TIM10_IRQHandler(void)" J" d$ t" @; P3 R3 A( A) \$ i1 c
{
1 O8 k$ W7 P' k1 m4 Vif(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET)  //检查定时器1溢出标志位是否置1" A+ l+ w. F* F5 l5 `  U! g
{
+ n/ R( N' I! x/ ]# v  n_Counter=TIM2->CNT;  //读出计数器2的值' I2 V5 a2 Y/ I2 |, T
  TIM1->CR1&=0XFFFE;    //关闭定时器1
8 ]2 Q4 l7 x- }/ y  TIM2->CR1&=0XFFFE;    //关闭定时器2
: M# T! @1 r" Y* t" L; n# @  TIM2->CNT&=0X0000;    //清除计数器2计数寄存器的值
* \$ k2 @  v6 Q$ o& p+ }' Q: U3 w  TimeFlag=1;          //1s标志位置1! i8 [, g, @1 n
  TIM1->SR&=0XFFFE;    //退出定时器1溢出中断之前,必须清除定时器1的溢出标志位
" H3 f- \1 I" Z$ X. S}
7 V5 u. x6 t+ J}0 H' ~% o% O& M: Z# L$ I( L9 O
</i>
. W6 D; u8 z) l  I+ P$ _1 s: ?' ?- ^. ^& z$ N: H

& R8 L) h% u4 W: @, B$ E5 h
1 ^  v2 q9 d- y. R4 E( D, H
wfmjj 回答时间:2015-1-5 23:44:59
被测信号 标准信号和串口输出如下图!" V3 l! `* t9 b/ H( s
被测信号1.jpg 标准信号1.jpg 串口3接收的数据.jpg 未命名.JPG
' `/ `+ S+ e5 z9 x4 m  }6 {' P3 A
党国特派员 回答时间:2015-1-6 01:20:50
收藏下,以后再用。
qzwx741 回答时间:2015-1-6 08:29:03
收藏下,谢谢
6874577 回答时间:2015-1-6 11:03:59
收藏下,谢谢

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版