实验要求
使用野火或正点原子M3、M4或M7开发板rtc。 硬件上:至少有一路 GPIO 能够用来输出控制 蜂鸣器; 至少有一路 GPIO 作为按键输入检测端口; 有一路串口用来做 msh shell 终端; 软件上:串口驱动; PIN 驱动; RTC驱动。
准备工作
根据硬件连接情况配置与BEEP和KEY1连接的PIN号。
- 硬件准备:正点原子stm32f407探索者开发板;
- 软件准备:rtt3.0.3、stm32f4xx-HAL BSP、env0.7.1。
实例代码
一、测试代码:
#include <rtthread.h>
#include <rtdevice.h>
#define BEEP 20 //蜂鸣器引脚
#define KEY1 34 //定义按键输入引脚号
#define BEEP_ON(x) rt_pin_write(x ,1)
#define BEEP_OFF(x) rt_pin_write(x ,0)
#define ALARM_NUM_MAX 10
struct rt_alarm *ALARM[ALARM_NUM_MAX];
void alarm_callback_entry(rt_alarm_t alarm, time_t timestamp)
{
/* 打开蜂鸣器 */
BEEP_ON(BEEP);
rt_kprintf("Time out!<br>");
}
void alarm_test_entry(void* parameter)
{
while(1)
{
if(rt_pin_read(KEY1)==1)
{
BEEP_OFF(BEEP);
}
rt_thread_delay(20);
}
}
int alarm_init(void)
{
rt_thread_t tid;
/* 初始化按键输入 */
rt_pin_mode(KEY1, PIN_MODE_INPUT);
/* 将蜂鸣器控制脚设置为输出模式 */
rt_pin_mode(BEEP, PIN_MODE_OUTPUT);
/* 蜂鸣器默认不响 */
BEEP_OFF(BEEP);
rt_memset(&ALARM, NULL, sizeof(ALARM));
tid = rt_thread_create("alarm_test",
alarm_test_entry, RT_NULL,
512, RT_THREAD_PRIORITY_MAX/3, 20);
if (tid != RT_NULL)
rt_thread_startup(tid);
/* 初始化闹钟服务 */
rt_alarm_system_init();
return 0;
}
//INIT_APP_EXPORT(alarm_init);
void alarm_add(int argc, char **argv)
{
struct rt_alarm_setup _alarm;
if(argc > 1)
{
_alarm.flag = RT_ALARM_ONESHOT; /* 单次定时 */
rt_memset(&_alarm.wktime, RT_ALARM_TM_NOW, sizeof(struct tm));
_alarm.wktime.tm_hour = atol(argv[1]);
if(argc > 2)
{
_alarm.wktime.tm_min = atol(argv[2]);
_alarm.wktime.tm_sec = 0;
}
if(ALARM[0] == NULL)
{
ALARM[0] = rt_alarm_create(alarm_callback_entry, &_alarm);
}
else
{
rt_alarm_control(ALARM[0], RT_ALARM_CTRL_MODIFY, &_alarm);
}
rt_alarm_start(ALARM[0]);
}
}
MSH_CMD_EXPORT(alarm_add, e.g: alarm_add 12 15); /* 定时时间为12:15 */
二、主函数代码
#include <rtthread.h>
#include <board.h>
extern rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day);
extern rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second);
extern int alarm_init(void);
int main(void)
{
/* user app entry */
/* 设置当前时间 */
set_date(2018,9,11);
set_time(16,26,00);
alarm_init();
return 0;
}
实验步骤
使用ENV配置串口和PIN驱动,拷贝drv_rtc驱动,添加alarm.c文件。然后添加rtc_alarm.c文件到工程,在主函数中设置时间并且运行闹钟初始化函数,根据自己的板子修改相应代码编译无错后下载到开发板。
结果
通过向控制台发送alarm_add 16 28设置闹钟时间,闹钟时间到,蜂鸣器响,串口打印如下信息。按下KEY1键关闭蜂鸣器。

遇到的问题
程序下载后,发送命令后,等设定时间到,蜂鸣器不响。
解决方法
没有设置初始时间,在主函数中设定当前时间后,再操作即可。
下载附件
drv_rtc.h
drv_rtc.c
alarm.c