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

求助!!STM32L151中的RTC唤醒(wake up)中断问题

[复制链接]
uniqueeefocus41 提问时间:2013-2-27 13:56 /
阅读主题, 点击返回1楼
收藏 评论11 发布时间:2013-2-27 13:56
11个回答
格式化/tp 回答时间:2017-10-19 22:38:18
本帖最后由 格式化/tp 于 2017-10-19 22:40 编辑

测试代码:
system_stm32f2xx.c中要把SystemInit函数中的SetSysClock();函数调用注释掉,启动时选16MHz的HSI作为系统时钟。
  1. #include <stdio.h>
  2. #include <stm32f2xx.h>

  3. int fputc(int ch, FILE *fp)
  4. {
  5.     if (fp == stdout)
  6.     {
  7.         if (ch == '\n')
  8.         {
  9.             while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  10.             USART_SendData(USART1, '\r');
  11.         }
  12.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  13.         USART_SendData(USART1, ch);
  14.     }
  15.     return ch;
  16. }

  17. void setclk(void)
  18. {
  19.     RCC_PLLConfig(RCC_PLLSource_HSI, 16, 240, 2, 5);
  20.     RCC_PLLCmd(ENABLE);
  21.    
  22.     RCC_PCLK1Config(RCC_HCLK_Div4);
  23.     RCC_PCLK2Config(RCC_HCLK_Div2);
  24.    
  25.     FLASH_SetLatency(FLASH_Latency_7);
  26.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  27.     while (RCC_GetSYSCLKSource() != 0x08);
  28. }

  29. int main(void)
  30. {
  31.     EXTI_InitTypeDef exti;
  32.     GPIO_InitTypeDef gpio;
  33.     RTC_DateTypeDef date;
  34.     RTC_InitTypeDef rtc;
  35.     RTC_TimeTypeDef time;
  36.     USART_InitTypeDef usart;
  37.     setclk();
  38.    
  39.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  40.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  41.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  42.    
  43.     PWR_BackupAccessCmd(ENABLE);
  44.    
  45.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  46.     gpio.GPIO_Mode = GPIO_Mode_AF;
  47.     gpio.GPIO_OType = GPIO_OType_PP;
  48.     gpio.GPIO_Pin = GPIO_Pin_9;
  49.     gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
  50.     gpio.GPIO_Speed = GPIO_Speed_50MHz;
  51.     GPIO_Init(GPIOA, &gpio);
  52.    
  53.     USART_StructInit(&usart);
  54.     usart.USART_BaudRate = 115200;
  55.     usart.USART_Mode = USART_Mode_Tx;
  56.     USART_Init(USART1, &usart);
  57.     USART_Cmd(USART1, ENABLE);
  58.    
  59.     printf("STM32F207VE RTC\n");
  60.     RCC_LSICmd(ENABLE);
  61.     while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  62.     if (RTC_GetFlagStatus(RTC_FLAG_INITS) == RESET)
  63.     {
  64.         printf("RTC Initialization!\n");
  65.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); // 32kHz
  66.         RCC_RTCCLKCmd(ENABLE);
  67.         
  68.         rtc.RTC_HourFormat = RTC_HourFormat_12;
  69.         rtc.RTC_AsynchPrediv = 127;
  70.         rtc.RTC_SynchPrediv = 249; // 128*250=32000
  71.         RTC_Init(&rtc);
  72.         
  73.         date.RTC_Date = 19;
  74.         date.RTC_Month = RTC_Month_October;
  75.         date.RTC_WeekDay = RTC_Weekday_Thursday;
  76.         date.RTC_Year = 17;
  77.         RTC_SetDate(RTC_Format_BIN, &date);
  78.         
  79.         time.RTC_H12 = RTC_H12_PM;
  80.         time.RTC_Hours = 8;
  81.         time.RTC_Minutes = 49;
  82.         time.RTC_Seconds = 10;
  83.         RTC_SetTime(RTC_Format_BIN, &time);
  84.     }
  85.     else
  86.         RTC_WaitForSynchro();
  87.    
  88.     RTC_WakeUpCmd(DISABLE);
  89.     RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
  90.     RTC_SetWakeUpCounter(0);
  91.     RTC_WakeUpCmd(ENABLE);
  92.    
  93.     RTC_ClearFlag(RTC_FLAG_WUTF); // 由于EXTI中断只对WUTF的上升沿有效, 因此若之前WUTF已经置位, 则永远不会触发中断!!!
  94.     RTC_ITConfig(RTC_IT_WUT, ENABLE);
  95.    
  96.     exti.EXTI_Line = EXTI_Line22;
  97.     exti.EXTI_LineCmd = ENABLE;
  98.     exti.EXTI_Mode = EXTI_Mode_Interrupt;
  99.     exti.EXTI_Trigger = EXTI_Trigger_Rising;
  100.     EXTI_Init(&exti);
  101.     NVIC_EnableIRQ(RTC_WKUP_IRQn);
  102.    
  103.     while (1)
  104.     {
  105.         RTC_GetDate(RTC_Format_BIN, &date);
  106.         RTC_GetTime(RTC_Format_BIN, &time);
  107.         printf("20%02d-%d-%d %02d:%02d:%02d %s\n", date.RTC_Year, (date.RTC_Month & 0x10) ? (date.RTC_Month - 6) : date.RTC_Month, date.RTC_Date, time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds, (time.RTC_H12 == RTC_H12_AM) ? "AM" : "PM");
  108.         
  109.         __WFI();
  110.     }
  111. }

  112. void RTC_WKUP_IRQHandler(void)
  113. {
  114.     EXTI_ClearITPendingBit(EXTI_Line22);
  115.     RTC_ClearITPendingBit(RTC_IT_WUT);
  116. }
复制代码


skydashanmao 回答时间:2019-6-17 11:21:11
本帖最后由 skydashanmao 于 2019-6-17 11:24 编辑

我用的单片机是STM32L476,也是进不去中断,今天刚把这个问题解决掉。因为驱动库中给的RTC Wakeup的EXTI中断没有打开。进行如下操作:将HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS)函数中的__HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_EVENT()替换为__HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT()
12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版