搜索
查看: 1386|回复: 2

[原创] STM8-SO8-DISCO之第三个工程-AWU唤醒

[复制链接]

该用户从未签到

64

主题

909

帖子

76

蝴蝶豆

论坛元老

最后登录
2021-9-5
发表于 2019-2-27 20:12:02 | 显示全部楼层 |阅读模式
本帖最后由 zhdzhd-174422 于 2019-2-27 20:14 编辑

        AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。STM8S的LSI时钟测量在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM1_CH1来测定。

1、复制官方AWU工程文件: 1.PNG
2.PNG
2、打开IAR工程,先清除上一工程的编译信息:
3.png

3、修改main.c文件:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm8s.h"
  3. #include "main.h"


  4. /**
  5.   * @addtogroup AWU_ActiveHaltMode
  6.   * @{
  7.   */

  8. /* Private typedef -----------------------------------------------------------*/
  9. /* Private define ------------------------------------------------------------*/
  10. /* Private macro -------------------------------------------------------------*/
  11. /* Private variables ---------------------------------------------------------*/
  12. /* Global variables ----------------------------------------------------------*/
  13. bool ButtonPressed = FALSE;
  14. /* Private function prototypes -----------------------------------------------*/
  15. void Delay (uint16_t nCount);
  16. uint32_t LSIMeasurment(void);
  17. static void CLK_Config(void);
  18. void AWU_Config(void);
  19. static void GPIO_Config(void);

  20. /* Private functions ---------------------------------------------------------*/

  21. /**
  22.   * @brief Example main entry point.
  23.   * @param  None
  24.   * @retval None
  25.   */
  26. void main(void)
  27. {
  28.     uint16_t i = 0;
  29.     uint16_t j = 0;
  30.    
  31.     /* 时钟配置 -----------------------------------------*/
  32.     CLK_Config();
  33.    
  34.     /* 端口配置 ---------------------------------------*/
  35.     GPIO_Config();
  36.    
  37.     /*AWU配置 --------------------------------------------*/
  38.     AWU_Config();

  39.     /* 使能总中断 */
  40.     enableInterrupts();

  41.     while (1)
  42.     {
  43.         /* 按键扫描 */
  44.         if (ButtonPressed == TRUE)
  45.         {

  46.             ButtonPressed = FALSE;

  47.             /* LED快速闪烁 */
  48.             for (j = 0; j < 20; j++)
  49.             {
  50.                 GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);
  51.                 for (i = 0; i < 5; i++)
  52.                 {
  53.                     Delay((uint16_t)60000);
  54.                 }
  55.             }

  56.             /* LED熄灭 */
  57.             GPIO_WriteLow(LEDS_PORT,LED1_PIN);
  58.             /* 进入停机模式 */
  59.             halt();
  60.         }
  61.         else
  62.         {
  63.             /* LED慢速闪烁 */
  64.             for (i = 0; i < 15; i++)
  65.             {
  66.                 Delay((uint16_t)60000);
  67.             }
  68.             /* LED反转 */
  69.             GPIO_WriteReverse(LEDS_PORT, (GPIO_Pin_TypeDef)LED1_PIN);
  70.         }
  71.     }
  72. }

  73. /**
  74.   * @brief  Configure system clock to run at 16Mhz
  75.   * @param  None
  76.   * @retval None
  77.   */
  78. static void CLK_Config(void)
  79. {
  80.     /* Initialization of the clock */
  81.     /* 配置HSI分频率,CPU分频率1 */
  82.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  83. }

  84. /**
  85.   * @brief  Configure the AWU time base to 12s
  86.   * @param  None
  87.   * @retval None
  88.   */
  89. void AWU_Config(void)
  90. {
  91.     /* 初始化 AWU */
  92.      /* 通过LSI 校准AWU唤醒时间*/
  93.     AWU_LSICalibrationConfig(LSIMeasurment());
  94.    
  95.      /* 停机12S后唤醒 */
  96.     AWU_Init(AWU_TIMEBASE_12S);
  97. }

  98. /**
  99.   * @brief  Configure GPIO for LEDs and buttons available on the evaluation board
  100.   * @param  None
  101.   * @retval None
  102.   */
  103. static void GPIO_Config(void)
  104. {
  105.     /* 设置外部中断端口C模式为下降沿触发 */
  106.       EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  107.   
  108.     /* 初始化外部中断IO口 ,悬空输入并使能中断*/
  109.       GPIO_Init(BUTTON_PORT, (GPIO_Pin_TypeDef)(BUTTON_PIN), GPIO_MODE_IN_FL_IT);
  110.       
  111.     /* 配置LED1 IO口为输出模式 */
  112.       GPIO_Init(LEDS_PORT, (GPIO_Pin_TypeDef)(LED1_PIN), GPIO_MODE_OUT_PP_HIGH_FAST);
  113. }

  114. /**
  115.   * @brief  Measure the LSI frequency using timer IC1 and update the calibration registers.
  116.   * @note   It is recommended to use a timer clock frequency of at least 10MHz in order
  117.         *         to obtain a better in the LSI frequency measurement.
  118.         * @param  None
  119.   * @retval None
  120.   */
  121. uint32_t LSIMeasurment(void)
  122. {
  123.   
  124.   uint32_t lsi_freq_hz = 0x0;
  125.   uint32_t fmaster = 0x0;
  126.   uint16_t ICValue1 = 0x0;
  127.   uint16_t ICValue2 = 0x0;

  128.   /* 读取主时钟频率 */
  129.   fmaster = CLK_GetClockFreq();

  130.   /* 使能 LSI 测量: LSI时钟连接到TIM1_CH1 */
  131.   AWU->CSR |= AWU_CSR_MSR;

  132.   /* 每8次捕捉一次!!! */
  133.   /* 使能TIM1捕捉 */
  134.         TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);
  135.        
  136.   /* 使能 TIM1 */
  137.   TIM1_Cmd(ENABLE);
  138.   
  139.   /* 等待 CC1 捕捉 */
  140.   while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  141.   /* 读取 CCR1 值*/
  142.   ICValue1 = TIM1_GetCapture1();
  143.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  144.   
  145.   /* 等待 CC1 捕捉 */
  146.   while ((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  147.   /* 读取 CCR1 值*/
  148.   ICValue2 = TIM1_GetCapture1();
  149.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  150.   
  151.   /* 关闭CC1捕捉 */
  152.   TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E);
  153.   /* 关闭TIM1 */
  154.   TIM1_Cmd(DISABLE);

  155.   /* 计算LSI时钟频率 */
  156.   lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);
  157.   
  158.   /* 禁用LSI测量: LSI时钟从TIM1_CH1断开 */
  159.   AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);
  160.   /* 返回计算的LSI值 */
  161. return (lsi_freq_hz);
  162. }

  163. /**
  164.   * @brief Delay.
  165.   * @param nCount
  166.   * @retval None
  167.   */
  168. void Delay(uint16_t nCount)
  169. {
  170.     /* Decrement nCount value */
  171.     while (nCount != 0)
  172.     {
  173.         nCount--;
  174.     }
  175. }
复制代码

4、编译运行:


VID_20190227_195356~1.gif

回复

使用道具 举报

该用户从未签到

6

主题

1029

帖子

133

蝴蝶豆

金牌会员

最后登录
2021-4-24
发表于 2019-2-28 18:16:14 | 显示全部楼层
已收藏
回复

使用道具 举报

该用户从未签到

0

主题

65

帖子

0

蝴蝶豆

中级会员

最后登录
2020-10-10
发表于 2019-3-3 12:49:37 | 显示全部楼层

已收藏
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 14:09 , Processed in 1.158426 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表