APM32F103 RTC内部时钟源报警中断例程测试

APM32F103 RTC内部时钟源报警中断例程测试


🎈源码位置:D:\APM\APM32F10x_SDK_V1.8\Examples\RTC\RTC_Alarm

📢案例说明

该案例默认是配置的PE5(LED2)、PE6(LED3)引脚状态间隔0.5s翻转,报警中断是通过PA1接上拉按键,使用外部下降沿触发中断,来激活配置下一次的RTC报警中断发生的时间,设置的时间为当前触发按键中断时间加5s。
  • ⛳该代码同样可以烧录到同类型的STM32F103VC芯片上也可以运行,采用上面自制的开发板在不做任何修改直接烧录,可以看到相同效果。自制的开发板上的3个led分别是:PE5、PE6、PB5,该工程代码默认定义的2个LED分别是PE5、PE6.
  • 外部中断引脚:PA1,中断线为:EINT_LINE_1
void APM_MINI_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
{
    GPIO_Config_T     GPIO_configStruct;
    EINT_Config_T     EINT_configStruct;

    /* Enable the BUTTON Clock */
    RCM_EnableAPB2PeriphClock(BUTTON_CLK[Button] | RCM_APB2_PERIPH_AFIO);

    /* Configure Button pin as input floating */
    GPIO_configStruct.mode = GPIO_MODE_IN_PU;
    GPIO_configStruct.pin = BUTTON_PIN[Button];
    GPIO_Config(BUTTON_PORT[Button], &GPIO_configStruct);

    if (Button_Mode == BUTTON_MODE_EINT)
    {
        /* Connect Button EINT Line to Button GPIO Pin */
        GPIO_ConfigEINTLine(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);

        /* Configure Button EINT line */
        EINT_configStruct.line = BUTTON_EINT_LINE[Button];
        EINT_configStruct.mode = EINT_MODE_INTERRUPT;
        EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
        EINT_configStruct.lineCmd = ENABLE;
        EINT_Config(&EINT_configStruct);

        /* Enable and set Button EINT Interrupt to the lowest priority */
        NVIC_EnableIRQRequest(BUTTON_IRQn[Button], 0x0f, 0x0f);
    }
}
  • 🎉如果想修改为其他引脚,请参考用户手册《APM32F103xCxDxE用户手册 V1.5.pdf》第:92页内容:
    在这里插入图片描述
  • 📋按键中断服务函数
void EINT1_Isr(void)
{
    if (EINT_ReadIntFlag(EINT_LINE_1) == SET)
    {
        EINT_ClearIntFlag(EINT_LINE_1);
        uint16_t time;
        time = RTC_ReadCounter();
        /* set alarm for 5 s */
        RTC_ConfigAlarm(time + 5);
        RTC_WaitForLastTask();

        printf("Time : %ds\r\n", time);
        printf("5s later trigger the alarm\r\n");
    }
}
  • ✨如果修改为自动5秒触发下一次的RTC报警中断方法:只需要在RTC报警中断服务函数中添加设置下一次触发的时间即可,这样就不需要配置按键外部中断来进行设置触发RTC报警中断了。具体实现如下:
void RTC_Isr(void)
{
    uint16_t time;	
    time = RTC_ReadCounter();
	RTC_ConfigAlarm(time + 5);//自动开启5s后报警
    printf("Time : %ds\r\n", time);
    printf("ALARM INTERRUPT!\r\n");

    RTC_ClearIntFlag(RTC_INT_ALR);
}
  • main主函数代码:
int main(void)
{
    USART_Config_T usartConfigStruct;

    /* Configures LED2 and LED3 */
    APM_MINI_LEDInit(LED2);
    APM_MINI_LEDInit(LED3);

    /* USART configuration */
    USART_ConfigStructInit(&usartConfigStruct);//串口配置
//    usartConfigStruct.baudRate = 115200;
//    usartConfigStruct.mode = USART_MODE_TX_RX;
//    usartConfigStruct.parity = USART_PARITY_NONE;
//    usartConfigStruct.stopBits = USART_STOP_BIT_1;
//    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
//    usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;

    /* COM1 init*/
    APM_MINI_COMInit(COM1, &usartConfigStruct);//使能串口时钟,串口1:PA9/tx,PA10/rx
    /* KEY1 init*/
    APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);//默认是PA1,已修改为PB1

    RTC_Init();

    if (SysTick_Config(SystemCoreClock / 1000))
    {
        while (1);
    }
    printf("This example is for RTC Alarm\r\n");
    printf("Alarm will be triggered in 5 s\r\n");
//    printf("Later press KEY1 can set alarm for 5 s\r\n");
    while (1)
    {
        APM_MINI_LEDToggle(LED2);
        APM_MINI_LEDToggle(LED3);
        Delay(500);
    }
}
  • 📜串口打印信息
    在这里插入图片描述

📝配置为RTC外部时钟报警中断

  • ⚡以上配置,不仅可以在APM32F103VC上运行,还可以直接烧录到STM32F103VC上,也可以运行。
void RTC_Init(void)
{
    RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)RCM_APB1_PERIPH_PMU);
    PMU_EnableBackupAccess();

    /* LSI Enable */
//    RCM_EnableLSI();
//    while (RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET){}
//    RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);	
	/* LSE Enable */
	RCM_ConfigLSE(RCM_LSE_OPEN);
    while (RCM_ReadStatusFlag(RCM_FLAG_LSERDY) == RESET){}
    RCM_ConfigRTCCLK(RCM_RTCCLK_LSE);
    RCM_EnableRTCCLK();

    RTC_WaitForSynchro();
    RTC_WaitForLastTask();

    /* ALARM INTERRUPT Enable */
    RTC_EnableInterrupt(RTC_INT_ALR);
    RTC_WaitForLastTask();

    RTC_ConfigPrescaler(32767);
    RTC_WaitForLastTask();

    /* 5 s ALARM */
    RTC_ConfigAlarm(5);
    RTC_WaitForLastTask();

    /* COUNT SET 0 */
    RTC_ConfigCounter(0);
    RTC_WaitForLastTask();

    NVIC_EnableIRQRequest(RTC_IRQn, 0, 0);
}

⛳在使用外部晶振作为RTC时钟源时不运行情况分析

  1. 检查外部晶振是否正常,APM32F103VC芯片存在外部晶振(LSE)启动困难的情况,特别对于低温环境测试条件下。经测试,同类型的stm32则不存在这个问题,相同的底板,只是主控芯片不一样而已。
  2. 当晶振起振慢时,如果用手摸一下晶振输入引脚(PC15)或用电吹风吹一下,晶振又恢复正常了。

📑原因是当电路板受热时,杂散电容发生变化,正好给晶振提供了一个瞬间的与之匹配的工作条件。

  • 🔨解决方案:
  • 🌿减少杂散电容对晶振的干涉,对晶振做好屏蔽。
  • 🌿尝试适当减小晶振的外接电容。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值