飞道的博客

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

394人阅读  评论(0)

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


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

  • 🔰APM32F103芯片只是拿来做测试,作为量产使用,请慎重考虑!

📢案例说明

该案例默认是配置的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外部时钟报警中断

  • ⚡请注意:下面的方法仅支持STM32F103VC不支持APM32F03VC。
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);
}

 

转载:https://blog.csdn.net/weixin_42880082/article/details/128412886
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场