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

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

[复制链接]
zhdzhd 发布时间:2019-2-27 20:12
本帖最后由 zhdzhd-174422 于 2019-2-27 20:14 编辑 " Q$ ^- f8 A: z
; f* ^7 O3 O; a% z3 Y
        AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。STM8S的LSI时钟测量在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM1_CH1来测定。* z% V3 i! g; K7 I- Y+ R% o
; e- c3 n# i5 m2 b9 n9 L0 F- a$ B9 D
1、复制官方AWU工程文件: 1.PNG
1 ~8 y5 `! {9 E2 _& D: g- I 2.PNG
- S5 {, {- G9 L0 H2、打开IAR工程,先清除上一工程的编译信息:
" t& o6 X% C( t$ O% t% X  U 3.png / L$ i9 k7 ?( D" h7 X

) }! z( i" E8 B# a3、修改main.c文件:
  1. /* Includes ------------------------------------------------------------------*/
    9 Y* e8 R( J3 b* U& e- Q
  2. #include "stm8s.h"* x3 L' B7 n2 [6 x2 G
  3. #include "main.h"
    % j( q$ C# g8 L& ^
  4. % `7 b0 z! T& B" Y8 H

  5. 5 O- }' q' S# H. H; P2 F
  6. /**
    : P  D/ R! @! s
  7.   * @addtogroup AWU_ActiveHaltMode
    " ^2 h+ H* ~4 p% z6 r2 ?
  8.   * @{
    % ~& o8 @) E9 x8 G( E9 x8 W' F' j* Z
  9.   */
    , e: o' g/ S8 \  ^4 R

  10. 9 A5 A* {" F7 Y
  11. /* Private typedef -----------------------------------------------------------*/
    / F, R- c, [% }1 A
  12. /* Private define ------------------------------------------------------------*/
    : O3 P1 E* l/ i3 L3 k0 y. x$ b
  13. /* Private macro -------------------------------------------------------------*/: ?$ u/ l: g: R4 Q
  14. /* Private variables ---------------------------------------------------------*/: g7 }4 p1 \" \( |
  15. /* Global variables ----------------------------------------------------------*/0 J: K  Z/ P" ~! }
  16. bool ButtonPressed = FALSE;
    " `! `: a0 W# I7 A+ o0 l
  17. /* Private function prototypes -----------------------------------------------*/
    ' o/ P$ ^3 h# y+ X1 `$ _  W
  18. void Delay (uint16_t nCount);
    " l: K. p9 P& N( @% J* I5 c
  19. uint32_t LSIMeasurment(void);; i7 `$ c* V( N# D& x/ \) s0 [9 R: @
  20. static void CLK_Config(void);) B0 D9 d" i9 P
  21. void AWU_Config(void);
    ( O" X. H* t7 A2 e
  22. static void GPIO_Config(void);, L% ]! O4 c1 }+ N" a9 _
  23. 7 l7 }( e$ M" K- D3 [4 \
  24. /* Private functions ---------------------------------------------------------*/! \+ `0 r4 G; \/ R
  25. 5 I, f- d! s+ j3 H. s/ {$ W
  26. /**' W) K& E) D$ I; f* E% T
  27.   * @brief Example main entry point.
    ; ?+ M  \. h- `6 y. N. ]5 z
  28.   * @param  None" g" e; R6 z, k+ y* F8 P
  29.   * @retval None% H. n9 g) h3 w+ H7 j+ m! u# |
  30.   */
    , X, E6 X) t, s" N- p
  31. void main(void)
    & u- C0 a" h) ^: v
  32. {
    , Q9 ]+ }6 c$ k
  33.     uint16_t i = 0;1 }) L  j* P1 g) g* e. J/ u% s
  34.     uint16_t j = 0;
    9 Q, Z- g9 Z4 ~$ i) Y9 y
  35.    9 F3 i. S& a9 |. {; k
  36.     /* 时钟配置 -----------------------------------------*/' F* F' d5 _. a' a& U6 l
  37.     CLK_Config();% }9 l* t& }0 U0 e5 `9 Z
  38.    
      y9 j# N; H1 T! f7 @
  39.     /* 端口配置 ---------------------------------------*/
    - Q2 Z$ T7 X& ], u) b2 |/ a2 K3 ~
  40.     GPIO_Config();
    4 G6 Z: u' j! R& U2 R
  41.    
    ( U5 A( t8 |; c! B6 M4 F9 y
  42.     /*AWU配置 --------------------------------------------*/
    1 g" h% A/ j8 k- C% ^# Z
  43.     AWU_Config();
    ) i8 Z& r5 D4 B* o) ]7 ]
  44. 1 O: f4 C, ~; D
  45.     /* 使能总中断 */8 H  k/ J. D" Z7 n  d
  46.     enableInterrupts();
    6 \7 W4 L- f! g9 e

  47. * x" \! T" F4 m
  48.     while (1)
    5 B7 q1 y' F, _0 l( P  T! q
  49.     {
    9 G8 }/ @& x- T% y5 q% ^
  50.         /* 按键扫描 */
    # _+ G5 i6 ^8 \' F& X5 ?
  51.         if (ButtonPressed == TRUE)7 h" B! F: c1 z4 R
  52.         {6 Z! c$ f! i# S
  53. % d) a! C3 T9 V$ ~' j; f
  54.             ButtonPressed = FALSE;: H+ f* ?4 W3 @$ d

  55. ' n; f  w9 x( K& n
  56.             /* LED快速闪烁 */
    : n) U! L7 d) I+ v: [7 O
  57.             for (j = 0; j < 20; j++)9 {- k# Y1 U. ]- q6 _
  58.             {
    ' }/ c& Y; W! \
  59.                 GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);3 ~9 F9 j" k2 m$ g7 o& O
  60.                 for (i = 0; i < 5; i++)
    ; {7 }, v: V  [( v, X/ k' H
  61.                 {( B; I: V; Q' y
  62.                     Delay((uint16_t)60000);( n6 V# K/ d# ^2 p
  63.                 }, @1 @$ ]9 i) l# L
  64.             }: C. R$ t6 o9 E% I

  65. 2 c% t) r& B) e$ {: T
  66.             /* LED熄灭 */
    ( \' o8 I. d( e" s! ^/ l
  67.             GPIO_WriteLow(LEDS_PORT,LED1_PIN);; J; U: a3 H& I, r5 o& S, d0 ]
  68.             /* 进入停机模式 */! }$ t* Y6 V' W/ X& m  [+ u6 x
  69.             halt();
    ( w( S! M# r- w8 j7 K" {( D; R4 h
  70.         }) k4 N& b( D/ B8 l
  71.         else
    : I/ t3 w2 }/ \; x0 K0 o
  72.         {
    * k( X6 O% A- V2 q. @  E' l
  73.             /* LED慢速闪烁 */3 S! `9 w: e( d6 l
  74.             for (i = 0; i < 15; i++)% Y7 N" X( e  R1 \
  75.             {
    & V( w. }4 F1 S& ^# G) [& T( t
  76.                 Delay((uint16_t)60000);
    " W" N8 L3 M3 S' v$ j$ ^
  77.             }
    1 U; s+ ?0 @/ V7 X) t
  78.             /* LED反转 */+ `. t1 Q% p1 \8 L: F) a, N7 @5 x
  79.             GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);
    0 E$ ^0 ?& q5 i3 X9 K, W
  80.         }  n  `" O3 h3 e0 B0 L2 s" `" L
  81.     }2 X+ D, R; H' p& k
  82. }
    0 Y0 U# S& u8 [2 d2 ]

  83. 1 d: M1 F9 R3 |7 h# Y
  84. /**
    / E. a1 z2 F( i' h
  85.   * @brief  Configure system clock to run at 16Mhz7 ~1 x5 Z4 W. ~5 V8 y
  86.   * @param  None
    7 o5 F6 d# H* e, v$ @* {* ~
  87.   * @retval None* L7 L7 ^  r( i2 [( x5 U
  88.   */- Z, ^7 ], ?( F
  89. static void CLK_Config(void)
    ) ^0 |) e) U( A/ r
  90. {
    8 b/ x  M1 j, t& ^) M
  91.     /* Initialization of the clock */- F! h% j1 t( t  `6 i) ^5 U
  92.     /* 配置HSI分频率,CPU分频率1 */6 O$ o2 Z) m6 D7 h! }( W: w
  93.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    % Z+ A9 u0 x6 s1 m# Z: s6 F3 k9 H
  94. }
    0 i3 J0 }  k0 t9 u( I

  95. 1 c  b' t" r6 ?4 Y/ o1 x
  96. /**
    6 }& [# n) ^% r, c! M- Y+ ], ]/ A8 \
  97.   * @brief  Configure the AWU time base to 12s5 ^* a$ A- h. U
  98.   * @param  None- l2 F9 i3 q' g. j/ U/ |
  99.   * @retval None! J8 x* d: c7 U, I& w
  100.   */5 S: M3 N+ ?( S4 t
  101. void AWU_Config(void)
      h$ J) s: v8 S- X3 m+ b7 l+ e
  102. {
    7 u5 Q- f1 C1 G% Y- B9 g
  103.     /* 初始化 AWU */
      Q+ K, r2 O/ ?- ]* l9 D( _3 b3 p- ^
  104.      /* 通过LSI 校准AWU唤醒时间*/
    4 L8 H3 {, E6 @7 G/ s0 B* G' e$ C5 n
  105.     AWU_LSICalibrationConfig(LSIMeasurment());
    + `& w1 M1 A6 W* c! e
  106.     . o; i4 T; n2 G7 j% |
  107.      /* 停机12S后唤醒 */- V1 A$ H9 [& w, k6 H/ c+ h
  108.     AWU_Init(AWU_TIMEBASE_12S);8 u' z) \! U" _% a3 w
  109. }- V3 H, x$ v$ k1 i' I- [

  110. 8 ?; z0 Q, `5 G8 \
  111. /**& [* _% Z& M: X' a# |7 y7 F
  112.   * @brief  Configure GPIO for LEDs and buttons available on the evaluation board7 @7 J3 E$ r: e0 o  G2 g
  113.   * @param  None
    5 h6 A# |4 m( s$ ?+ C5 h* |+ ~! o
  114.   * @retval None# J7 R# z5 d* r2 ]
  115.   */
    4 G3 c4 d9 E. ?$ A  q$ a% k* c+ b+ J
  116. static void GPIO_Config(void)+ i1 A, W6 P$ X* ^/ V6 K6 G
  117. {
    , c1 |' W  X) [7 v2 y) S5 ?
  118.     /* 设置外部中断端口C模式为下降沿触发 */
    * {9 d4 i# ]! a, i8 G. _- p
  119.       EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);0 o( E2 i& K' m6 V
  120.     i2 Y! X8 ]# T2 g
  121.     /* 初始化外部中断IO口 ,悬空输入并使能中断*/$ d0 {! R2 i" ]7 _$ |
  122.       GPIO_Init(BUTTON_PORT, (GPIO_Pin_TypeDef)(BUTTON_PIN), GPIO_MODE_IN_FL_IT);
    9 p  W4 g8 Q3 _7 `5 N' w
  123.       , z, E6 T# M0 V, ~3 x4 D
  124.     /* 配置LED1 IO口为输出模式 */
    " r8 s8 S# \2 v- x+ S
  125.       GPIO_Init(LEDS_PORT, (GPIO_Pin_TypeDef)(LED1_PIN), GPIO_MODE_OUT_PP_HIGH_FAST);
    9 J0 P7 U5 V1 \1 n9 V
  126. }8 I- h- t! e, r3 Y5 I" r

  127. - [, @' E. A: c9 k- o5 Z6 I
  128. /**
    0 q; T2 P) b" |% U% Y2 R
  129.   * @brief  Measure the LSI frequency using timer IC1 and update the calibration registers.% c6 P& d2 t9 y) P& d0 f9 Z( a
  130.   * @note   It is recommended to use a timer clock frequency of at least 10MHz in order * S; h: A) w4 u( @
  131.         *         to obtain a better in the LSI frequency measurement., x* \9 y, ]  q
  132.         * @param  None
    $ |  E3 b: V0 A( L3 ?; d' s; y
  133.   * @retval None
    ! U" k1 b" e( \) K
  134.   */  w" I' E* Q5 |: f
  135. uint32_t LSIMeasurment(void)6 e; H" h7 C5 g+ C( t
  136. {
    2 j; ^3 a2 H, w0 C% q
  137.   # L, F9 d! S0 K0 C. G
  138.   uint32_t lsi_freq_hz = 0x0;3 y5 }/ A- t% X0 d9 C* I
  139.   uint32_t fmaster = 0x0;, @/ B9 n2 u/ y5 z; ]" x* F
  140.   uint16_t ICValue1 = 0x0;
    ; q/ {$ {5 d9 r7 C
  141.   uint16_t ICValue2 = 0x0;
    1 B- d% Z6 ^6 ~1 T0 J9 @4 W1 T6 w

  142. - ^7 _. o* n; d' Z& j: w; Y! j0 N
  143.   /* 读取主时钟频率 */
    $ i" d. {6 o: ?  ^' E
  144.   fmaster = CLK_GetClockFreq();
    4 k2 ?9 |8 ]5 l; ?: @+ s

  145. % r# Z/ T) x3 A
  146.   /* 使能 LSI 测量: LSI时钟连接到TIM1_CH1 */
    2 D2 n' x  f  D  s6 o6 y4 ?
  147.   AWU->CSR |= AWU_CSR_MSR;( G/ x0 o# s# a' e4 q/ _5 P( H

  148. 5 t  l3 `" @; d3 G' l
  149.   /* 每8次捕捉一次!!! */
    2 D/ f1 F: _! Z  P% _3 o
  150.   /* 使能TIM1捕捉 */+ @2 D& g8 I- n3 a- h3 C
  151.         TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);% _$ \$ h! l; E/ o9 N
  152.         4 k4 K- Y3 }0 `) I4 R" w
  153.   /* 使能 TIM1 */
    - s+ D6 u& v; U) S- {$ k# d
  154.   TIM1_Cmd(ENABLE);& v' n7 a1 q2 x  i
  155.   ) l' j  }4 G, }2 ?" z
  156.   /* 等待 CC1 捕捉 */0 q1 }( m2 d( X  k" G5 I
  157.   while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
    * O/ m4 y6 `* X2 V
  158.   /* 读取 CCR1 值*/" Q8 p# S( u, G. u8 `- `5 ^* D( E: E
  159.   ICValue1 = TIM1_GetCapture1();/ N6 y% x' P8 E& K* S' R
  160.   TIM1_ClearFlag(TIM1_FLAG_CC1);/ c# C5 I7 w- L/ S, s
  161.   
    # y$ `/ T& P3 F/ W. z4 K6 F
  162.   /* 等待 CC1 捕捉 *// o* D% f8 U; N3 D$ q
  163.   while ((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);9 N( B3 P: D" c) v4 d( l
  164.   /* 读取 CCR1 值*/8 q& Z3 f6 c6 z* y0 @) z
  165.   ICValue2 = TIM1_GetCapture1();# F: `8 Z% T: l( T0 h5 i$ z
  166.   TIM1_ClearFlag(TIM1_FLAG_CC1);
    : I: ?0 `( t, i5 o5 b+ S
  167.   8 s! V4 S% c6 _- {7 E
  168.   /* 关闭CC1捕捉 */( B" B( ~2 r, t! r/ f* |# x
  169.   TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E);
    ( ~) O9 H0 |3 [% H6 O. f
  170.   /* 关闭TIM1 */( m( c+ g, w% c% ~+ T
  171.   TIM1_Cmd(DISABLE);! T1 r* p3 A) f. g0 r

  172.   W1 e# q8 }# M1 G- b2 y* V: _
  173.   /* 计算LSI时钟频率 */$ h9 n/ c1 O$ I1 A/ k
  174.   lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);5 E+ M. ?( j/ g, j- e
  175.   
      a3 Y- ]( w1 k$ O* {/ L2 U
  176.   /* 禁用LSI测量: LSI时钟从TIM1_CH1断开 */. e0 m5 b; R5 ]2 E/ L# m" u) X( p
  177.   AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);6 d: s% F  z  ~1 V( V7 K
  178.   /* 返回计算的LSI值 *// S. C4 L' S/ C) w/ i0 h' C& L* x
  179. return (lsi_freq_hz);
    / f5 l3 |& R* E* ^: i
  180. }4 X' H1 M8 f% R% Q4 C3 [3 _

  181. + `2 w2 D: i: f6 d4 v5 Y
  182. /*** q  |+ v! v* f3 F3 E
  183.   * @brief Delay.
    3 f9 ^. H* t1 a6 `2 v" _# N
  184.   * @param nCount
    3 X$ q' {5 p3 A3 g. C- A* G
  185.   * @retval None; t6 l4 m0 o; V' t. V6 n: N
  186.   */) f, w7 u( P0 y
  187. void Delay(uint16_t nCount)
    / O. `3 r% v2 Q4 ~
  188. {
    * {3 M& N; x/ O
  189.     /* Decrement nCount value */" u% |+ F/ c7 \& W! ~
  190.     while (nCount != 0)
    ; ~2 w' H) k7 z9 l: M
  191.     {
    3 e" i1 B) S! |# P6 Z
  192.         nCount--;
    + U* W0 x9 ~/ x2 t2 g  |
  193.     }: J& {; F. T: j% {5 a2 ^
  194. }
复制代码
3 }8 X. Y" P8 P+ u; E
4、编译运行:
* z9 W; j( `5 _: x( B. ?) A0 F
$ }9 {( Y! l/ i
- t& ~# a7 H$ c, b# P
VID_20190227_195356~1.gif
  N! F3 d# M3 {! j* a" y; R0 j2 [9 I+ M) Q! a. {/ a
收藏 1 评论2 发布时间:2019-2-27 20:12

举报

2个回答
Kevin_G 回答时间:2019-2-28 18:16:14
已收藏
zhongya618 回答时间:2019-3-3 12:49:37
# a$ Q9 r, |# j0 }7 `. P. J
已收藏
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版