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

基于STM32F1外部触发脉冲计数定时器实验经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:21
STM32F1定时器实验-外部触发脉冲计数8 N2 N- ~) }/ K5 O* R- {4 M5 Q$ \
之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。) N0 A* T8 ~6 Z# o5 p6 K
按照这样的思路,我们的按键读取用状态机思想去读取,使定时器6产生10ms的定时中断来实时检测按键并利用状态机设计思想处理按键信号,将PA1设置成输出引脚,设置定时器2的PA0引脚来接收信号,通过按键触发改变标志位来发送电平信号,再定义全局数存放PA0接收脉冲信号次数,最后串口配置。7 }* ~# M  c4 E; O/ {

# R" J% p7 r( U$ S说实话,状态机思想可以清晰把你的代码逻辑弄清楚,这个是我自己写按键时画的草图:* K  G8 Z/ [5 D& ~3 v' S+ K- ]& n9 ~
) z. R3 U, v7 _: {/ l6 A- d* M' m5 j
1c7af8ac65064314a19f83d273578e06.jpg
2 n4 t+ R5 Z: J0 B2 t: f
+ Q1 K; s5 q; {- H" d0 I. s
画的只要你自己可以看懂就行
* L5 {# U+ x9 z& c0 @
( D* \. o5 t4 @+ q& X( S* E% ^

# m( G: y  N+ w4 U代码讲解
5 }  M, N! Z- Y: `9 T8 \# N首先我们需要按键的状态,它的状态分为检测,按下,释放,所以定义枚举类型的结构体3 L: w; q7 U) p& C  p  G, {
  1. /* USER CODE BEGIN PTD */  I7 ^, h9 v: @" P9 j8 e
  2. typedef enum
    " C' M" G0 t1 X5 s6 R1 Y
  3. {" k; Q1 p) Z8 @( l/ v
  4.         KEY_CHECK=0,  Z  n0 Q, v8 }5 E+ U3 y% T
  5.         KEY_CONFRIM,. `4 X2 x, F) T* u4 {) X- z
  6.         KEY_RELAESE
    : y( v$ n6 T/ y' W$ }6 y1 \: ]( t
  7. }KEY_STATE;
    2 a$ z( ^# x, {& N, X' K, R
  8. /* USER CODE END PTD */
    . R( x8 J1 E6 A1 e5 |3 l, `' T7 }
复制代码

3 A. y2 p; ^2 [! o状态变量的定义以及标志位,计数值
7 x1 w  p3 y! k8 t: Y2 V: ~: U
  1. /* USER CODE BEGIN PV */
    8 ?+ e6 y. y! [0 u5 I' Y. k' A2 t
  2. KEY_STATE  keyState=KEY_CHECK;# e( L/ {, z+ K$ m7 O0 P$ L
  3. int Result=0;% m# }6 F2 B+ f* U% e
  4. uint8_t keyvalue=0;0 q2 w) E3 P( {7 `; }

  5. $ j6 a3 ~5 w+ ~' w
  6. /* USER CODE END PV */
    ( x. e1 d9 c* {8 M( p& F0 i; }2 I7 a# Y
复制代码
) Z% O! P0 R! h+ P' N
对于按键检测,是在TIM6里处理的,选用KEY1即PE39 K7 J( }- d" J; T# u( |- W* G
0 @: j- `' Q" D0 Y
c310f614ea674bd7a36bab52fe7556e9.png ( U' g" M$ _3 T+ _0 M( N! p
( m* S. ~1 {6 n. c
0d925669e44a45d591c29f341f0f0b45.png 9 k$ C4 }7 G# ^! b( Z( g
2 r' S2 L/ s6 r7 d6 ~  D
而之间的状态转移是通过判断电平实现的,按下时为低电平,未按下为高电平,根据我们按下的一个完整过程,我们可以通过switch语句实现我们的整个过程
2 s. Q" R4 L* ]' S! f
  1. /* USER CODE BEGIN 4 */. \) {  a& c4 o
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    1 A2 n& i5 H- P3 }
  3. {+ v5 E2 Q; V7 o. I' \) E
  4.         if(htim->Instance==TIM6)//判断是否为TIM6中断$ E; R* u- |; ~- Y- k  e
  5.         {- k- {6 f: G/ k) D" o7 O$ f
  6.                 switch(keyState)5 J4 i, U& v& _$ U1 ~
  7.                 {( W, ^  P- n$ a" V; M6 _5 y& h
  8.                         case KEY_CHECK://检测状态下
    : }% r* t8 ]9 {9 d& Z% Q
  9.                         {
    . l9 d2 m4 k$ [3 Y7 c5 R
  10.                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//检测按键为低电平# M" K% u1 f4 ^3 |* L
  11.                                 {: N$ B% d, K& e6 e. M
  12.                                         keyState=KEY_CONFRIM;//确认按下状态
    $ K% {3 N) }$ O
  13.                                 }9 ~* v& r6 e5 r7 t
  14.                                 break;7 ?6 `6 q- T9 M$ K  l; w8 {
  15.                         }
    % m3 J0 ~( Z: l& q8 x# m
  16.                         case KEY_CONFRIM://确认按下状态下
    : M4 q5 D6 `# r
  17.                         {
    1 O6 o: c: L$ B4 y: p: C
  18.         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//再次判断        : N$ @* v2 w! E2 I
  19.                                 {
    2 w/ c' }7 D5 l; Q! @3 y$ @
  20.               keyvalue=1;//改变标志位用于触发脉冲信号" W# ~, O6 q& @, v; L; G4 Z! Z
  21.               keyState=KEY_RELAESE;//按下后释放
    3 L: B& {. J! K  M" X0 H" I  _
  22.                                 }/ b! d% G  A" t; p* K; u6 N5 \
  23.          else               
      x/ Y$ }; P  h4 Z, l- o" l
  24.                                  {
    : L% |* m" B% D$ d/ P
  25.                                             keyState=KEY_CHECK;//排除抖动干扰或者误判,回到检测
    0 Z) }( X/ K$ q/ K2 a8 }" s
  26.                                  }
    / ^8 o. D5 f" v  y/ ]& s% C
  27.                                  break;9 A& @5 v+ v) p
  28.                          }/ K7 _2 b; t+ `( g7 n9 c
  29.                         case KEY_RELAESE://释放状态下
    / {, W( f0 A8 t& |( n% Q' Z3 [
  30.                         {$ O8 ?3 m7 T9 N2 V
  31.                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_SET)        //判断按键未按下8 u- s2 r6 `, o/ ?
  32.                                 {
    - d. ^- p0 h- P4 s6 D( U
  33.                                         keyState=KEY_CHECK;//回到检测状态
    ' B/ j  b1 w9 D! r. w  ?
  34.                                 //        keyvalue=1;' D. R% d/ |+ C; `: g
  35.                                 }+ d6 b8 u, E& U3 C$ `" z7 [! v
  36.                                 break;
    6 b  M6 i+ [- w2 Q' ^' F9 A6 X4 h3 y
  37.                         }5 C6 D0 J6 d+ S5 R& `
  38.                         default: break;
    7 o, ^2 ^# j' r6 A' v$ r  W. b
  39. }2 M  g& z( e( r) V% u* U; i
  40.                 }) ?4 U* `6 N# c9 r( k, C
  41.         }) b. w( D1 J& o1 X! [
  42. /* USER CODE END 4 */
    5 I8 [$ w/ Q9 h# J$ x
复制代码

2 g( A0 g5 {  L1 i' ?3 b' D# D' E主函数内' K2 U3 K/ [& z3 P) K
  1.   /* USER CODE BEGIN 2 */* A3 ?  S$ e0 x. y2 Z( V8 d
  2.         HAL_TIM_Base_Start(&htim2);//开启TIM2用于计数
    3 l6 w* x% V* n# ?- E
  3.         HAL_TIM_Base_Start_IT(&htim6);//开启TIM6用于按键检测, R5 c+ L. J; P  F: H
  4.         printf("Timer counter founction test: \n");//串口起始提示
    2 ^4 j3 _, P% h8 \
  5.   /* USER CODE END 2 */3 V: t$ h+ s" x1 s/ f% A
  6. ! n9 H7 @/ ?3 f  ]5 k2 l3 R
  7.   /* Infinite loop */
    / A- {' m! r! S
  8.   /* USER CODE BEGIN WHILE */
    # u9 X1 o8 I# w* I0 ], q4 I2 p7 D
  9.   while (1)
    ) g% h1 |; t- s* _$ I; Y
  10.   {
    ' `' i* T, ~* ^4 U# Z* l* ~$ m
  11.     /* USER CODE END WHILE */, ]* _6 D, N* z0 o( d) Z/ ^( O

  12. % t( W3 M/ u/ k* ]% f
  13.     /* USER CODE BEGIN 3 */
    ) t0 {% A& X: P
  14.                 if(keyvalue==1)//如果为按下状态
    9 [$ Q* ^8 z# ^7 M
  15.                 {/ y* K4 S# @3 m& q3 @
  16.                         keyvalue=0;+ [7 f' _0 m' ~. I. A' E, Z
  17.                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);* Q5 s+ ]- m% S+ X0 N
  18.                         HAL_Delay(1);
    : K2 p0 ^6 |! m
  19.                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);# b. q  N5 n+ M& n- }/ ~
  20.                         HAL_Delay(1);//发出周期为2ms的脉冲
    . `4 ~$ r; }5 s5 N+ k7 v
  21.                         Result=__HAL_TIM_GET_COUNTER(&htim2);//读取计数值
    # i( S# E6 s% C! \" T+ v
  22.                         printf("Counter:%d.\n",Result);4 B. O. C6 B/ h
  23.                 }; Z! p1 U. K+ B4 B. u; L0 k
  24.   }3 P1 V; W& o  d+ J6 J
  25.   /* USER CODE END 3 */$ l' W6 C( e7 e, e; g: }
复制代码

# E8 a0 g4 O+ N& c+ W. C3 j$ t% B! gCUBEMX配置  h+ Z( J- d  z# s- m9 E$ c
1.时钟配置外部晶振,主时钟为72MHz
/ U8 [' c: ^) h, d/ s% t8 k' d4 _
979c22c7e76f4ab78bc893bb547e198b.png
" Z; B+ z4 J' S) H& A  Y/ a+ Z) Z7 F0 w: B- |0 s
34c3cc70065643e0a83680e530b4fa1f.png ; ^6 u, x0 U1 \6 a5 E( N# h/ X
' Z) _& s4 F4 r. u8 a9 f% J
2.GPIO:选择PA1输出,PE3输入; P+ v3 L# G+ I4 ?" N3 H
: ?. B! G0 N( c3 F9 [. B
99ee5bd1a11d457b882ae5e5351cf12c.png 0 w4 x+ ^+ o0 }: \3 W% W, v5 N

, H; U3 d, o& m# `( q! E2 L3.TIM:8 z# n) t; ?/ @# I
TIM2:Clock Source:外部触发
5 |2 R$ p: ~. y# R
" R  x+ T& G5 e8 A
dff3c1e441b548fd8fce92e0c69cc35f.png
8 y# I* k( ?# I/ d+ {. N
' g+ S( ?/ e, ^. P" p
这时PA0为你的触发引脚* V! `. O0 @4 o0 r( d

/ t; C7 U4 L6 m1 o) ~' U
c4b66361f77d4f38a0683db19bedb4ce.png ' i9 r. T6 r# H! m

$ @( @! V8 b, }' {6 w/ j! w  ?TIM6:激活并生成10ms中断6 y/ o! E; f4 a$ Z6 }
! G% B, p- d3 v- z% c
6eeb551aeaaf4abda7027fe83d121b43.png 7 Z0 g! j; I6 i+ ^" G3 R# B5 L8 ^- o2 M
4 S% C& e( @4 P% s
4.usart设置4 {# e1 [( f) }5 H
* b; d: Y; W# c3 m2 @- D' f
a6749464d8264738a2744efc34c42a99.png
# [% `, w, S4 z3 l& `" w% c3 R9 W+ ~5 x: m  Z4 o" t6 E
5.Project的设置,' N1 p0 P9 s) r. M+ V  n

: }5 g) V( u: Q# X  g/ a4 K
e25a54d171e6456e9606191ea4a2796e.png / y: [3 I& L% r% T) L9 B
$ ~" b9 l6 W! v
还有一个之前没注意,就是在Code Generator一栏中第一个方框里选择第二个:Copy only the necessary library files,要不一个工程就是百八十MB,占内存。
6 a4 ~/ [' P9 t/ w7 K9 q5 ?7 z& g. g) _
a29154c1ca2a4f3587b8d571a6a4f741.png $ w4 [9 Y' H! R
/ G) }% S' f- J8 q
最后生成代码6 H2 ]$ n8 b) T' |( Q1 v5 {
————————————————
, Q7 ?! V, {% \; H$ h$ C版权声明:南山笑
2 A+ J9 c# `( N; \) v5 Q; Z如有侵权请联系删除
8 I5 U: V) ]) {5 n% j3 R( t! _! R: `) A! g

$ v' p: w4 `. h2 }) h
收藏 评论0 发布时间:2023-5-17 17:21

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版