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

STM32F单纯的TIM2定时器溢出中断试验程序

[复制链接]
endlesswind 发布时间:2008-9-3 20:04
STM32F定时器的功能非常丰富,像我这样单纯的TIM2定时器溢出中断人恐怕不多了,所以找例子资料也找不到费了九牛二虎之力终于杜撰出来了,发帖庆祝!我这里用了ST新版的STM32F FWLIB2.0库,用到的函数都添加了中文注释。
3 i* e, ]" T' i) k0 ^- F. f& b; Y: A& N0 X% s' x: ]
/* Includes ------------------------------------------------------------------*/
& P7 G; o. h+ w% t' W) ^5 ~#include "stm32f10x_lib.h"8 }4 z3 f8 q1 S# F

& R4 ?! g9 @4 A/ qErrorStatus HSEStartUpStatus;
" {. R8 U; i& L5 Y7 q0 [0 Y' Z
1 ]4 B3 O1 `) Q, s9 Yvoid RCC_Configuration(void);- G( P, f1 v5 m
void GPIO_Configuration(void);- e% G, O3 A0 B
void NVIC_Configuration(void);4 k' D# D. s, N& B
void TIM_Configuration(void);
- Z- S2 W' {' x6 }- k' U& h- Ivoid delay(void);
1 u0 M# X# G0 a; [
' ^$ G: q1 \6 d1 I9 O7 q- @( G% U4 B
7 U1 x; q+ J9 O8 D
' Z0 [5 a+ A2 J, Z8 T, [8 v! x/*******************************************************************************
5 z" V+ h9 w; p+ w3 ], w8 q* Function Name  : main
( T9 ]' d0 X$ G; _% r5 U* Description    : Main program
$ D$ f0 }* B( r. }* Input          : None
) a- D0 O3 p+ g/ U) Z  q$ T% n0 B* Output         : None
. @/ t0 g2 }1 X9 q! z5 T/ j: b) v1 \# Q* Return         : None+ ?7 e, }; B! _; O  W* @; D, G$ l
*******************************************************************************/
0 r5 H: ]! z" y2 U( L9 Gint main(void)
6 B! U1 r# m; E: i. I{1 q+ m1 {4 f1 Y% \; j. R

9 L4 }# z7 ~! |" Z2 o* B) {) o#ifdef DEBUG5 }+ P1 l) I9 {5 O$ A& m
  debug();/*[初始化外围设备指针]*/2 w5 m7 E5 z+ v8 ]7 X
#endif/ Q5 n6 T* i0 o- k) v: y
  GPIO_Configuration();//初始化io口; D+ J1 i: T; L1 y: n2 P8 Z
  NVIC_Configuration();//初始化中断嵌套
; v# y, p/ {/ t7 }: A  RCC_Configuration(); //初始化时钟与复位
, `3 D! @' J( x. v& Z  TIM_Configuration();//初始化定时器
3 M* p/ a2 |, E1 R! b0 Z" g6 R- U9 |, Q2 O% j% @
  while(1)' P( s; e: X7 m& ^; L: |
  {) v# z( k+ Y9 g* U

) n; y+ l1 d5 X! v5 k7 L      delay();
0 s% I5 k/ {5 ]4 m  ^  }2 E  |. w, g. H' E
}1 u$ [: X. Y3 t9 K9 a0 `( M
6 a+ {$ i7 x. `& R! ?/ f  S
/*******************************************************************************
4 n1 I( v+ r8 o8 w# d* Function Name  : RCC_Configuration
0 {; e9 T. V: x$ G* a6 Z* Description    : Configures the different system clocks." t# ^* Y  h9 n
* Input          : None
) E1 w. x3 k2 D  v4 w* Output         : None8 _- t1 P5 x6 |9 t# D" \  G: `' J3 X
* Return         : None
+ h2 ^$ A3 h. y  q3 K2 O4 L*******************************************************************************/
& H1 k5 A( j8 \1 G0 {void RCC_Configuration(void)
1 p  F+ j) ~4 ^9 u9 j  S9 c{
. Q. H+ D7 J& b$ L) p  /* RCC system reset(for debug purpose)[复位RCC外围设备寄存器到默认复位值] */
" N- M: S7 t& I0 ~8 `! c) {2 ^1 U8 }  RCC_DeInit();
' u, P, P* f2 O  [' I. ?' b  N, E; Q% f) ]& o
  /* Enable HSE [HSE振荡器开启]*/) U3 n. T! M0 `, j- W6 B
  RCC_HSEConfig(RCC_HSE_ON);5 B4 r5 [( T1 ~% T

1 }% v- b) z& t9 ?; o4 V' _  /* Wait till HSE is ready [等待HSE启动]*/
3 A% A' @! _; b0 }* G  HSEStartUpStatus = RCC_WaitForHSEStartUp();
$ ~+ N  ?0 `! Q& m5 H; i. J$ b! I0 A2 V) Q& k# Q6 h5 l% f+ @
  if(HSEStartUpStatus == SUCCESS)* f6 w0 j2 {* v/ a: Z# n
  {% y  M  F" F: K+ t9 e9 p
    /* Enable Prefetch Buffer [预取缓冲区允许]*/. K" \1 o* _0 o+ w5 t8 a
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
6 Z4 U; q& C  L7 R, O6 I% V) Y3 F+ e6 r# p5 ~8 t5 M
    /* Flash 2 wait state[代码2个延时周期] */$ M8 n. Y  Z3 L" Q! w9 X
    FLASH_SetLatency(FLASH_Latency_2);8 I! O% x3 b' i2 j
3 J7 w  t" @1 U/ s  L
    /* HCLK = SYSCLK [AHB时钟等于SYSCLK]*/
! U9 H- Q8 V" i, `* p    RCC_HCLKConfig(RCC_SYSCLK_Div1);
" D/ I2 v$ w% O+ J  ; ?; v* `& M' Z" |
    /* PCLK2 = HCLK [APB2时钟等于HCLK]*/
/ p- b: g; U- c' J) R9 O. z% D1 @    RCC_PCLK2Config(RCC_HCLK_Div1);
. f; l# _6 }6 o4 [3 Y4 p+ X5 W8 @. a" g- Z0 |! E+ ?' W
    /* PCLK1 = HCLK/2 [低速APB1时钟等于HCLK/2]*/, i, {$ ^. I5 b# h3 A
    RCC_PCLK1Config(RCC_HCLK_Div2);
# c- f+ ^6 {. Y8 H9 E9 R1 M) V
' i7 ]6 q7 ]% s8 E+ w2 S    /* PLLCLK = 8MHz * 9 = 72 MHz [配置PLL时钟源和乘法因子][PLL时钟输入等于HSE时钟][PLL乘法因子取值9]*/0 P, f2 a3 }- z( n! r4 j
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);+ ~6 _* g+ [! l2 r) M9 e9 s( e
& j- ]% l& B6 y# q& d' k, S
    /* Enable PLL [允许PLL]*/ " o0 D( F5 t9 O* m) V. r
    RCC_PLLCmd(ENABLE);/ a( T- n# a8 u9 Y; a6 r' k
, h/ b/ Z7 H4 |( y8 ?
    /* Wait till PLL is ready [等待PLL时钟就绪]*/
+ d) a4 @6 u8 V$ j9 Q5 C0 A+ G6 g    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
% X2 n$ T& L9 b* v4 b- o    {7 G$ A: ?" ^7 g2 w
    }$ r6 i+ D% \/ \9 _5 D
  C  b$ I9 I0 p' f
    /* Select PLL as system clock source [选择PLL作为系统时钟]*/
& o. |' z. h# S- f' \    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
+ L7 r% w2 N( `
" w) }  P, r8 a    /* Wait till PLL is used as system clock source[等待PLL被作为系统时钟] */  y8 s; `+ Z  Y+ l
    while(RCC_GetSYSCLKSource() != 0x08)
( G  z5 {* {3 A$ U* O- K    {$ |3 l6 u. S2 d  K9 U9 \
    }+ v% e( T( L% Z* Q
  }
2 c4 q! A+ Q+ t" ?5 V+ u    /* TIM2 clock enable [TIM2定时器允许]*/
4 Z% R6 w, a# ?* u  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
5 D( E/ F) ?  @5 p+ f4 u                     
3 q9 n! G: T3 E+ a, m, Q
+ @% m( q/ R3 s. x6 ~}$ }$ B; @6 t2 I# Q! U
: S: ~; \4 c5 z+ L2 M: S7 S
/*******************************************************************************
9 J  r" \: c: z, H* Function Name  : GPIO_Configuration( O. x/ |/ E) {9 Y. m5 L
* Description    : LED输出配置$ f$ _( a7 m9 \
* Input          : None
2 \; E* ]" L2 G( P; J* Output         : None
$ H9 o- v( T5 k$ `  s5 Q* Return         : None+ j# T( X2 C9 a/ W/ f
*******************************************************************************/
4 _( q3 i. B, S# W1 E' |! J( |& |void GPIO_Configuration(void)
$ a+ ^( Y2 |2 V6 c% I( U" u{
! p) P- M; D3 e2 n  GPIO_InitTypeDef GPIO_InitStructure;
4 j6 f0 t; t- y, L" u( o" N, Y1 {8 z' ?7 N) o1 M0 u- B0 V3 L2 P
  /* Enable GPIOC clock [使能GPIOC时钟]*/7 B3 Z$ u( c' A$ r" s/ u
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);; V' r" R) V+ s

* |6 w5 q0 h) @  [- o3 F  /* Configure PC.04, PC.05, PC.06 and PC.07 as output push-pull[把PC4、PC5、PC6、PC7配置成输出模式] */6 w3 e! o: N) U* R; Y/ h& I
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5;* Y5 ~5 Y" Q1 C& U* r
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& F( T# r% i+ p1 f1 z3 L- z  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO最高速度50MHz8 A2 U" _4 I0 M. w4 y9 r' G$ S
  GPIO_Init(GPIOC, &GPIO_InitStructure);
% Z& `# \& a; a}, c7 x: V2 V) g; u# ]+ J! D2 f: M+ x

2 X9 p+ H; _6 u) n/*******************************************************************************
) ~0 G7 T) W% g0 [6 J0 c* Function Name  : NVIC_Configuration
2 L/ `  N2 @. Y* Description    : Configures the nested vectored interrupt controller.[配置中断向量表的起始位置]5 ^! Z; q6 @% h7 F6 G+ _2 o: ]
* Input          : None  Z6 [$ e$ R; q
* Output         : None
& i* j& a0 `5 e% M" t6 R% V* Return         : None# v( g# b" u  L9 g$ I/ B
*******************************************************************************/2 z& J5 {$ ^2 W9 Y
void NVIC_Configuration(void)
! P* y5 E/ X1 a, j{
" I6 K& g2 B- U; I& R2 |  C" U  NVIC_InitTypeDef NVIC_InitStructure;$ P' E! P7 p) _+ v, Y2 S

. \: w& g  Z% R) Y#ifdef  VECT_TAB_RAM  ; e/ M# x0 v# P
  /* Set the Vector Table base location at 0x20000000 [设置中断向量表的起始位置0x20000000]*/ ; S( g( v* j# B) C7 m* i
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
* Q. G3 E# g# q0 w( m8 ]& ]#else  /* VECT_TAB_FLASH  */3 O! a7 z( ]/ h3 e
  /* Set the Vector Table base location at 0x08000000[设置中断向量表的起始位置0x0x08000000] */ 8 D# w2 ~( X5 W* d0 c% v) V. t
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   & l; z9 S8 \1 ^: j8 l4 a8 K5 T. |
#endif
% f9 N3 C/ r" g; n" A# I. a$ f1 l% a4 a4 c2 T4 _( H
  /* Configure the NVIC Preemption Priority Bits[配置优先级组] */  
" U: W; \4 e2 ^7 F6 g; K  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);4 q6 S$ o' i6 d6 D& O0 M8 p
  
* _& g4 @  n8 E- A  /* Enable the TIM2 gloabal Interrupt [允许TIM2全局中断]*/
& }9 j1 w7 Z4 g" s% l1 y  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;3 ]6 k. H, A% C
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;+ z( G  D7 g' S1 ^
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
. ^, ?: ~. s2 F7 y- H% m  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
% g; T1 c; h' t  NVIC_Init(&NVIC_InitStructure);
# E7 B6 l1 Y0 D* A9 }8 z" U}
9 l) [: e; R  c# A4 D6 O' v3 v: Z5 X! A7 r; n( G) [( d+ R# C! w' b
/*******************************************************************************4 a' W; d. x$ Z
* Function Name  : TIM2_Configuration
4 |  P8 k+ |8 P# a* Description    :
: U1 t6 Z5 L% s- G; k! Q* Input          : None
$ q& V7 s! V& r* Output         : None
3 c3 X! p9 h! ~6 B1 w* Return         : None
  A3 d$ Z# J! ]*******************************************************************************/
' R' d9 n2 W# j+ Qvoid TIM_Configuration(void)1 ~& X9 Y3 S: X  O
{ 0 s. P$ J) [* S  O
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;6 r8 H* [$ z$ V# C1 y" r; K
//  TIM_OCInitTypeDef  TIM_OCInitStructure ;8 @' v8 \  l& K4 x$ p% D2 Z
  TIM_DeInit( TIM2);//复位TIM2定时器
7 Z, S2 g7 Q- g: Z. h
% w, s1 q+ B8 Z5 g  /* TIM2 configuration */
5 d1 @- b5 S6 a( ^, O  TIM_TimeBaseStructure.TIM_Period = 0xffff; //最大计数值0xffff      
. L9 e) |7 m; i2 _% c1 E! R# q  TIM_TimeBaseStructure.TIM_Prescaler = 0x36;//分频0x36      
% P# ]9 Y: S. g% w% v  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时钟分割  
0 \  @8 I- o$ w. S# J  _  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数/ M( G- j3 ~* N) ~/ E% ?& Q
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);$ r- l8 u+ I" P
' E, z+ i# b+ Q9 T5 a7 ?% y* R/ f  L
  6 ]* d9 m( U! n+ f, @8 w
  /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
+ Y  ?2 Y3 M* p- T* f' d  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
$ a# ~' c) Q7 C/ F$ y( V  Y# M. r0 V/ L8 q. B- L+ R9 P/ O" Q+ u
# h. v! {9 x1 l0 I/ X2 b6 Q, b
  /* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/
# I/ f* {5 h5 |  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  
4 P' ~. Z5 v# e1 E
4 w5 x, A9 _1 P+ p: {6 S% |  /* TIM2 enable counter [允许tim2计数]*/! C0 E$ l) a9 [7 @+ y5 {2 i4 f1 N
  TIM_Cmd(TIM2, ENABLE);& P8 k0 q# C2 a1 f
}
8 O  Q4 n% e( `: z& W1 e! p' d& M* Z

! v7 l% E1 v$ j9 g4 {/*******************************************************************************8 y. Z2 K1 ?/ M2 m5 i
* Function Name  : delay! N8 t8 o6 |, l0 M. k
* Description    : 延时' s; F" E! s* ^* E" s2 D( M
* Input          : None
$ ~8 P  {* z: u/ _* Output         : None
/ c" w6 T' Y5 x% t* Return         : None' m9 K. j& ]2 ^" M" U' ]& X
*******************************************************************************/
8 Z- ]6 j$ Q' ]void delay(void)
6 s! |  ~8 z; V" W{% [( C: V/ {3 l9 ]: p# ^& S
  u32 i,j;
% U9 P$ v2 W% v, u/ m$ M' Q  for (i=0; i
赞 收藏 评论2 发布时间:2008-9-3 20:04

举报

2个回答
oktigerxia 回答时间:2009-4-16 16:48:13

RE:STM32F单纯的TIM2定时器溢出中断试验程序

你中断处理程序是什么啊?也贴出借鉴一下
qianzh10 回答时间:2012-2-2 15:42:50

RE:STM32F单纯的TIM2定时器溢出中断试验程序

谢谢,正需要定时器的代码

所属标签

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