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

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

[复制链接]
wfmjj 发布时间:2015-1-5 23:37
等精度测量法:定时器1对被测信号计数65536个周期作为闸门时间,在这个闸门时间内定时器2对标准信号进行计数。假定在这个闸门时间内标准信号的计数值为M。则有:65536/fc=M/fb通过这个公式就可以算出被测信号:fc=65536*fb/M。2 w& c6 Y7 Z$ }9 }
本程序利用定时器3产生30KHZ的被测信号。定时器1对被测信号进行65536个周期计数。
! q4 b+ v- c0 \6 A定时器4产生60KHZ的标准信号。定时器2对标准信号在定时器1产生的闸门时间内计数。
4 f1 p0 h' i+ N; i3 y7 A主程序如下:
1 z* ~" L$ W" e' R, W, T/**5 X3 H7 s2 r; v6 Y$ [
  ******************************************************************************
  `) W1 r  S7 {6 O# R) R9 q  * @file    app.c
4 {* k/ n# `3 @7 e  * @author  wangfei' [/ h7 f- @; I" g+ W# B2 H! X
  * @date    13-April-2012
/ j4 D5 A$ E3 D' _: ~  * @e-mail  wfmjj@hotmail.com, }8 T8 i; E8 x; P0 s2 P
  * @brief   Initialize peripherals.
6 X& `$ b, Z+ ~3 f9 R, l  *****************************************************************************/
2 A- i+ X: i1 B# n/* Includes ------------------------------------------------------------------*/( L% X0 {( d* k
#include "stm32f4xx.h"
; W: h' y1 C2 f# A+ G% @, q0 s#include "app.h"
# j# m3 U# A, ?1 r3 Q' S#include "bsp.h"( D; _* e4 B1 {# z" J9 O
/* Private typedef -----------------------------------------------------------*/" Y+ F; l) z  b% b/ }
/* Private define ------------------------------------------------------------*/, O1 V, _% \! [* T: _" N
/* Private macro -------------------------------------------------------------*/
; ?' _- \; D' P0 q& g  o5 O/* Private variables ---------------------------------------------------------*/# k! r2 e0 @  d2 H# U& k
extern uint8_t TimeFlag;
& _# H* Y$ ~' K; J7 h; i5 \extern uint32_t n_Counter;
& z1 s& h. O7 M3 ouint16_t Counterh,Counterl;
3 `4 A4 ]  [8 r3 X& Quint8_t Data[5];
6 A3 \3 x7 j7 G' |/* Private function prototypes -----------------------------------------------*/" I: w: p: R; [0 C1 o; _
/* Private functions ---------------------------------------------------------*//**
- W$ j, C& {, d' w5 p- Y* @brief   This function handles NMI exception.
/ J8 p. ]: u& |: B" }& o9 p  * @param  None
5 B6 O9 I, {0 i  * @retval None1 A& t& d: t8 {" Y0 L2 H( K. I
  */
* u0 E9 ^' y' W3 [5 h) `6 `int main(void). K" c$ J$ \0 ?; {, `, w
{
% v* y& a+ E: M- E% Z5 g- }. yGPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间
5 ^  G( d; _" s, I5 XBsp_Init();
9 ?) E" J4 n; j! I. d7 o/ R& Rwhile(1)
7 o0 f5 c, o. U: j5 D7 P/ ?( |{5 T- y* C: c- l3 x
   uint8_t i;* C8 x, B# e& P
   TIM_ITConfig(TIM1,TIM_IT_Trigger,ENABLE);  //允许定时器1的触发中断
( l* v- o% C: z  \1 w   GPIO_SetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));9 z- j1 x# O6 |2 B# _
     TIM_Cmd(TIM1,ENABLE);                 //打开定时器1,当检测到TIM1_CH1通道的上升沿后立即触发中断% ?* X2 b6 _: ~* w
    while(TimeFlag==0);     //等待定时器1溢出中断/ b5 J1 s; h- D. X; v
   TIM1->DIER&=0X0000;     //失能定时器1的所有中断7 F- x! i+ i% b+ e
   GPIO_ResetBits(GPIOE,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3));  //可以通过观察LED口高电平时间( u. P( k& g7 s3 i- O; ]
   TimeFlag=0;    //定时器1溢出标志置0
1 v6 O; G/ ]5 s+ }1 zCounterh=n_Counter>>16;  //得到32位数据中的高16位" L! e; J0 N  P5 h+ t  D  ?
   Counterl=n_Counter;     //得到32位数据中的低16位9 @% |5 K' N- {
   Data[0]=Counterh>>8;0 A6 {( |8 u6 e
   Data[1]=Counterh;: Q) _; j% i) v& N5 f
   Data[2]=Counterl>>8;4 q/ v. i) ?( [- z( t" C
   Data[3]=Counterl;& `: h- {# G6 I, q6 \# v
<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为外部时钟模式1
/ H, o5 M6 N, z7 O# h. W* |! ~TIM1->CCER&=0XFF5F;
+ o- u" |9 C  B) K. P# cTIM1->SMCR|=0X0067;4 U8 g9 H/ E( e# W$ J4 L8 k! ?) y- |
TIM_ClearFlag(TIM1,(TIM_FLAG_Update|TIM_FLAG_Trigger));
2 K% @, q0 T) H( S}
8 n" D6 ~; x3 O# T  ~/**
+ g# N. \" g, E, Y  }  * @brief   This function config timer3.
0 N7 S5 U# M- R3 E' \  * @param  None
; Z9 r4 E3 T6 p" J  * @retval None4 l& r# i8 ^9 @3 S
  */2 W; P3 |3 ]  Q" A/ @, e8 m
void Bsp_TIM3_Config(void)2 I# U; z* c/ q0 a% T& }& E2 z8 _
{3 x6 z! Y; }2 q
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;- w+ @& x* p% \
TIM_OCInitTypeDef TIM_OCInitStructure;
# f1 [: I0 ^7 o- Z1 SRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //Open TIM3  Clock
- g; Y4 r5 C8 F- H/ h* J0 |. X) U! _/ W8 O) d, s
TIM_TimeBaseStructure.TIM_Prescaler=3;          //clk_cnt prescale& O( ^/ v4 V: d9 V
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode
1 u# h: E# e3 H+ {9 u7 ?3 e' kTIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=21000000/700=30KHZ' y5 N* H  W, t
TIM_TimeBaseStructure.TIM_ClockDivision=0;   & M6 B# L8 c% L/ K, f& }
7 _$ ]0 k% w- ?" z# a% Y" `  ?: d
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);& t' ~9 y3 O+ L/ ]# b; i$ K* G2 v
/* PWM1 Mode configuration: TIM3_Ch1 */3 l$ _1 C% o) P0 c% {( v
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode. }9 e7 v4 q$ v
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output ) E3 m! Y4 [2 W6 e  s
TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule  u8 a! o3 q! e: _# ]  ~7 z: d
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable
% w% a4 r$ }# D/ x' BTIM_OC1Init(TIM3, &TIM_OCInitStructure);( r( f" _" {5 r/ A- F: T/ F( a+ d
. ~0 W1 |6 Z+ P: Q* y
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc1 preload $ Y. `$ ?" f  |/ o2 F

& r- ?, R7 ^7 }' n4 n5 V/* PWM1 Mode configuration: TIM3_Ch2 */" I: E" e# F: @3 l
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode2 b9 T, c8 ?5 q! L* d
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output / a, L$ }6 r2 ]/ n
TIM_OCInitStructure.TIM_Pulse=200;                            //config TIM3_CCR2 vaule  r' S' [6 b* o) |$ N2 G
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable, ]3 f7 B# k" @
TIM_OC2Init(TIM3, &TIM_OCInitStructure);1 A$ \, e. l2 I: Z7 q+ s9 D, f% F
. E1 k$ }) R8 w. S. i9 l0 m
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc2 preload 6 l5 {, I+ B, ^8 h+ g8 w
/* PWM1 Mode configuration: TIM3_CH3 */
4 u+ U! x% z, D4 iTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
+ ?, F7 {3 j( ~( o  w& M) t. i9 s0 ~TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output ; {4 R7 C* b, T3 _
TIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule
6 X6 C3 \# p8 Q& ?$ WTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable
( k! R& t8 T: i/ j% S3 MTIM_OC3Init(TIM3, &TIM_OCInitStructure);3 |+ c7 w# Y9 S9 _3 e7 S: P. f

( T  V- c# o, g+ y4 O0 @TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc3 preload
, r% b$ i! ~: y6 a' V: V/ b+ }" B# F/ F9 ?  C8 [* z# K
/* PWM1 Mode configuration: TIM3_CH4 */* t- C9 N# J6 b( x- Z" I
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
' t' i) `+ q) B& w' w/ Y0 G9 LTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output . M" o% P2 O# B3 S
TIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR1 vaule
$ O4 o. i0 x2 z" `7 |TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable! g# T8 C2 J/ N+ ]+ z
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
+ j- `* z& t' q9 q) O8 k: V% v0 q' q! U: y+ j) P
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);         // turn on oc4 preload   u3 v' ], c% r% ~; M+ [
TIM_ARRPreloadConfig(TIM3, ENABLE);  /* TIM3 enable counter */+ V. z6 l" q. m9 |$ h- a
  TIM_Cmd(TIM3, ENABLE);, q, M! V' V$ D1 O. e
}" g" [* G9 N: M

3 C- a1 n, m% S# F0 Y/ G& \! D1 {
7 e! i. S/ v0 V/ X' W, W9 H6 W
收藏 评论5 发布时间:2015-1-5 23:37

举报

5个回答
wfmjj 回答时间:2015-1-5 23:38:47
/**
) h! g: T) u; i7 K/ V" F" J( C  * @brief   This function config usart3.+ {$ f+ i9 z9 l6 I
  * @param  None% `4 o( q- A8 K
  * @retval None
) \5 }% y# m" V$ `; f  */: r/ {$ \! w, M$ {8 b
void Bsp_USART3_Config(void)3 p5 \. [( g( ^9 z5 _
{
$ _9 X: w# ~2 f/ u5 VUSART_InitTypeDef USART_InitStructure;
4 S6 N  |1 u8 o4 j+ c& \* {% _/ V. N  
! ]+ }$ W& V) I5 ~  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //turn on usart3 clock, M) N( b  q! w# e
  ) @+ p, M4 S# j4 `. A1 q1 F
  USART_InitStructure.USART_BaudRate =115200 ;         //波特率设置, S1 `( P% E. s8 G6 _6 P( T; K' l# J
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;% c# n% H. Z6 B5 D4 H
  USART_InitStructure.USART_StopBits = USART_StopBits_1;3 t5 s3 \1 X' f$ H5 N
  USART_InitStructure.USART_Parity = USART_Parity_No;
6 F% f) f/ [- m* K# a4 i1 [- ^  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
% t3 ^+ B% Z! s, P  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
2 z3 b0 J0 Y8 w' G$ a  USART_Init(USART3, &USART_InitStructure);( F3 w( `7 W8 u* w' O
  9 _4 }- G) Q* R' H7 y& B
  //USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);% Y* x3 F3 r- _4 M5 M# m
  USART_Cmd(USART3,ENABLE);
5 l2 t) @- v8 t  USART_ClearFlag(USART3, USART_FLAG_TC);   //清除发送完成标志位
' I" w; z3 C7 }7 l}2 E5 g9 K$ z  l' A
/**6 Q6 ?3 }3 J8 N, t+ {/ ~
  * @brief   This function config nvic.
; F% b" D* B3 ~- Z, Z' L/ X) v2 ?  * @param  None
, Y2 a" M- ~! _4 U! Q7 t/ J  * @retval None: @( E4 e' J. b" w; B' S% a
  */: l2 Z- j8 _; l+ X
void Bsp_NVIC_Config(void)
0 x  r: E9 }. S  D: M{0 A$ _# k  s- ?/ N
  NVIC_InitTypeDef NVIC_InitStructure;
& D/ o+ p& ^6 |  B$ r) a   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);$ b! U0 }" E9 C1 w# K

9 _4 _+ [/ {; K- ]( o3 A7 U9 u  NVIC_InitStructure.NVIC_IRQChannel=TIM1_TRG_COM_TIM11_IRQn;! S+ H0 _6 J3 F) w0 b3 F; ^
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;7 c4 K* z  A, W) N, K  J  ?8 a
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
, u& R; W) J; N8 d; Z* i' G9 g   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
1 c5 w- G9 Z& A+ w, b  e. Y   NVIC_Init(&NVIC_InitStructure);8 F+ V* n1 `/ V6 w- ^4 l9 X& Y
/ u4 Z3 C( A5 X5 Z
  NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_TIM10_IRQn;
8 L% s- N) d/ f* _' \6 Y  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
: |5 s. d$ q( U8 T0 K   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
5 J5 b# O+ Y8 W* j6 T9 |1 q   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
4 h% M* ?4 {9 N1 F2 n   NVIC_Init(&NVIC_InitStructure);6 R- B" N0 K" m
}: }4 x, \8 P2 s! k8 o, B* A# y; w! M
/**$ b4 W+ ?" ~  g) Q) j
  * @brief   This function config timer2.
1 T) w- X$ h. G4 k& I  * @param  None
, J$ `8 J- B! Z( `4 C7 Q2 @  * @retval None# P5 E! r# ^& l  G, {
  */
1 [6 f# @# j. y4 j; y$ L, u6 X: Nvoid Bsp_TIM2_Config(void)
; q: a% z, ]2 d7 D1 e5 |4 w{
6 Q6 I% L) |$ e5 K: CTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
3 X5 a8 x+ \+ I3 g& h* ?, @
% q; T; _+ B- NRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //打开定时器2的时钟
, A! _+ z4 t7 }$ ^' h: f# b8 {  TIM_DeInit(TIM2);
6 Z4 I% C# d0 n, x/ J
% h" h1 L- W; V# D, @TIM_TimeBaseStructure.TIM_Prescaler=0;                       4 D8 D% g8 \" }1 s7 u- Y. i* {
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;      //定时器2向上计数
7 o! }: G- `3 x3 _  TIM_TimeBaseStructure.TIM_Period=0xffff;                         2 S( N: E! P" J7 d# J6 Y
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
& P& D6 X& \$ x  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
% }5 p1 }: R2 t+ N- O' C+ V7 w( O
8 a+ G6 V" M( q# gTIM2->ARR|=0XFFFFFFFF;   //配置1 c7 X2 f: L/ E  J. W
//定时器2外部时钟模式1的配置( M& C2 n  E  m4 U0 ~8 [* G' m6 a
TIM2->CCMR1|=0X0001;   7 T3 T5 h8 }: L4 ~, W
TIM2->CCER&=0XFFF5;
/ z- J# \6 q, U4 q2 aTIM2->SMCR|=0X0057;8 I1 h# g7 n- z- t& [' l
( w0 t  U$ S! x. S$ q/ S
TIM_ClearFlag(TIM2,TIM_FLAG_Update);    //初始化时必须将溢出中断清0必须在开溢出中断之前。# Q: h" E9 m- {% q) K% |8 O% y
}5 M+ r  ?1 J! H& S
/**4 L( f5 n4 ^% }2 n5 c8 P: l+ U
  * @brief   This function config timer4.3 g+ ^0 M- m9 Y7 u
  * @param  None
' I$ V# o: w: M4 p" F: Q  * @retval None9 a5 E* S8 l5 J7 s' m
  */
8 b3 K- [; A# K+ ]2 }- m& yvoid Bsp_TIM4_Config(void)
7 K  Y; X1 B, I{
) a+ N7 R1 n5 d" ?0 Q1 \  o4 ?  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/ e) J6 ^) n( h! U
TIM_OCInitTypeDef TIM_OCInitStructure;
. @  o- t7 q% {/ w
5 s& S* k. m: g: }+ v: BRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  //turn on TIM4 clock TIM_TimeBaseStructure.TIM_Prescaler=1;          //Fck_cnt=84MHZ/2=42MHZ
, }2 q) m3 y$ Z1 }TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //TIM3 Count mode( Y; Z5 o- \$ S
TIM_TimeBaseStructure.TIM_Period=699;         //Fout_clk=Fclk_cnt/(ARR+1)=42000/700=60KHZ
8 o8 x1 `5 P5 W# K0 DTIM_TimeBaseStructure.TIM_ClockDivision=0;   3 m; k, k# S  z; r4 p: }$ g
- O$ G5 Y# w$ M( f( u! }) {. w
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
' [1 z2 t! K! b( ~, H% c% [4 t9 I( w+ T* z! ^4 b
/* PWM1 Mode configuration: TIM4_Ch1 */1 _) D& g# k0 Y! R) i2 N9 Y
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
7 T. {/ J0 w' N; X7 BTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc1 as output 0 \2 L) L9 T) I; q9 v$ K, ~
TIM_OCInitStructure.TIM_Pulse=350;                            //config TIM3_CCR1 vaule! T' D! s2 l" `# B$ C# M
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc1 high level avaliable
% K# \: G8 q& A. Z* K8 }4 ITIM_OC1Init(TIM4, &TIM_OCInitStructure);% _. o8 x6 V2 R/ r3 o( W% p
7 r0 ]* q7 y" F9 q- y
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc1 preload & d$ h. p/ G9 G' p1 _6 [

7 S) e  X; j! A# b/* PWM1 Mode configuration: TIM4_Ch2 */9 X/ c. q8 ~5 u( K' y9 E
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode2 u7 L, b& k- n( M+ r7 \* i
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc2 as output # T& y) H2 m3 F8 X& ~! A6 @" S& M
TIM_OCInitStructure.TIM_Pulse=500;                            //config TIM3_CCR2 vaule
- x& [! j' b+ L8 g* o  p' M7 h# dTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc2 high level avaliable
. |% n6 C4 B6 X# d% ITIM_OC2Init(TIM4, &TIM_OCInitStructure);
# d, b; g" R' Y$ X. _8 |3 K/ T2 v+ A! p) Q+ a. `2 O( `$ X
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc2 preload
3 F$ R7 T. j$ N; i0 L& A1 y$ |: g; c1 o+ y/ s- }* x3 e; U
/* PWM1 Mode configuration: TIM4_CH3 */
+ j( ^" M# l$ A4 R2 W( y; k7 Z5 l* KTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode
* ?: I2 b3 _, y& K8 {1 pTIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc3 as output 2 c% J# o/ o6 B7 F# o/ @
TIM_OCInitStructure.TIM_Pulse=100;                            //config TIM3_CCR1 vaule& v& `/ m# b# D' b( D% Y
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc3 high level avaliable
  z, {6 l- g1 E/ I: |TIM_OC3Init(TIM4, &TIM_OCInitStructure);. y+ c3 m* q% P
/ E( w2 Z; P* `4 B+ S3 w: j2 a
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc3 preload & G& `# p9 [) Q& c' H8 t
/* PWM1 Mode configuration: TIM4_CH4 *// p1 X* N, z* Y$ e. H( V/ v3 @( [
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //select PWM1 mode6 J* _7 X- k/ s2 H( _3 O
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //config oc4 as output / ^1 B9 p, {3 N' n4 Z
TIM_OCInitStructure.TIM_Pulse=600;                            //config TIM3_CCR1 vaule5 A) y# ~# a8 s3 \
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //config oc4 high level avaliable
  r" G& L% v; F7 s5 w% Q# ]! eTIM_OC4Init(TIM4, &TIM_OCInitStructure);
/ H; m4 l  ]+ s, i# U
3 u5 w8 L6 w! X. f8 O  n4 D8 L" [TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);         // turn on oc4 preload
- a+ F4 w; W7 u3 ?1 A- Z
1 |- `( J0 d- h8 t0 M* R) O' E: yTIM_ARRPreloadConfig(TIM4, ENABLE);  /* TIM3 enable counter */
3 X9 \- ^# j  o/ Z' @  TIM_Cmd(TIM4, ENABLE);. r0 {; |- c. Y6 i. Z2 O, w

- q* |$ m# d- p}
9 Z. T7 l  V9 i, |3 ~定时器1触发中断程序如下:
; {5 w* F0 E6 J1 Y& T2 t: z) nvoid TIM1_TRG_COM_TIM11_IRQHandler(void)
6 j! s( S* g& S9 S! D8 w5 p' D{: l  P# x$ L4 W" s+ n
if(TIM_GetITStatus(TIM1,TIM_IT_Trigger)==SET)  //检查是否为触发中断( a( U- Y4 P. J" H  V0 x
{
& p) b6 W$ E9 H" x5 A; R- b  TIM1->DIER&=0XFFBF;    //清除定时器1的触发中断* A! N! ~6 V* f9 g5 q0 u( v
  TIM1->DIER|=0X0001;    //使能定时器1的溢出中断8 X! @/ c' S0 z1 J  E6 z) J
  TIM2->CR1|=0X0001;    //打开定时器2使其对标准信号开始计数% C& s1 B% Q/ Q. x4 L5 S7 o
  TIM1->SR&=0XFFBF;     //在退出中断之前必须清除其中断标志位- T" G9 S; W5 b4 p6 D8 p& R7 m
}/ l0 f' ^6 g! W& @$ ^
}
. X3 _! R( H! z1 T7 R$ S定时器1溢出中断如下:5 h  V' z  B, Z4 P5 t$ X- |/ ?
void TIM1_UP_TIM10_IRQHandler(void)
. x' F2 v- y. f' i. O: A{
/ J4 y7 I. x5 b  xif(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET)  //检查定时器1溢出标志位是否置1
1 n+ B2 P- V! [{# a3 J; t9 n. H
  n_Counter=TIM2->CNT;  //读出计数器2的值' S& e. ^, E8 u* s- Y5 S
  TIM1->CR1&=0XFFFE;    //关闭定时器16 q, J* d( U  w' h
  TIM2->CR1&=0XFFFE;    //关闭定时器2! x7 _' I7 Y/ M" m+ }
  TIM2->CNT&=0X0000;    //清除计数器2计数寄存器的值5 h8 w! C8 E' R2 F
  TimeFlag=1;          //1s标志位置16 h& q7 R- C5 a! u
  TIM1->SR&=0XFFFE;    //退出定时器1溢出中断之前,必须清除定时器1的溢出标志位; ~& }+ X8 x3 c+ S* J/ \( `0 F
}; |) T+ j! Y: W9 F2 |  Q3 {& k( o
}
6 l8 r5 }( W. `& y; f( U' A</i>
5 y$ f6 P; A* B3 f5 c
! p6 [$ l2 U$ }" T/ n. J& u5 @7 d! M7 h+ x, H0 k. j& O/ n

! e/ t5 Z: w2 n$ z% {% h4 O
wfmjj 回答时间:2015-1-5 23:44:59
被测信号 标准信号和串口输出如下图!
8 L4 e$ a* ^5 j. d" x! I" V4 e 被测信号1.jpg 标准信号1.jpg 串口3接收的数据.jpg 未命名.JPG
  N( R. ~! P1 O3 q. t6 p* x7 I
党国特派员 回答时间:2015-1-6 01:20:50
收藏下,以后再用。
qzwx741 回答时间:2015-1-6 08:29:03
收藏下,谢谢
6874577 回答时间:2015-1-6 11:03:59
收藏下,谢谢
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版