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

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

[复制链接]
zhdzhd 发布时间:2019-2-27 20:12
本帖最后由 zhdzhd-174422 于 2019-2-27 20:14 编辑
& C: X; F: |" T4 ~( `  w0 L, F- ^+ C# W5 l- T1 v7 ^. R
        AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。STM8S的LSI时钟测量在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM1_CH1来测定。2 e! v5 W) s& T. Z# s# [

( q, }, `1 K6 }( D$ T% I1 W1、复制官方AWU工程文件: 1.PNG
+ T1 y8 S$ \) D; \! P  F 2.PNG
1 _; t6 w) I( J1 j2、打开IAR工程,先清除上一工程的编译信息:$ h3 A4 _7 W1 b# K/ I) r
3.png ' [) e1 j9 X6 a# G

  C0 n& N) V7 }3 W; G/ F3 ~8 Z2 _3、修改main.c文件:
  1. /* Includes ------------------------------------------------------------------*/
    9 m/ T6 V  W% w: o9 ^. {+ Q
  2. #include "stm8s.h"6 C/ W. Y8 d$ G5 z0 K
  3. #include "main.h"
    . o) V. z% u3 [

  4. & t  O8 s$ X% ^- p9 A

  5. & B1 j+ `% i! L5 ]8 z  r8 F/ _
  6. /**  g" b/ m- @$ o
  7.   * @addtogroup AWU_ActiveHaltMode
    4 s! K4 M; L# I! k
  8.   * @{
    8 {7 K" x  K+ V. ^
  9.   */+ s0 |. p& l- F1 ?
  10. 5 q5 s6 h! P2 b7 T
  11. /* Private typedef -----------------------------------------------------------*/
    % @: W5 @& m" T5 K& |7 _- X, ~( }2 @
  12. /* Private define ------------------------------------------------------------*/
    ! C& K) j" ~; v4 x" X. x
  13. /* Private macro -------------------------------------------------------------*/
    0 G5 ?  o5 X1 ?, }  {" v3 P
  14. /* Private variables ---------------------------------------------------------*/
    3 ]3 E) H$ _" u+ O" `
  15. /* Global variables ----------------------------------------------------------*/( y3 x6 m( g- T! |
  16. bool ButtonPressed = FALSE;
    9 ^. }7 j4 M9 ]* m$ X
  17. /* Private function prototypes -----------------------------------------------*/  u4 D5 P. I0 F9 m8 b
  18. void Delay (uint16_t nCount);
    6 I3 M. N9 [( f  }' ~$ w0 d
  19. uint32_t LSIMeasurment(void);' e& |3 K2 g$ E3 g' M0 l
  20. static void CLK_Config(void);3 A  `, W, E7 s
  21. void AWU_Config(void);9 }. d2 b* z0 b
  22. static void GPIO_Config(void);" T' ~3 F, E% ]4 H* G4 w

  23. 3 |& b2 w6 l" W6 P5 f
  24. /* Private functions ---------------------------------------------------------*/& O$ T" w( T0 ~7 z; w

  25. 1 R& Y# g) J, Q8 Z: w
  26. /**
    ; p' u$ f! h9 E' ]( U; y8 N& h) m$ a
  27.   * @brief Example main entry point./ A, P2 ]6 |  G# b7 ?3 _
  28.   * @param  None! a' a0 l  ?7 s+ t7 G. d% `
  29.   * @retval None
    + H! ?: Z5 L7 I3 A0 H' C! }2 g) H
  30.   */
    / f' k, B! V* L6 |( z$ r) h
  31. void main(void)
    , }- w* _7 u' a% F4 c; v
  32. {% l: T+ n( P1 _! p6 Q/ d! o) G4 H
  33.     uint16_t i = 0;
    6 Z1 `0 e$ I6 [$ `
  34.     uint16_t j = 0;0 z4 F& f) Z' B- ]
  35.    
    , `3 c0 z" M. a" p! S; Y0 j
  36.     /* 时钟配置 -----------------------------------------*/
    + T, `, f% g8 P
  37.     CLK_Config();
    / B3 T/ o4 K* w. T) p
  38.     6 O4 V; z, A0 C. l5 i5 @
  39.     /* 端口配置 ---------------------------------------*/4 H7 V" i6 O* r3 ^% a$ c
  40.     GPIO_Config();. E& v) J) k0 s: L
  41.    
    7 o- }0 c, d5 r4 f& ]4 ?
  42.     /*AWU配置 --------------------------------------------*/
    + o; ^  V" W6 v9 `  @8 y, c
  43.     AWU_Config();# d! U9 K' l! _5 B* a% z

  44. # T  p) b: |. p0 n" _
  45.     /* 使能总中断 */2 J2 k5 h- Z$ S/ X& r
  46.     enableInterrupts();. V/ f: h. ^8 d7 K: y. [9 N

  47. ; `# ^* J; Z* A& k
  48.     while (1); q( l! k5 q& _3 C* z- ?
  49.     {; H! l& o2 T! g  x9 |
  50.         /* 按键扫描 */6 y8 W0 |* m7 F! s/ w% ^
  51.         if (ButtonPressed == TRUE)' D5 j0 m# c+ s( R, h+ F
  52.         {
    4 f( c+ w# I  \# ~3 S+ `

  53. 8 L1 a. C# [  M$ Y/ ^4 H4 g8 w
  54.             ButtonPressed = FALSE;. X9 ?( N) m0 A: v# W* N/ |" l
  55. & g- f7 N' n+ J4 W( F
  56.             /* LED快速闪烁 */2 X0 h+ S  b$ o  E# z
  57.             for (j = 0; j < 20; j++)1 M/ k) a0 r6 d  G9 D8 R
  58.             {
    * X$ W6 v- H8 ]; N8 V
  59.                 GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);
    5 o8 f3 x" e. j. L1 j7 F3 S
  60.                 for (i = 0; i < 5; i++)
    $ U/ R' V% J. `) D( I7 o8 s* e
  61.                 {
    9 i5 X+ [  E0 H9 A, n4 h. g4 p
  62.                     Delay((uint16_t)60000);
    / H1 F: V1 f# U7 q! V0 i9 Q
  63.                 }
    % t! ], p2 N0 J
  64.             }
    . b: k3 A% s! d! R2 S/ t' ?
  65. 8 V$ x- N( F1 ^1 n, f$ D% E
  66.             /* LED熄灭 */
    0 F& @9 d8 C" S
  67.             GPIO_WriteLow(LEDS_PORT,LED1_PIN);6 i2 ~' J0 {2 c4 j
  68.             /* 进入停机模式 */: `& n) D; ~8 W
  69.             halt();# w* `  x- t) k/ H3 M9 u
  70.         }
    ( _" V; `: f# m7 b, T" X. y6 W. Z) F
  71.         else
    ( A% J9 C3 i: \( `4 [6 a- N, H
  72.         {  w# ?5 L( Q' [2 n3 b- W8 d
  73.             /* LED慢速闪烁 */
    ; T! }: ^( W( O5 D  X( P
  74.             for (i = 0; i < 15; i++)0 U* e+ u" Y) W5 F; j. E
  75.             {
    9 ]: G* i. A5 S
  76.                 Delay((uint16_t)60000);" U4 @# X; {2 W9 Z0 V- ]& w! G; Q
  77.             }
    + m4 b6 H2 E+ `8 a4 n; |  L
  78.             /* LED反转 */0 R* X1 A: V9 C) O
  79.             GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);5 v* U: o! }2 L2 r  g
  80.         }( {3 E2 e# n- j7 ^6 D
  81.     }
      Y$ ]3 }; d! G$ H; M4 e
  82. }
    4 U" w1 ]: W0 S" \: ~; {2 L

  83. . ]# H. n7 l& ^5 L! T
  84. /**
    # S, m, X/ }7 v* v. Z; J
  85.   * @brief  Configure system clock to run at 16Mhz
    : q+ g' V) |" t3 J7 A
  86.   * @param  None/ _/ ]3 C- ]; ~: K$ }
  87.   * @retval None
    % J, R' O. \- ]* f5 Z
  88.   */) \4 M, r# c2 _/ v& V& a4 z
  89. static void CLK_Config(void)
    5 G: C$ |# Y0 @  r' P& C, D
  90. {: T3 ^- w. A2 m1 F4 L; a2 _0 Q4 L1 L9 q
  91.     /* Initialization of the clock */8 z: w+ x+ X$ m( t, g  f; O: e- m
  92.     /* 配置HSI分频率,CPU分频率1 */
    , r6 Q0 p* H/ w, ^" V
  93.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    # \+ s0 S; X7 G1 J' H& f
  94. }
    ' G: k% y  b% a( ^; Y2 A1 G( W
  95. % V& A0 P( \5 V) t$ y
  96. /**- X) U( E; K3 H
  97.   * @brief  Configure the AWU time base to 12s5 h8 i8 P% n2 L: Y: R9 G
  98.   * @param  None
    , i3 Q  r; Y1 Y# x% ]' _
  99.   * @retval None
    4 r5 _7 L  M2 P1 v& P& K/ n0 ~
  100.   */
    1 M, p8 C3 s0 |  Z2 A1 ?  e( ^
  101. void AWU_Config(void)
    . J' l7 y% \1 ^
  102. {- e0 b) r2 @  k! o
  103.     /* 初始化 AWU */9 D5 }0 d! J4 {) T, J9 S( T
  104.      /* 通过LSI 校准AWU唤醒时间*/
    ' R1 u8 z4 z- W; |( H0 d3 L
  105.     AWU_LSICalibrationConfig(LSIMeasurment());8 S4 v2 b% r$ p% m4 ?
  106.     $ J/ O* N! |+ ~! @
  107.      /* 停机12S后唤醒 */
    ( Y8 a9 ^. U" T: l
  108.     AWU_Init(AWU_TIMEBASE_12S);- T0 n# M8 Y, c! M
  109. }2 p: s( h* m0 O  H* o. }4 C8 K$ s
  110. % h0 j3 V* m; ~. p
  111. /**
    : L' A1 T; Q6 l" Q
  112.   * @brief  Configure GPIO for LEDs and buttons available on the evaluation board; S* a6 F% L: |& r: J! L
  113.   * @param  None
    % s1 X  h( F) P2 X
  114.   * @retval None" R; ^" z- Y% d  {
  115.   */# j# T  v5 X- C  l3 s
  116. static void GPIO_Config(void)
    " O* Y+ i4 e. E1 N1 f
  117. {# a2 O, d5 q9 H
  118.     /* 设置外部中断端口C模式为下降沿触发 */3 L% r2 n$ {8 c( c$ \% r) d( V2 C
  119.       EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
    3 l8 [2 I) k6 b7 H
  120.   + ^8 C3 |4 v# E8 j* @
  121.     /* 初始化外部中断IO口 ,悬空输入并使能中断*/
    " W: [! b7 f9 X8 a$ {! s
  122.       GPIO_Init(BUTTON_PORT, (GPIO_Pin_TypeDef)(BUTTON_PIN), GPIO_MODE_IN_FL_IT);( ?$ T! y2 C+ Z& f  K# x; k
  123.       6 S' U* Z5 A5 T' e+ }3 K/ c
  124.     /* 配置LED1 IO口为输出模式 */
    ' W. R4 M1 o% B) x4 c+ U( v; k" U
  125.       GPIO_Init(LEDS_PORT, (GPIO_Pin_TypeDef)(LED1_PIN), GPIO_MODE_OUT_PP_HIGH_FAST);! t% N- S& r! B( t/ N3 \
  126. }3 ]; B$ ]! w2 u) ^, l
  127. % [( H/ Z$ M% P  w3 L
  128. /**( \* l# J1 V; _/ S" R* g
  129.   * @brief  Measure the LSI frequency using timer IC1 and update the calibration registers.
    & J3 J+ C. h9 s5 {' P' T, C8 l3 M
  130.   * @note   It is recommended to use a timer clock frequency of at least 10MHz in order
    2 q' X  ~6 g4 e9 p$ u' u4 ~
  131.         *         to obtain a better in the LSI frequency measurement.' U0 [+ u6 d6 r; d, @
  132.         * @param  None  c; ~1 V* D0 D' G
  133.   * @retval None' Y" o# d& k# L/ k1 h) P1 K5 ~7 z
  134.   */
      e$ |( P7 P  K2 F# X0 S
  135. uint32_t LSIMeasurment(void)8 H) F/ y" B5 i" W
  136. {3 E+ r5 S$ G; ~3 l+ p! S
  137.     W6 @/ s  N5 q9 C2 H) `3 l& k9 y
  138.   uint32_t lsi_freq_hz = 0x0;
    ' m$ U: `! }  O4 T
  139.   uint32_t fmaster = 0x0;
    8 h: z4 A. D. ]
  140.   uint16_t ICValue1 = 0x0;9 a" x" ?/ U* B( H& I) }+ K- H' ]
  141.   uint16_t ICValue2 = 0x0;  z" [6 H1 A2 m8 E0 q' }+ \' ?" F

  142. - T5 b( \( _& i5 X0 Z: z
  143.   /* 读取主时钟频率 */% o0 M( d# e4 e* |% i( G
  144.   fmaster = CLK_GetClockFreq();' y/ F0 p' F! j$ E
  145. " p% Q4 Q; [: d' z6 `; \5 O" f
  146.   /* 使能 LSI 测量: LSI时钟连接到TIM1_CH1 */, Y& N9 P9 h9 [$ l
  147.   AWU->CSR |= AWU_CSR_MSR;7 |" J3 w2 F; I+ M: w$ P5 z# Z$ H" {
  148. ( S$ o8 g; x1 Q; @5 ^
  149.   /* 每8次捕捉一次!!! */6 o" [3 M# d3 n
  150.   /* 使能TIM1捕捉 */5 O) X' G( z3 S' Q; w$ M
  151.         TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);2 ~* O5 U) G# q# D
  152.         6 d) q# x; u) H4 O/ g5 P& y: `
  153.   /* 使能 TIM1 */) m# V- p  {( P4 m7 ~% ^
  154.   TIM1_Cmd(ENABLE);
    6 G9 T+ \* n& {
  155.   
    & C# Z: ^% ~9 @' G) T; U. z
  156.   /* 等待 CC1 捕捉 */
    7 j  L) E! }8 p
  157.   while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
    ; w  j$ s. D1 L8 F$ ?
  158.   /* 读取 CCR1 值*/
    5 f8 i/ h5 I2 W1 S% p
  159.   ICValue1 = TIM1_GetCapture1();
    " F- z+ S& C: x, B& d
  160.   TIM1_ClearFlag(TIM1_FLAG_CC1);
    . @( a5 ]2 X& Y( V  o% t
  161.   % ^" C- C' Q2 P* U# ^# Q# r/ s: `! {
  162.   /* 等待 CC1 捕捉 *// b7 V, N; N6 W' B; E
  163.   while ((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
    . Y7 c% T  ~5 b
  164.   /* 读取 CCR1 值*/
      i$ K! r1 E' e) T' n
  165.   ICValue2 = TIM1_GetCapture1();: k% |1 }( |$ I
  166.   TIM1_ClearFlag(TIM1_FLAG_CC1);
    + |8 c; |1 O) c. w- B: D7 D3 I
  167.   
    8 |" l$ O5 i! l9 e) b: l7 C4 O9 N
  168.   /* 关闭CC1捕捉 */
    " l9 x: q: g' [% k( I0 o5 ?
  169.   TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E);
    + C6 k7 ?) L2 B
  170.   /* 关闭TIM1 */
    0 U  F5 B, W* U% d! ~! Q
  171.   TIM1_Cmd(DISABLE);: B, ?  L: D$ d$ b" j! L4 a( ^

  172. 9 G2 Z# N2 U9 m9 w  j- c
  173.   /* 计算LSI时钟频率 */
    3 [6 P$ m; p. F5 X) n* }, ^
  174.   lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);# g( D) ^/ `! f* B- W8 M
  175.   
    * e- k- U0 m9 A( C2 |( `0 s8 h
  176.   /* 禁用LSI测量: LSI时钟从TIM1_CH1断开 */
    ( P( v' S# D3 |) J9 M
  177.   AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);
    ) @% R& H. {- f% L$ v$ _8 T/ z# \
  178.   /* 返回计算的LSI值 */2 o" Z: B5 d* A9 F( M0 N
  179. return (lsi_freq_hz);
    4 m! @% G. O3 W9 x3 X* I* E
  180. }
    / J: {) |! l! e
  181. " H- q- V2 K) t$ b: @: m3 q
  182. /**# Q3 ]6 l. @1 `1 c  i5 _# r: k3 l
  183.   * @brief Delay.5 x' F& a+ s1 O
  184.   * @param nCount
    * |7 V7 y7 [% W6 p: C/ X5 O
  185.   * @retval None
    & p, }0 D7 s5 A; Y' A
  186.   */2 ?& Q1 K. w1 L% ~
  187. void Delay(uint16_t nCount)& y& Z) b# h1 w0 x
  188. {
    $ |" x% b) L. h7 V
  189.     /* Decrement nCount value */: Y, l, C5 x% Y8 }, {
  190.     while (nCount != 0)
    6 [# @9 D% B7 {' B7 r& j2 i- R
  191.     {/ e0 P! R+ j" D% N
  192.         nCount--;) g5 C( Y( L0 w6 H
  193.     }
    3 v0 s: a1 ?% {" J2 B' W
  194. }
复制代码

- I" @! l! V- _9 X0 n, `* `4、编译运行:5 i6 `* s4 V( R$ R" q* ], `( g' m
; @4 ~' M/ ~2 m* u0 d

$ U0 @1 J1 M# u VID_20190227_195356~1.gif
5 Y% F- K1 f. b# {% O/ R$ B
; A% W1 b+ ^  X9 @) E
赞 收藏 1 评论2 发布时间:2019-2-27 20:12

举报

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

; K8 u1 w; Z" n) e/ G' H已收藏

所属标签

相似技术帖

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