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

谁能解释一下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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版