当前位置: 首页 > news >正文

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

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


  • ✨相关篇推荐《【开源电路】STM32F103VCT6开发板》
  • 📌关篇《APM32F103 RTC内部时钟源秒中断例程测试》
  • 📌本案例来源于官方的SDK固件包:https://www.geehy.com/support/apm32

🎈源码位置: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);
}

相关文章:

  • 现在网站优化怎么做/百度小说风云榜今天
  • 哀悼日 网站黑色代码/软文的目的是什么
  • 怎么免费创建网站/火星时代教育培训机构怎么样
  • 点图片跳到网站怎么做的/百度搜索引擎推广怎么弄
  • 荥阳市网站建设/seo工程师招聘
  • 深圳华强北网站建设/小程序设计
  • 面向6G的URLLC需求与关键技术分析
  • [力扣c++实现] 152. 乘积最大子数组
  • P6 PyTorch 常用数学运算
  • DFS——剪枝
  • 安科瑞红外测温方案助力滁州某新能源光伏产业工厂安全用电
  • 2022年安徽最新水利水电施工安全员模拟试题及答案
  • 资深车主才会告诉你的那些事,看完立省三万二
  • encode decode作用,以及为什么会出现乱码呢?如何准确检查字符长度?
  • XXE漏洞详解(一)——XML基础
  • Maven 项目模板
  • SpringBoot文件上传(官方案例)
  • 动态内存开辟+柔性数组