OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4969|回复: 7

stm32f103zet6 RTC能从待机模式唤醒 不能从停止模式唤醒

[复制链接]

4

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-23
在线时间
11 小时
发表于 2019-1-14 17:10:57 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 三石田叶子青青 于 2019-1-14 17:12 编辑

stm32f103zet6 RTC能从待机模式唤醒 不能从停止模式唤醒?
代码:

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  RtcClock_Config();
  MY_RTC_Init();
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  RTC_Alarm_Set(2019,1,14,16,55,00);
  RTC_Alarm_IT_Enable(&hrtc);

  printf("Start!\r\n");

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_Delay(500);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //灭
    HAL_Delay(500);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //亮
    HAL_Delay(500);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //灭
    HAL_Delay(500);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //亮
    HAL_Delay(500);

    //SleepMode();
    StopMode_IT();
    //StandbyMode();

    RTC_Alarm_IT_Enable(&hrtc);

    /* 检测系统是否是从待机模式启动的 */
    if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
    {
      printf("待机唤醒复位\r\n");
      /* 清除待机标志位 */
      __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
    }
    else
    {
      printf("系统是上电启动\r\n");
    }

    RTC_Get();
    printf("%2d年%2d月%2d日 ------ ", calendar.w_year, calendar.w_month, calendar.w_date);
    printf("%2d点%2d分%2d秒 ------ ", calendar.hour, calendar.min, calendar.sec);
    printf("星期%d\r\n", calendar.week);

    //StandbyMode();

    // HAL_GPIO_TogglePin(SIGNAL_GPIO_Port, SIGNAL_Pin);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}




HAL_StatusTypeDef RTC_Alarm_IT_Enable(RTC_HandleTypeDef *hrtc)
{
  /* Process Locked */
  __HAL_LOCK(hrtc);

  hrtc->State = HAL_RTC_STATE_BUSY;

  __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();

  /* Clear flag alarm A */
  __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);

  /* Configure the Alarm interrupt */
  __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA);

  /* RTC Alarm Interrupt Configuration: EXTI configuration */
  __HAL_RTC_ALARM_EXTI_ENABLE_IT();

  __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();

  hrtc->State = HAL_RTC_STATE_READY;

  __HAL_UNLOCK(hrtc);

  return HAL_OK;
}
怀疑是EXTI17没配置好,不知道是哪出问题?



最佳答案

查看完整内容[请看2#楼]

已解决: 思路: 主程序: int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-23
在线时间
11 小时
 楼主| 发表于 2019-1-14 17:10:58 | 显示全部楼层
已解决:

思路:
主程序:
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  RtcClock_Config();
  MY_RTC_Init();
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
  RTC_Alarm_EXTI17_NVIC_INIT();
  RTC_Alarm_IT_Enable(&hrtc);
  RTC_Alarm_Set(2019,1,15,15,34,30);
  
  printf("Start!\r\n");

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_Delay(200);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //灭
    HAL_Delay(200);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //亮
    HAL_Delay(200);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //灭
    HAL_Delay(200);
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //亮
    HAL_Delay(200);

    /* 检测系统是否是从待机模式启动的 */
    if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
    {
      printf("待机唤醒复位\r\n");
      /* 清除待机标志位 */
      __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
    }
    else
    {
      printf("系统是上电启动\r\n");
    }

    RTC_Get();
    printf("%2d年%2d月%2d日 ------ ", calendar.w_year, calendar.w_month, calendar.w_date);
    printf("%2d点%2d分%2d秒 ------ ", calendar.hour, calendar.min, calendar.sec);
    printf("星期%d\r\n", calendar.week);

    //SleepMode();
    StopMode_IT();
    //StandbyMode();
    printf("Exit stop mode!\r\n");

    // HAL_GPIO_TogglePin(SIGNAL_GPIO_Port, SIGNAL_Pin);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

//used for wake up the stop mode
void RTC_Alarm_EXTI17_NVIC_INIT(void)
{
  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}

HAL_StatusTypeDef RTC_Alarm_IT_Enable(RTC_HandleTypeDef *hrtc)
{
  /* Process Locked */
  __HAL_LOCK(hrtc);

  hrtc->State = HAL_RTC_STATE_BUSY;

  /* Clear the ALARM EXTI flag */
  __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();

  /* Clear flag alarm A */
  __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);

  /* Configure the Alarm interrupt */
  __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA);

  /* RTC Alarm Interrupt Configuration: EXTI configuration */
  __HAL_RTC_ALARM_EXTI_ENABLE_IT();

  __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();

  hrtc->State = HAL_RTC_STATE_READY;

  __HAL_UNLOCK(hrtc);

  return HAL_OK;
}

添加中断向量函数
/* used for wake up the stop mode */
void RTC_Alarm_IRQHandler(void)
{
  HAL_RTC_AlarmIRQHandler(&hrtc);
}
回复

使用道具 举报

头像被屏蔽

18

主题

184

帖子

0

精华

禁止发言

积分
258
金钱
258
注册时间
2019-1-10
在线时间
10 小时
发表于 2019-1-14 17:26:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-1-15 00:59:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-23
在线时间
11 小时
 楼主| 发表于 2019-1-15 08:41:10 | 显示全部楼层
回复

使用道具 举报

4

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-23
在线时间
11 小时
 楼主| 发表于 2019-1-15 08:41:39 | 显示全部楼层
正点原子 发表于 2019-1-15 00:59
http://www.openedv.com/forum.php?mod=viewthread&tid=108920
参考下这个。

回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4477
金钱
4477
注册时间
2013-4-22
在线时间
336 小时
发表于 2019-1-15 09:22:51 | 显示全部楼层
RTC是独立存在运行的,无非就是启动的时候配置能正确读写寄存器即可
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2012-12-4
在线时间
33 小时
发表于 2020-12-16 16:11:11 | 显示全部楼层
楼主的帖子实在是写得太好了,不觉明厉啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 18:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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