STM32闹钟的一个进阶使用

STM32闹钟的一个进阶使用

By Sky.J 2018.06.23

概述:

在使用STM32的过程中,我们在项目中可能经常会用到它的闹钟功能,但是对于刚开始接触STM32闹钟时,我就是直接设置一个闹钟,然后等待中断,有时候如果有两个闹钟,我们可以用ALARM A和B,但是有4个5个或者更多的闹钟设置,这时就不知道怎么办了。我就根据我的使用需求想了一个办法(只涉及几点几分,不考虑年月日及周几),如果你也有这样的需求,可以直接使用,如果不是,也希望可以给你留下一个思考的方向。

思路:

因为我的需求是每天的几点几分有一个闹钟,然后去处理,所以我的思路也很简单,就是将所有闹钟都注册到一个数组里面,然后换算为分钟从小到大进行排序,再根据当前时间去选择我下一个要设置的闹钟是哪一个,比如我已经注册了3个闹钟,时间分别是:200 300 500,当前时间是360,那么我现在选择设置的闹钟肯定是500。所以每次我们当闹钟响了以后,再去用当前时间和数组里面的闹钟时间对比,我们就可以得到下个闹钟需要设定的时间,是不是解决了闹钟设定的问题了呢。当然,有人会说闹钟设定了,我不知道这个闹钟响的时候我需要处理啥事件,很简单,我们在注册闹钟时不仅只注册时间,同时还需要注册闹钟事件标志。比如下方结构体:

 
      
typedef enum {
         
  PRINT_PEACE = 0,
  PRINT_LOVE,
  PRINT_HAVE_FUN
}alarm_process_status_t;
typedef struct {
         
  uint32_t time;                             //闹钟时间
  alarm_process_status_t process_status;    //闹钟事件
}alarm_info_t;


Linux下的模拟代码

这里我写了一个测试代码,为了方便调试和个人习惯,我自己是在linux下写了一个C代码,闹钟响不响,无非是中断是不是产生,至于怎么设置闹钟,这些我觉得你如果需要设置多个闹钟时,你一定已经基本知道闹钟的设置,我这里就不用STM32的实例代码了,我这边都是模拟,但效果是一样的,理解了思路就可以拿去增删改后用了。

 
 
      
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#define ALARM_SIZE        10
typedef enum {
         
  PRINT_PEACE = 0,
  PRINT_LOVE,
  PRINT_HAVE_FUN
}alarm_process_status_t;
typedef enum {
         
  ALARM_NOSET = 0,
  ALARM_SET
}alarm_set_status_t;
typedef struct {
         
  uint32_t time;
  alarm_process_status_t process_status;
}alarm_info_t;
typedef struct {
         
  uint8_t size;                 //闹钟注册个数
  alarm_set_status_t set_status;    //闹钟是否设置标志
  alarm_process_status_t process_status;    //当前设置的闹钟响后需要做的事件标志
  alarm_info_t info[ALARM_SIZE];    //存储注册的闹钟
}alarm_ctrl_t;
alarm_ctrl_t alarmctrl;
/*获取当前时间分钟*/
uint32_t get_local_time()
{
         
  time_t now;
  struct tm *tm_now;
  time(&now);
  tm_now = localtime(&now);
  uint32_t times = tm_now->tm_hour * 60 + tm_now->tm_min;
  return times;
}
/*初始化*/
void alarm_ctrl_init(alarm_ctrl_t *
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值