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

TIM5定时器点亮LED

[复制链接]
在路上11111111 发布时间:2017-3-9 21:06
  1. #include "stm32f10x.h"7 d, Z- c6 _: L3 ]! o8 H5 c
  2. #include "stdio.h"
    5 l# n" \% S& b! o6 C1 }, \8 s/ P
  3. uint8_t flag = 0;' W0 ?4 F  a9 r. {4 O" j
  4. void STM32_LED_Configuration(void)
    & h- A! ?+ `! f+ \
  5. {5 [* u9 C1 p$ A+ B
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
    % o. o: E' U4 U0 V: K9 ~
  7.        
    ; M* ~- p7 Q6 G) f9 l: V3 R$ x% ~3 v& H
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);9 v% z! F0 N8 E' X* m% C% a. \/ v
  9.        
    # M, v9 ?& n1 A6 n- L! R
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    1 A6 |# q7 \9 f0 ^  A6 S9 Z2 p
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  E$ M4 I* f& k/ ^8 O5 r
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_7;* I0 Z" d. P3 ]/ W3 j
  13.         GPIO_Init(GPIOD,&GPIO_InitStructure);
    5 H& Z" r$ p4 d( ]6 R
  14.         ! x! w/ Z# a- @0 y0 [  [
  15.         GPIOD->BSRR = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_7;1 T8 P8 N; n1 h2 |
  16. }
    9 O* j3 N; l1 d1 l8 l" B
  17. void NVIC_TIM5Configuration(void)
    1 |: L3 l0 v/ S3 m1 U
  18. {1 z8 t% W* K2 U( D; q
  19.         NVIC_InitTypeDef  NVIC_InitStructure;: |% Y2 T5 o- a* ?) B7 X
  20.        
    # V( z2 p6 E# r% k! c, b; R$ @% X
  21.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    # P" \; {4 p3 K) T# y
  22.         NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
    . n- \3 W6 f3 Z0 F% `6 M- k* d
  23.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ( V! Y0 s) h! e4 u& B: `4 Q
  24.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;8 r& E% W3 F7 m/ v
  25.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;3 {. s9 f" G" c; `6 N+ J, {4 q
  26.   NVIC_Init(&NVIC_InitStructure);
    , W" y' ?! i, c( _
  27. }% o( u7 z" ?2 i
  28.   G' Z$ z! z  V/ w4 J
  29. void TIM5_Init(void)
    ' B: F! y4 [1 ]4 Z6 |. F' Y  e
  30. {
    5 R  K% `5 G0 ?1 r8 s+ d9 E
  31.         TIM_TimeBaseInitTypeDef  TIM_Time_BaseInitStructure;2 ]* K4 _! a1 e2 P, A
  32.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//打开TIM5的时钟;2 k7 F) o1 f7 m; L
  33.         ) K: u" {7 T- W$ m( g
  34.         TIM_Time_BaseInitStructure.TIM_Prescaler = (100 - 1);//预分频器寄存器1ms" _. o# E8 D; b+ l! p9 x
  35.         //这个是你要设置的预分频器的数值;
    $ y# j- a- G- q4 `
  36.         //就是将你的频率分成多少比如说你要将其分频成36000HZ的话就是预分频的数值设置成72000000/36000;
    8 c: o5 B/ q7 L- ~* f" J: q
  37.         //这个值就是用来和计数值相互合作的,可以减少一个数值的使用大小的范围;. ?6 t1 v* }% W  K" G( L+ _1 l
  38.         //16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意9 o6 d  Q* S- b/ W. {4 c
  39.        
    1 F* d7 g7 p; R( d8 z
  40.         TIM_Time_BaseInitStructure.TIM_Period = (720 - 1);//自动装载寄存器
    / s6 u* `* o' X5 N% n
  41.         //这个是你要自动重装载的值;
    ( i# g) K! i' p' t# z
  42.         //只要这两个数是72M的整数倍即可(72M是APB1没有进行分频的情况下的数值,如果分频 的话* j4 T/ Z" H  ^7 \. |+ A& k2 V
  43.         //需要的就是*2,
    # S- u! {8 Y5 _( P
  44.         TIM_Time_BaseInitStructure.TIM_ClockDivision = 0;//这个就是一个时钟分割;现阶段没怎么用的到# {6 w4 l* m& ^( `1 Z- m
  45.        
    3 v7 z' P, o4 z7 Q$ W
  46.         TIM_Time_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;1 m6 f( X" J' T
  47.         //计数的方式;$ Q7 Z+ d" G4 ^# A* `- N, @
  48.         //向下计数;
    / V. N8 K3 i. @$ V! f7 s5 q
  49.         ( q- L" K, F# l
  50.         TIM_TimeBaseInit(TIM5,&TIM_Time_BaseInitStructure);
    1 t* p$ C2 X$ R" ~* g/ h/ w
  51.         //初始化TIM5
    6 R5 d1 r; i- w3 O! o3 d4 S5 g
  52.         6 D! ~8 @% D  a; }$ W% C, n
  53.         TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
    0 ~6 c. V* U% M. t8 K6 i
  54.         # w& ]8 P3 i/ }+ [) {, M# ~; W
  55.         7 W7 M! h9 H( n: W. R
  56.         TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
    : Z1 T% O6 u7 d; ?: S. v7 G
  57.         //这个是使能中断;7 `" w* L9 B3 ?; R% E  a& D! t; S
  58.         TIM_Cmd(TIM5,ENABLE);
    ! q% R; |2 W1 V# _
  59.         //使能TIM5# E3 g4 ^' t* U7 A+ |9 R9 y, @
  60. }5 D( @9 x* {3 K0 J4 i5 q
  61. void TIM5_IRQHandler(void)
    5 @# Q8 Z+ B# B
  62. {8 b/ t, `, s& g/ Y- a6 v2 u1 ?
  63.         if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET)# T8 J0 T2 H" {$ x6 w0 p. H' y9 O1 t
  64.         {
    : @4 |3 i* ?* q
  65.     TIM_ClearITPendingBit(TIM5,TIM_IT_Update);' E) u2 U- }% Q0 J  C, N( o
  66.                 flag = 1;
    2 b- v3 r2 o; a$ `2 C' c% R
  67.     GPIOD->ODR ^= GPIO_Pin_7;& x' n* X- P1 ?  X  {% p
  68.         }
    : x1 e& l& u- J0 M- v8 W% H* E8 V& O
  69. }        0 ~5 i# e( D" a8 ^/ K; z
  70. void STM32_USART_Config()1 H! k9 M; `' s, \- e: |2 {6 o5 g
  71. {
    8 T9 Y3 a) z9 p, c6 T2 j3 [' L' w
  72.         USART_InitTypeDef USART_InitStructure;
    9 s7 \' f$ H4 v
  73.         GPIO_InitTypeDef  GPIO_InitStructure;, D/ _6 x% V* J! F) X+ ^
  74.        
    / j$ Y- E0 E4 p4 C8 M
  75.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);2 }! J+ M( c$ c( U; S
  76.         GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
    8 u! D- S9 f5 P
  77.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    8 }! F  o% ~) c6 h
  78.         $ J  Q' w% z" l! v% R
  79.        
    $ Z" x" p7 w/ k% H+ [
  80.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;8 U0 g9 _. K) a) O# d
  81.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    ) h0 t) Z' I6 @, V
  82.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: A& z! s" R# \6 |5 @3 ?( h3 W) g
  83.         GPIO_Init(GPIOD,&GPIO_InitStructure);
    / h  u1 Q! s4 Y6 G* l- S; s
  84.         0 x$ k8 W7 G) f" o9 H
  85.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;* O! k: F) S3 l5 E  ?
  86.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    + z# E* w6 |7 b# ?! a! h* M& T* Z
  87.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    / j. R+ z  D0 G& [
  88.         GPIO_Init(GPIOD,&GPIO_InitStructure);
    * H9 y2 r. c; N5 Z: V
  89.        
    2 z: q9 B9 k2 q: `8 w& g) Z$ G, b
  90.         USART_InitStructure.USART_BaudRate = 115200;0 u' N9 p' Q, U( _  K2 p' p+ t
  91.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    4 U% E" Z* M1 \$ V
  92.         USART_InitStructure.USART_StopBits = USART_StopBits_1;9 v+ D6 R- I0 N6 r3 T
  93.         USART_InitStructure.USART_Parity = USART_Parity_No;: }# b& `2 M& |1 c7 c* K- ?
  94.         USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    ! U- d! E& K! |& B1 L1 x$ W
  95.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    0 t7 D" \) N/ s
  96.         USART_Init(USART2,&USART_InitStructure);
    # f7 d/ b; _9 p! f
  97.         : `6 r/ M- [; c. A* J( w" P
  98.         USART_Cmd(USART2,ENABLE);7 D& Y) L: x+ Y' r; F
  99. }7 e2 @' O% |6 l6 i, J" B  {4 L
  100. / `9 ~6 c4 L2 j6 b- ^# [
  101. #ifndef MicroLIB' I! l8 o% ?. F
  102. //#pragma import(__use_no_semihosting)             //没有实现fgetc时需要声明该参数   
    ' V' O  q! o/ @+ @
  103. /* 标准库需要的支持函数 使用printf()调试打印不需要实现该函数 */               
    5 e, T8 O. Z% {! D( h
  104. struct __FILE ! d$ @* T# o1 w- {! ^: [* c1 b
  105. {
    ( z* @2 v1 r; z5 P
  106.         int handle; 4 C. M& D6 R, ~8 z$ m
  107.     /* Whatever you require here. If the only file you are using is */    " v* I: f8 u' A) x, J& Z% _
  108.     /* standard output using printf() for debugging, no file handling */    6 b8 H9 G* r  n
  109.     /* is required. */
    ' w1 S. T( a2 R3 }6 y, [
  110. };   i+ [2 g# H7 d2 J( a
  111. & y9 `0 r; l8 t( G" R6 K3 c
  112. FILE __stdout;       , S9 D' M- c' [: ~5 h% n8 Q
  113. //定义_sys_exit()以避免使用半主机模式    / X$ O8 _6 V0 Z3 n3 ]
  114. _sys_exit(int x)
    ) S2 A2 N6 G: g3 o  t
  115. {
    9 [2 \+ n8 M1 o: G6 y2 Q
  116.         x = x;   P2 k5 F5 u. {' N: D
  117. }
    . s6 i7 q. p% n
  118. /* 重定义fputc函数 如果使用MicroLIB只需要重定义fputc函数即可 */  $ u7 \7 E+ f& v% J( h
  119. int fputc(int ch, FILE *f)
    : B" e5 A2 [4 Y: t0 U) A
  120. {% F" ^4 ^) c1 {! q" W2 r4 ^
  121.     /* Place your implementation of fputc here */
    ( R: V/ i  m0 |2 f1 E
  122. & I+ S: j8 @& I( D. i
  123.          /* e.g. write a character to the USART */
    # S" Y. o5 K# j& E* ~) S, z3 j+ i$ J: L
  124.     USART_SendData(USART2, (uint8_t) ch);* i& E6 R) G. l/ r4 a; p- Y- e
  125. 0 `3 f9 E" Y; O
  126.     /* Loop until the end of transmission */
    $ N9 g" [% o6 y5 Y4 R
  127.     while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)% {4 x2 H! c; h. X# q  W
  128.     {}
    + c# E8 q$ M* z" B' z
  129. 0 g; E( f4 s& }+ c- Z9 ]' T& m
  130.     return ch;
    ( ]8 a- F: m% }; d) K! T! J, b
  131. }" X% V5 y5 k. W
  132. /*
    ' x% W) G9 C! k& Z5 n) L
  133. 可以直接使用putchar
    ) y" D+ b5 D  N0 \, J7 Q" E3 Q1 d
  134. 不需要再定义 int putchar(int ch),因为stdio.h中有如下定义: ^0 p' k+ p& B* E  V0 x7 R" }7 p
  135. #define putchar(c) putc(c, stdout)
    9 T1 N1 s  |8 T$ p2 f2 f: k4 T$ G
  136. */
    ; v% s1 k9 q9 ~2 O+ i
  137. $ F6 C( j& w# ^$ v, y; e( r
  138. int ferror(FILE *f) {  & U$ ?3 U2 I3 P3 S! s, u
  139.     /* Your implementation of ferror */  
    3 c! ^1 \6 a+ Y  e- O9 X! S
  140.     return EOF;  , Q( U5 P6 W$ m5 n" c
  141. }
    7 q. H9 x7 @4 ~" r& `4 D( d8 [: f
  142. #endif
    ) @7 k) K& o: A7 c: ~

  143. 7 S) s& C- t9 R/ j2 T
  144. FILE __stdin;) |. J- f7 e, V) E- t

  145. 4 ~, w' f& [. G* y7 F4 `  D
  146. int fgetc(FILE *fp)5 X8 @7 C8 y/ R  H' ~* i& x
  147. {
    ) E7 Z0 z- a8 `6 j5 a% J; w5 ~% J
  148.         int ch = 0;6 }5 d+ r6 A2 L  k+ v
  149.        
    6 n4 L4 X8 h* p- v& ~
  150.     while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
    $ n% ~$ s* K. o. j
  151.     {
    8 C' a  j, ]* ]4 W
  152.     }" w, h( K4 t/ @6 r; b' W
  153. 4 \* h1 l) v2 i9 C7 m. K5 o2 d. \
  154.     ch = (int)USART2->DR & 0xFF;& \: Q3 k4 u6 [1 P; c& D2 u
  155.         9 p3 Z6 k& z6 G7 m8 ?# |) I' T
  156.     putchar(ch); //回显
    ; W: h8 }( G6 v/ a
  157.        
    * @; k- A: |" E# k  l  f% U/ L
  158.         return ch;
      t8 [; ], {) P5 i% R
  159. }
    $ H! m0 v. H) j/ Y- m
  160. / \7 x) R2 o# d
  161. int main()" s8 A9 R: n. X5 c5 f( U
  162. {
    - a. {9 T0 _% b; x* x) |& c# B. c
  163.         uint8_t  Count =0;
    - p$ L$ C3 ^! v0 c$ `1 g" _1 m
  164.         uint32_t PwmValue = 0;$ `4 p" a7 t( W% R
  165.         uint32_t DirValue = 0;! j# M% K7 d/ y: L
  166.         STM32_LED_Configuration();
    . z2 I+ i: o1 p5 a
  167.   NVIC_TIM5Configuration();. T, a# }0 h. H! m' H; U
  168.         TIM5_Init();+ A2 M/ J: @+ t: x6 z) Z5 F
  169.         STM32_USART_Config();
    + x" `; m: U$ ^, k% R* t1 G
  170.        
      Q( t% ~" ~% T: ^( F8 K8 u
  171.         while(1)1 u* y! Z5 o0 v1 j( b3 d$ Q
  172.         {
    % ]7 L% _% w3 H; N; `" G1 ^5 y+ Q

  173. 9 M- G  b7 k) L* g, W
  174.                 if(flag == 1)
    6 W8 v( ^5 u1 Y. f
  175.                 {
    : g8 J9 k) P% c6 ~6 a; }
  176.                         flag = 0;
    ) l8 y+ v& p* e3 O1 c
  177.                         printf("\r\n   TIMI的实验,第%d个周期发送数据 \r\n",Count++);
      c  D& u7 Q2 h2 `$ C
  178.                 }
    . t; }6 m  r, ]' U  ~+ z, H
  179.                 # O- c. Z, y) K# D# A: a
  180.         }
    7 }# I& U9 A% |) H- x
  181. }
    4 x! Z: X5 h# t, P
  182. , Q+ w2 ~. }' c5 C

  183. ( g! b9 n0 z8 t) y) l$ i
  184. <img src="https://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=390661&size=300x300&key=254b7fc2b1c5f5b3&nocache=yes&type=fixnone" aid="attachimg_390661" alt="" border="0">- |" m* T' M" ?0 y# V) s
  185. $ B, f3 q3 Z9 ~
  186. 在下有个两个问题想问一下:9 J8 f4 i6 S- G* }" l6 H
  187. 1:为什么我设置的是1ms去点亮一下,为什么测试的是500HZ;
    ) U2 m* Y6 W" b; s2 {, ]
  188. 2:我在改定时器的数值大小的时候,为什么我改到频率的数值好几M以后,还是显示300KHz;, j2 p' g# L; r" X
  189. 希望大家帮我解决一下
    : i# V) h% i, \8 k8 c' M
复制代码
5 l4 T8 }- e* L* ]( G$ S

" Y9 g, R3 W" v% X0 r2 j8 n0 ^+ D6 y

为啥是500HZ不是1000HZ

为啥是500HZ不是1000HZ

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

赞 收藏 1 评论2 发布时间:2017-3-9 21:06

举报

2个回答
zhao.zhao 回答时间:2017-3-9 21:28:12
1、中断1ms高电平1ms取反为低电平,方波一个周期=2ms,就是500HZ;  `+ ?2 z1 d5 g3 [. o
2、第二个我是猜想的,频率高了,系统频繁中断,实际上这些都是需要频繁执行执行压栈出栈指令的,因此时间都耗在这里了,所以频率高不了;解决的办法可以用定时器做50%输出的PWM波,频率肯定可以提高,但最高到多少我也没试过。
在路上11111111 回答时间:2017-3-9 21:34:37
zhao.zhao 发表于 2017-3-9 21:28
6 s% [# }0 C; |% {: x1、中断1ms高电平1ms取反为低电平,方波一个周期=2ms,就是500HZ;
5 a& |% P" p; n# v) c/ E, M2、第二个我是猜想的,频率高了,系统频 ...
3 m; J  P: ]; L
懂了,谢谢,嘿嘿
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版