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

STM8-SO8-DISCO之第三个工程-AWU唤醒

[复制链接]
zhdzhd 发布时间:2019-2-27 20:12
本帖最后由 zhdzhd-174422 于 2019-2-27 20:14 编辑 : R% k+ }4 t: t: Y$ y0 D+ g/ L
5 Q# y$ Z* L4 M8 S) \7 ^5 b3 Z
        AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。STM8S的LSI时钟测量在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM1_CH1来测定。
4 M5 w6 X: Y5 E
- F% Z. N+ K( a; f! X+ L& p1、复制官方AWU工程文件: 1.PNG 0 e9 x8 f( B6 M* i5 b
2.PNG   j+ f7 V6 H2 b/ [- S2 ?" G) l9 b5 l7 A
2、打开IAR工程,先清除上一工程的编译信息:
" R  F( ?3 d0 N9 D/ e' D0 ^ 3.png & c+ [0 y+ K4 \1 K

2 z3 Y3 I7 U& t: v2 s. A8 k2 H3、修改main.c文件:
  1. /* Includes ------------------------------------------------------------------*/
    % Y8 C. }6 f/ W/ b4 P! q
  2. #include "stm8s.h"  \9 g  v- e8 B1 r) X- i3 ]
  3. #include "main.h": U4 a4 R) A$ q3 \# R+ v

  4. " F) |, N9 Q* `+ B  T
  5. 4 D9 u7 i. I% }: v7 L
  6. /**
    # I% V+ @6 j6 o& h9 X
  7.   * @addtogroup AWU_ActiveHaltMode
    ; g, U  g  d$ A- r7 C8 [
  8.   * @{8 U6 ?7 {. g! R9 K" Y) \3 f
  9.   */
    ! l  i, s/ A( b7 U8 N9 [
  10. : G7 S4 }5 W' O  G
  11. /* Private typedef -----------------------------------------------------------*/
    7 F- R; j7 P3 T  [
  12. /* Private define ------------------------------------------------------------*/7 @4 d7 B$ {1 i4 K6 H
  13. /* Private macro -------------------------------------------------------------*/
    3 X( t- B; x; Y! V' w- ^& b2 e/ A% C
  14. /* Private variables ---------------------------------------------------------*/- A  D  x) a) z9 f( b5 p
  15. /* Global variables ----------------------------------------------------------*/: h! Q" ?/ |- m
  16. bool ButtonPressed = FALSE;
    ; Z+ G0 C/ W+ [1 A7 s6 ?, P/ g4 r
  17. /* Private function prototypes -----------------------------------------------*/4 H7 B. T+ W* C9 P# R1 s4 L
  18. void Delay (uint16_t nCount);8 m+ n' o# R, g( ~0 c+ ]2 B" |
  19. uint32_t LSIMeasurment(void);
    0 K) K# V' c5 B: L1 {" w5 D5 j
  20. static void CLK_Config(void);
    1 m! i' k- ?4 c9 }+ U+ m
  21. void AWU_Config(void);
    + F" J) @# a. y
  22. static void GPIO_Config(void);
    # n0 G4 B6 `8 |6 w

  23. ' q8 P) x& a4 z( b) a7 y1 Q
  24. /* Private functions ---------------------------------------------------------*/
    + |7 Y  i7 o6 J# c) D
  25. % F" ^2 F/ G- Q$ C+ w; V+ I# C
  26. /**
    8 l4 Z# a) `$ G: R4 j- I
  27.   * @brief Example main entry point.  J3 Z" [( U& `1 Q. ^- _2 T5 M
  28.   * @param  None* o3 U% G0 K* J5 v6 q* j: i
  29.   * @retval None
    " x' a: X$ |1 S# Q0 g; J
  30.   */2 G; _+ t$ {# f1 O) ~2 @& C. m. {
  31. void main(void)
    / b5 H5 |# C% u* g* e( w0 Z
  32. {
    * j3 G  J- L: p5 D- F* h7 r4 h" c
  33.     uint16_t i = 0;
    , _1 x& u4 v5 M( p8 P! `. @
  34.     uint16_t j = 0;
      m0 R' M/ y0 S' [3 E: v' I+ h! e
  35.    ! K' E1 k. D- \% j4 b  E+ Q; J
  36.     /* 时钟配置 -----------------------------------------*/
    " V+ X) O% ?% m5 h0 c: Y
  37.     CLK_Config();
    ; e! `7 n9 K' [8 g4 i
  38.    
    9 V  t0 E! Q' b! v
  39.     /* 端口配置 ---------------------------------------*/$ t# v% Q2 s" C6 N6 c( c
  40.     GPIO_Config();
    ( E( }, F( ?& I: \
  41.    
    + r6 C/ |+ k; J. n# h" m2 Q+ Y
  42.     /*AWU配置 --------------------------------------------*/& O0 ^1 X1 B- m$ r0 K/ H
  43.     AWU_Config();7 |0 Q! w/ ~: ]$ H

  44. + B, L) V1 r2 G: D
  45.     /* 使能总中断 */
    ! _9 D% k# n5 W1 O
  46.     enableInterrupts();# [9 ?  t: X) A! B, d
  47. 3 B- ~. I& @8 c- a% D  ?' i
  48.     while (1)+ v9 F3 h+ T9 k. G. p
  49.     {& R1 }4 l8 |% [7 ]& \* [3 B$ w
  50.         /* 按键扫描 */; z( U2 C; K. _9 n
  51.         if (ButtonPressed == TRUE)* v' @# ?" ^$ |
  52.         {
    2 k' t8 j& ]6 T' y6 A

  53. + V7 ?6 t+ m, E* U, f  _/ A7 d
  54.             ButtonPressed = FALSE;
    8 W/ v# |$ F3 Y$ j* L* q. _
  55. 0 c6 ~/ D# E# M4 h( U" T
  56.             /* LED快速闪烁 */
    3 C: _, U1 O) V: D
  57.             for (j = 0; j < 20; j++)
      p: t" w$ g5 n- L; R/ x
  58.             {
    5 ^) c4 [1 \, R2 |$ u' ^, J
  59.                 GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);1 {; N# O+ D2 q7 X1 d% m
  60.                 for (i = 0; i < 5; i++)
    # C$ p! ?- ]* r' t5 A, @8 t$ F! f- T
  61.                 {
    $ f% ?7 [4 A6 {, O# w8 d  b
  62.                     Delay((uint16_t)60000);
    " I! m  s& o( P) r+ @/ J
  63.                 }. o! q2 \; Y4 ]& y: C
  64.             }
    0 x/ z$ W, K" i9 f$ K

  65. ) R7 j6 t6 R/ M7 B8 k& a4 d$ ~
  66.             /* LED熄灭 */. |2 n1 G3 T$ J, o9 C' V1 i
  67.             GPIO_WriteLow(LEDS_PORT,LED1_PIN);
    ( E8 {' [  ^0 F7 D4 B
  68.             /* 进入停机模式 */
    6 D% y8 O- ~  e
  69.             halt();
    + I9 |; Y: w& Q3 o1 Q
  70.         }! ?* o7 [" t2 |. N: j
  71.         else# Z1 R, Z$ Q! m4 X
  72.         {( ]; ]+ K8 g* R7 M" M0 p4 c& m
  73.             /* LED慢速闪烁 */
    # H- `- X" h6 R- q' b4 |
  74.             for (i = 0; i < 15; i++)- x! R4 U' p! q+ _5 o& W
  75.             {
    1 J; f" I- F  R# V
  76.                 Delay((uint16_t)60000);
    5 w- \& F! @; U8 {4 Z# Q- q( n
  77.             }5 E  ]+ r6 X( Q4 e% H% i! j8 b! u
  78.             /* LED反转 */
    " q/ @: E2 ^8 s$ H* G+ a
  79.             GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);8 H% \* ?: c% m1 |4 A! R6 t; \
  80.         }$ T: n  S' O6 v" q5 p4 f$ ^% m
  81.     }
    * Z( S* w$ M* x8 y3 e$ C6 D
  82. }) \. @! U6 l0 }/ j3 v- D
  83. 0 o* l, j0 c, k7 E/ ~3 i, s9 ^- }
  84. /**
    , g/ A4 r; c5 u. ^, A$ U0 n1 P0 d
  85.   * @brief  Configure system clock to run at 16Mhz2 l" D" @: B# y6 r2 @# D- B4 W
  86.   * @param  None
    9 s. \. l* @7 ?9 J8 W; X+ P
  87.   * @retval None! V% }5 Z/ `8 K5 c1 c) X0 a9 w! {
  88.   */
    - Z5 A7 o$ l; \" L9 g
  89. static void CLK_Config(void)
    0 D0 j6 p  A" q/ K# _" O
  90. {/ F! s+ d2 W( U6 |; L9 W
  91.     /* Initialization of the clock */
    / `9 V$ z9 S1 M
  92.     /* 配置HSI分频率,CPU分频率1 */! ]& N. ]3 Y; k! l. ?1 X7 S) v* Q
  93.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);8 X7 g3 K) r: ]
  94. }( M: a$ W/ c1 t$ K1 t7 C
  95. % t1 Y  A6 m, u( Z1 s7 \1 {5 s
  96. /**
    3 ~- y+ p" P6 V: ?9 H8 g
  97.   * @brief  Configure the AWU time base to 12s- v1 x6 n2 h. A# |( R5 P
  98.   * @param  None8 T' [: F" g, I
  99.   * @retval None
    , I$ z5 Z7 C! a$ `
  100.   */
    . k. t. T) f+ |4 l6 Q
  101. void AWU_Config(void)$ y; S* I6 g1 n
  102. {
    % O) V8 I' c% Q7 G6 ]  o4 T
  103.     /* 初始化 AWU */) {: Z" ~2 c; s8 I1 i* _
  104.      /* 通过LSI 校准AWU唤醒时间*/9 U5 ~, b# E) i& E/ t& W
  105.     AWU_LSICalibrationConfig(LSIMeasurment());% Z$ A( R7 }' ]  w2 u& p7 C$ U
  106.     ( W9 L3 P4 Y% Q. {( ?5 h
  107.      /* 停机12S后唤醒 */  G2 W/ [6 L/ C) d* R. C
  108.     AWU_Init(AWU_TIMEBASE_12S);  W8 ]5 r1 B% H5 r
  109. }: C. e; G; A, J1 H
  110. + {, [0 d/ z0 X& I
  111. /**- ?1 W& S: _/ Y
  112.   * @brief  Configure GPIO for LEDs and buttons available on the evaluation board0 u: }5 q6 ?( Y+ z: a2 W0 b
  113.   * @param  None$ O+ L% K3 V+ S3 a2 n
  114.   * @retval None
    2 o: n3 V$ n9 \8 C* U/ S
  115.   */
    0 d) _2 Y& `- a1 `# J/ @/ z
  116. static void GPIO_Config(void)" L* {) b. ?4 z
  117. {
    # b' ~5 K7 p* [! Z  M, D
  118.     /* 设置外部中断端口C模式为下降沿触发 */
    - J9 D& {. X1 d3 A. Z# f% W
  119.       EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
    ' j- i! j8 G# T: b- N% A: Q
  120.   
    8 J! l% H8 N+ f7 s! e1 u
  121.     /* 初始化外部中断IO口 ,悬空输入并使能中断*/2 q& t" {1 a- h2 }; w0 K
  122.       GPIO_Init(BUTTON_PORT, (GPIO_Pin_TypeDef)(BUTTON_PIN), GPIO_MODE_IN_FL_IT);
    % k- ]1 u9 p( M8 s9 j
  123.       ) |* d4 ^5 q% T4 Z" z- `
  124.     /* 配置LED1 IO口为输出模式 */
    # n( Z& Q! Z# h7 n
  125.       GPIO_Init(LEDS_PORT, (GPIO_Pin_TypeDef)(LED1_PIN), GPIO_MODE_OUT_PP_HIGH_FAST);
    - [6 I* a+ S: t9 }, S7 J% u  k. |
  126. }. r8 D' v; ?, p8 Q  P. V% R
  127. 4 @% ?  `* w* y+ N5 e
  128. /**$ g# P( i, s* @8 ?1 t; @
  129.   * @brief  Measure the LSI frequency using timer IC1 and update the calibration registers.
    * ]/ D* {) Z# m. ~) I$ y" V$ T
  130.   * @note   It is recommended to use a timer clock frequency of at least 10MHz in order ' q. k2 O! M+ d0 a0 l. g' L
  131.         *         to obtain a better in the LSI frequency measurement.8 }) W7 r& F2 a
  132.         * @param  None
    5 e& l2 C- W4 [
  133.   * @retval None$ D- L' [5 R; L0 a; J: t
  134.   */
      H# \) d6 ?: O% R9 E# ]
  135. uint32_t LSIMeasurment(void)
    6 c) W& x" e" O: {) g& H4 s/ Y5 \
  136. {) ^4 z# Y4 P% w6 A% w" f
  137.   : w! x1 M5 j6 E- p: Z: Y, P7 v
  138.   uint32_t lsi_freq_hz = 0x0;
    : D1 P/ I+ ]' `$ S
  139.   uint32_t fmaster = 0x0;- T5 m: s4 G/ i$ l5 C0 f
  140.   uint16_t ICValue1 = 0x0;
    0 m) X0 ?* k8 W
  141.   uint16_t ICValue2 = 0x0;
    / p. a0 G3 l! P* ?* w
  142. * P' ~. q0 v. {; _/ ~7 S
  143.   /* 读取主时钟频率 */
    / h5 g4 d: ^8 W  l' f' H3 T& U* l. C
  144.   fmaster = CLK_GetClockFreq();
    # q  j; B& ~" B) a& y" c6 P/ Q+ F% M0 x2 b: \
  145. 2 F$ c( D% p. l3 |0 Z' C1 u- o2 {
  146.   /* 使能 LSI 测量: LSI时钟连接到TIM1_CH1 */
    8 k8 h, \4 r0 ^, P/ h1 I6 J
  147.   AWU->CSR |= AWU_CSR_MSR;' Y0 V- A  v( |/ ^+ w6 z. J0 z
  148. 0 D1 _' F# k% h: Q% Q. R& q1 H
  149.   /* 每8次捕捉一次!!! */
    9 o, N6 m5 B7 v# p7 Y9 q
  150.   /* 使能TIM1捕捉 */
    4 ?0 i( d  p* Z4 ]
  151.         TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);2 j# W5 _2 ~- @% m* o3 A
  152.        
    ! {" k6 D/ j. g7 ]9 @+ o$ ?* s
  153.   /* 使能 TIM1 */
    ; g4 O' M; U! ]9 L& J# B5 Y) W
  154.   TIM1_Cmd(ENABLE);
    0 r% z+ p/ @: {% v& E/ v# l( K
  155.   
    3 H6 ~' z  j  Q( p8 ?1 k8 R; @! v
  156.   /* 等待 CC1 捕捉 *// n8 r$ x: D& o7 {' u! {
  157.   while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);4 c1 v3 q; w/ K$ `1 s# l
  158.   /* 读取 CCR1 值*/
    . w. q% }0 d) G
  159.   ICValue1 = TIM1_GetCapture1();
    9 C0 |6 g( x; Z0 J, A2 m6 g- u" H0 r
  160.   TIM1_ClearFlag(TIM1_FLAG_CC1);
    ) O' q+ w5 t, C1 |4 Q) }$ q
  161.   
    2 N, O* Y+ H2 d7 K
  162.   /* 等待 CC1 捕捉 */
    % e* V! D7 ^- O, [' n  M4 a
  163.   while ((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
    * M% u& r" T) T/ e" |
  164.   /* 读取 CCR1 值*/. e/ v$ H3 X; o1 Z4 n
  165.   ICValue2 = TIM1_GetCapture1();0 X# }5 ]; |( A. }' O/ L/ O
  166.   TIM1_ClearFlag(TIM1_FLAG_CC1);
    ; ~* N. Y' H  y+ C- L/ b$ s7 f
  167.   , K( \) A7 ], j
  168.   /* 关闭CC1捕捉 */
    ( a. n/ D3 k- {' o% {0 P
  169.   TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E);  B- h: D- i- g1 N# F4 z- F
  170.   /* 关闭TIM1 */% v  k/ A( M) S* h; A* c$ `
  171.   TIM1_Cmd(DISABLE);3 Z3 f  A/ w: x
  172. / o" c3 [' @) z  ?! o, y9 E% E
  173.   /* 计算LSI时钟频率 */
    4 s6 c1 G9 L, f
  174.   lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);$ l: f* X: w- p
  175.   - c" u: N4 ?2 V
  176.   /* 禁用LSI测量: LSI时钟从TIM1_CH1断开 */1 @" U! b: R0 ~5 l* m4 t
  177.   AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);3 U; i) q& {4 t# ^( n: O
  178.   /* 返回计算的LSI值 */% h2 Y5 C& Q0 t$ T
  179. return (lsi_freq_hz);7 y* P; `9 C: @8 k5 h5 U
  180. }* O" d2 D) K; e0 @

  181.   g) a7 a$ _1 h" c/ u" Q* Z$ E
  182. /**& T; i0 c+ A! A4 O5 ^) _1 i) p
  183.   * @brief Delay.
    - }- Y0 j( n! a. T+ O
  184.   * @param nCount! [' T0 G+ h9 N% O9 T$ i
  185.   * @retval None
    - _; R% W3 t. ?& l( K0 _
  186.   */9 I- e' B  }$ I: k8 M
  187. void Delay(uint16_t nCount)
    ; f4 w, K, I$ [' y  P
  188. {1 U' B3 Z; x5 Y% l4 b
  189.     /* Decrement nCount value */
    4 F% E. a. ?: K6 p
  190.     while (nCount != 0)! ?" T' f! ]2 j1 s; Q
  191.     {
    % E9 @! X1 j0 H2 `' q
  192.         nCount--;
    : a  Z0 H0 i0 K/ q, t" }
  193.     }
    1 T* g" g  L# P5 K
  194. }
复制代码
2 e, l5 E& w4 S! ~
4、编译运行:
( ]' l! I$ ?; Q
# v9 a& B/ K' K3 |* y" N
' D7 l' f$ Z6 R3 a! f* B
VID_20190227_195356~1.gif 2 [3 S! s4 S+ l& A

" i9 S) E- l. B
收藏 1 评论2 发布时间:2019-2-27 20:12

举报

2个回答
Kevin_G 回答时间:2019-2-28 18:16:14
已收藏
zhongya618 回答时间:2019-3-3 12:49:37

& L) ~; r2 w& N8 x) a" i! J已收藏
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版