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

news2024/12/24 8:17:06

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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二极管:烧IC与我相干!

趁“羊”未到,还有心力接着上节继续讲。 话说,烧IC,不只本身IC烧,还火烧连营连带后端IC一并烧,为何呢!? 那得回到过去,必须翻翻《硬件先生》中的《电源知识-DC-DC》,从D…

GPU与CPU的性能比较及影响因素

CPU的主要指标是主频和线程。 Intel:后缀F表示无核显,后缀K代表可以超频,H代表移动端;AMD:后缀G代表有核显,后缀X代表加强版,后缀XT代表超级加强版。 CPU 常见计算操作: 数据加载、…

4.0、Hibernate-延迟加载 2

4.0、Hibernate-延迟加载 2 消费者 和 订单 属于 一对多 的 关系,通过上一章节 3.0 的内容我们知道了可以通过设置 customer 来实现延迟加载,本章节来介绍一下如何设置 orders 去实现延迟加载; one-to-many 的 lazy 默认是 true 是开启的&…

%29 身份认证

1、Web 开发模式 (1)、基于服务器渲染的开发模式:服务器发送给客户端的 HTML 页面,是在服务器通过字符串的拼接,动态生成的(企业级网站) (2)、基于前后端分离的开发模式&…

登录过程(vuex存储token、token持久化)

登录过程(vuex存储数据) 点击登录按钮通过表单校验 this.$refs.loginForm.validate(valid > {if (valid) {//按钮动画加载,禁用 this.loading true// 调用vuex的action发送登录请求this.$store.dispatch(user/login, this.loginForm).then(() > {this.$router.push({ p…

内存分配函数(动态内存分配)详解

目录 🎑为什么要进行动态内存开辟? 🎑malloc和free 🎠malloc函数 🎠free函数 🎠malloc函数和free函数的实际应用 🎑calloc函数 🎑realloc函数 🎠realloc函数的使用示例 &…

通过脚手架vue-cli创建一个vue项目

我需要在vue-demo文件下新建vue项目 步骤一 ①在该文件夹下打开集成终端 输入创建命令 命令 vue create 项目名称 ,注意不要使用驼峰命名法 如果是第一次配置,有面的提示,这里说你这样速度会很慢的,用不用镜像啊,这…

样品制备丨艾美捷硝酸盐/亚硝酸盐荧光法检测试剂盒

一氧化氮(NO)是由一氧化氮合酶(NOS)在生物系统中合成的。NOS是一种非常复杂的酶,作用于分子氧、精氨酸和NADPH,产生NO、瓜氨酸和NADP。这个过程需要五个额外的辅因子(FMN、FAD、血红素、钙调素和…

制造业ERP管理系统在企业采购管理中的作用是什么?

对于任何一家企业,采购都是头等大事。企业的采购工作往往是决定了企业产品的交货速度、成本和质量,特别是在制造行业,采购成本甚至占比产品成本的60%以上,降低采购成本是提高企业竞争力的关键。因此,对于企业采购领域的…

Effective C++条款34:区分接口继承和实现继承

Effective C条款34:区分接口继承和实现继承(Differentiate between inheritance of interface and inheritance of implementation)条款34:区分接口继承和实现继承1、纯虚函数2、虚函数(非纯)2.1 将默认实现…

2022 IoTDB Summit:中国核电刘旭嘉《工业时序数据库 Apache IoTDB 在核电的应用实践》...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

middlebury立体匹配评估使用方法总结(三)——线上版教程

系列文章目录 middlebury立体匹配评估使用方法总结(一)——网站说明 middlebury立体匹配评估使用方法总结(二)——python版离线教程 middlebury立体匹配评估使用方法总结(三)——线上版教程 文章目录系列文…

TableLayout布局

表格布局-TableLayout 1.TableLayout简介 1.简介 表格的形式,整齐可以嵌套继承于线性布局2.行数如何确定? tableRow,来指定行数列数由最多的那个决定layout_column来指定具体的列数,从0开始2.TableLayout的常见属性 所有的都是从0…

VMware ESxi 服务器迁移【手动版】

VMware ESxi 迁移【手动版】 应用场景 两个不同环境下的服务器进行迁移 因为不能直接对拷,需要在中间机上转一下 才有了这么一出 第一步 搭建NFS 在中间机上安装NFS(或者其他磁盘挂载方式) 目的呢是把源服务器上的系统拷贝到中间机上&#x…

android入门之broadcast

1. 前言 广播Broadcast是android四大组件之一。是用来互相通信(传递信息)的一种机制。 通信包括: a) 组件间(应用内)通信 b) 进程间通信 2. 广播Brocast的基本使用方式 广播发送者:Acvitity、Service等…

pdf文档页码怎么添加?分享这几个pdf加页码方法给你

不管是还在校园里的学生,还是已经步入职场的小伙伴,都会遇到要对一些文档进行编辑处理,例如有时需要将word、excel、ppt等格式的文档与pdf文件进行相互转换,有时又需要对pdf文件进行编辑文档增加页眉页脚、拆分合并、加密解密等操…

基于Python+Echarts+Pandas 搭建一套图书分析大屏展示系统(附源码)

今天给大家分享的是基于 Flask、Echarts、Pandas 等实现的图书分析大屏展示系统。 项目亮点 采用 pandas、numpy 进行数据分析 基于 snownlp、jieba 进行情感分析 后端接口选用 RESTful 风格,构建 Swagger 文档 基于 Flask、Echarts 构建 Web 服务,采…

2022年债券估值工具和方法

第一章 债券估值原理概述 债券估值是决定债券公平价格[1]的过程。债券公平价格是债券的预期现金流经过合适的折现率折现以后的现值,其原理是未来现金流流出折现到今日与今日现金流流出相等。因此,债券的估值模型可以表示为: 资料来源&#x…

新冠阳性的第四篇博客,SpringBoot 任务(异步、定时、邮件)

新冠阳性的第四篇博客,SpringBoot 任务(异步、定时、邮件)1.异步任务2.邮件任务3.定时任务1.异步任务 异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动&#x…

Python多元线性回归、机器学习、深度学习在近红外光谱分析中的应用

导师:郁磊副教授,主要从事MATLAB 编程、机器学习与数据挖掘、数据可视化和软件开发、人工智能近红外光谱分析、生物医学系统建模与仿真,具有丰富的实战应用经验,主编《MATLAB智能算法30个案例分析》、《MATLAB神经网络43个案例分析…