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

谁能解释一下STM32F0的RTC_IRQHandler中断中EXTI_Line17的作用?

[复制链接]
sasmike 提问时间:2015-1-8 18:34 /
在学习STM32F0的RTC时,不太清楚AlarmA的中断函数RTC_IRQHandler中每次都要清除EXTI_ClearITPendingBit(EXTI_Line17);
要是没有行不行,为什么要这样做?哪位高手给个解释啊?


程序如下:
void RTC_IRQHandler(void)
{
  /* Check on the AlarmA flag and on the number of interrupts per Second (60*8) */
  if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
  {
    /* ALARM is enabled */
    ALARM_Occured = 1;
   
    /* Clear RTC AlarmA Flags */
    RTC_ClearITPendingBit(RTC_IT_ALRA);
  }
  /* Clear the EXTIL line 17 */
  EXTI_ClearITPendingBit(EXTI_Line17);
  
}

收藏 1 评论9 发布时间:2015-1-8 18:34

举报

9个回答
AndyYau-268557 回答时间:2015-1-8 21:25:28
最后一句是清除挂起位,肯定需要的,不然也不会出来这么个函数。
mr.hs 回答时间:2015-1-10 14:09:34
编程好习惯
就和指针用完置null一样
w420119855 回答时间:2015-4-3 09:57:03
lz你好,,可以分享下你RTC闹钟的配置吗?由于没有LSE,所以使用LSI作为时钟源,但是看起来不能正常工作
void RTC_Config(void)
{

  RTC_InitTypeDef RTC_InitStructure;
  RTC_TimeTypeDef  RTC_TimeStruct;
  
  /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        printf("999\r\n",0);
  /* Allow access to RTC */
  PWR_BackupAccessCmd(ENABLE);

  RCC_LSICmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
  {
  }



  /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

  /* Configure the RTC data register and RTC prescaler */
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);
  
  /* Set the time to 00h 00mn 00s AM */
  RTC_TimeStruct.RTC_H12     = RTC_H12_AM;
  RTC_TimeStruct.RTC_Hours   = 0x00;
  RTC_TimeStruct.RTC_Minutes = 0x00;
  RTC_TimeStruct.RTC_Seconds = 0x00;  
  if(ERROR == RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct))
          printf("7\r\n",0);
    /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
  
  /* Wait for RTC APB registers synchronisation */
  if(ERROR == RTC_WaitForSynchro())
          printf("2\r\n",0);
}

/**
  * @brief  Configures the RTC Alarm.
  * @param  None
  * @retval None
  */
void RTC_AlarmConfig(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
  RTC_AlarmTypeDef RTC_AlarmStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* EXTI configuration */
  EXTI_ClearITPendingBit(EXTI_Line17);
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
  /* Enable the RTC Alarm Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Set the alarmA Masks */
  RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_All;
  RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
  
  /* Set AlarmA subseconds and enable SubSec Alarm : generate 8 interripts per Second */
  RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5);

  /* Enable AlarmA interrupt */
  RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  
  /* Enable the alarmA */
  RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
  
}
w420119855 回答时间:2015-4-3 09:57:38
上面的配置是按照ST的官方例程写的
moyanming2013 回答时间:2015-4-3 14:11:39
w420119855 发表于 2015-4-3 09:57
lz你好,,可以分享下你RTC闹钟的配置吗?由于没有LSE,所以使用LSI作为时钟源,但是看起来不能正常工作
void R ...

用内部时钟需要校准!
回答时间:2015-4-3 16:08:41
Internal interrupt line 17  Connected to the RTC Alarm  event

这里说明了LINE17是RTC alarm中断引起的,所以要清除.
vitasnokia 回答时间:2017-4-6 09:45:01
moyanming2013 发表于 2015-4-3 14:11
用内部时钟需要校准!

你好,怎么校准了?
shuyaott 回答时间:2019-2-21 15:43:45
在《STM32F4xx中文参考手册》第585页有明确说明:
所有 RTC 中断均与 EXTI 控制器相连。
要使能 RTC 闹钟中断,需按照以下顺序操作:
1.将 EXTI 线 17 配置为中断模式并将其使能,然后选择上升沿有效。
2. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。
3. 配置 RTC 以生成 RTC 闹钟(闹钟 A 或闹钟 B)。
要使能 RTC 唤醒中断,需按照以下顺序操作:
1.将 EXTI 线 22 配置为中断模式并将其使能,然后选择上升沿有效。
2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。
3. 配置 RTC 以生成 RTC 唤醒定时器事件。
要使能 RTC 入侵中断,需按照以下顺序操作:
1.将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。
2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。
3. 配置 RTC 以检测 RTC 入侵事件。
要使能 RTC 时间戳中断,需按照以下顺序操作:
1.将 EXTI 线 21 配置为中断模式并将其使能,然后选择上升沿有效。
2. 配置 NVIC 中的 TAMP_STAMP IRQ 通道并将其使能。
3. 配置 RTC 以检测 RTC 时间戳事件。
nyszx 回答时间:2019-2-21 20:39:06
EXTI线17连接到RTC闹钟事件,所以发生中断后需要手动清除标志

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版