基于arm芯片的stm32f4xx的单片机项目-智能手环(1)
·
一、背景说明
让人从一个较低的基础开始制作一个智能手环项目,功能的话,先做一个时间显示( RTC系统时间、蓝牙控制设置闹钟、wifi获取网络时间),然后做温湿度的简单显示、以及心率血氧、计步的检测,这些我以多章节,一步一步的写出来。
不过,还是主要讲模块和项目的内容,原理性的知识不会过多的讲。
二、 RTC模块的介绍

实时时钟 (RTC)是一个独立的 BCD 定时器计数器。RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志(等同于外设定时器的时间更新中断),RTC 还包含用于管理低功耗模式的自动唤醒单元。
两个 32 位寄存器包含二进制码十进制数格式(BCD)的秒、分钟、小时(12或 24 小时制)、星期几、日期、月份和年份。此还可提供二进制格式的亚秒值。
系统可以自动将月份的天数补偿为28、29(闰年)、30和31 天。并且还可以进行夏令时补偿。
其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。
此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
上电复位后,所有 RTG 寄存器都会受到保护,以防止可能的非正常写访问。无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC 便不会停止工作。
三、RTC模块的初始化使用
.c
//1、RTC配置初始化
void RTC_ConfigInit(void)
{
/* 0、外设信息配置结构体 */
RTC_InitTypeDef RTC_InitStructure; //RTC基础配置
/* 1、使能电源管理时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* 2、允许使用RTC时钟 */
PWR_BackupAccessCmd(ENABLE);
/* 3、重置RTC域(注意:重置后,需重新开启RTC时钟) */
//RCC_BackupResetCmd(ENABLE);
//RCC_BackupResetCmd(DISABLE);
/* 4、使能RTC时钟 */
RCC_RTCCLKCmd(ENABLE);
#if SELECT_RTC_CLK //(为真选择LSE时钟,为假选择LSI时钟)
/* 5、使能外部低速时钟振荡器 */
RCC_LSEConfig(RCC_LSE_ON);
/* 6、等到外部低速时钟振荡器准备好 */
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
/* 6、选择RTC时钟源 */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* 7、等待直到RTC时间和日期寄存器(RTC_TR和RTC_DR)完成与RTCAPB时钟同步 */
RTC_WaitForSynchro();
/* 8、配置RTC数据寄存器和RTC预分频器 */
/* 公式:ck_spre(1Hz) = RTCCLK(LSE) /(AsynchPrediv + 1)*(SynchPrediv + 1)*/
RTC_InitStructure.RTC_AsynchPrediv = 0x7F; //异步分频系数(127+1)
RTC_InitStructure.RTC_SynchPrediv = 0xFF; //同步分频系数(255+1)
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; //24小时格式
RTC_Init(&RTC_InitStructure); //将配置的外设信息,写入到相对应的寄存器中
#else
/* 4、使能内部低速时钟振荡器 */
RCC_LSICmd(ENABLE);
/* 5、等到内部低速时钟振荡器准备好 */
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
/* 6、选择RTC时钟源 */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/* 7、等待直到RTC时间和日期寄存器(RTC_TR和RTC_DR)完成与RTCAPB时钟同步 */
RTC_WaitForSynchro();
/* 8、配置RTC数据寄存器和RTC预分频器 */
/* 公式:ck_spre(1Hz) = RTCCLK(LSI) /(AsynchPrediv + 1)*(SynchPrediv + 1)*/
RTC_InitStructure.RTC_AsynchPrediv = 0x7F; //异步分频系数(127+1)
RTC_InitStructure.RTC_SynchPrediv = 0xF9; //同步分频系数(249+1)
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; //24小时格式
RTC_Init(&RTC_InitStructure); //将配置的外设信息,写入到相对应的寄存器中
#endif
}
//2、设置RTC的日期和时间
void RTC_SetDateTime(uint8_t Year, uint8_t Month, uint8_t Date, uint8_t Hours, uint8_t Minutes, uint8_t Seconds)
{
/* 0、外设信息配置结构体 */
RTC_DateTypeDef RTC_DateStruct; //RTC日期配置
RTC_TimeTypeDef RTC_TimeStruct; //RTC时间配置
/* 1、设置日期(年月日、星期) */
RTC_DateStruct.RTC_Year = Year; //年份(0-99)
RTC_DateStruct.RTC_Month = Month; //月份
RTC_DateStruct.RTC_Date = Date; //日期(1-31)
RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Tuesday; //星期
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); //将配置的外设信息,写入到相对应的寄存器中
/* 2、设置时间(时分秒) */
RTC_TimeStruct.RTC_Hours = Hours; //小时(24小时制:0-23,12小时制:0-11)
RTC_TimeStruct.RTC_Minutes = Minutes; //分钟(0-59)
RTC_TimeStruct.RTC_Seconds = Seconds; //秒数(0-59)
//RTC_TimeStruct.RTC_H12 = RTC_H12_PM;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); //将配置的外设信息,写入到相对应的寄存器中
}
.h
/**
******************************************************************************
* @file rtc.h
* @author SLDY.熊猫
* @version V0.0.1
* @date 2025.11.04
* @brief
******************************************************************************
* @attention
*
* 本文档可以随便复制粘贴使用
*
* CSON: https://blog.csdn.net/cc_nyz?type=blog
* gitee: https://gitee.com/sldyxm/my-warehouse-ku.git
* 有疑问或建议 SLAYXM@163.com
*
******************************************************************************
*/
#ifndef __RTC_H //定义防止递归包含
#define __RTC_H
/* 1.其他头文件---------------------------------------------------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "my_config.h"
#include "my_reg.h"
#define SELECT_RTC_CLK 1
/* 宏定义(函数,变量,常量) ----------------------------------------------------------------------------------*/
/* 3.自定义数据类型(结构体,联合体,枚举) --------------------------------------------------------*/
/* 4. 全局变量声明 -------------------------------------------------------------------------------------------------------*/
/* 5. 函数声明 --------------------------------------------------------------------------------------------------------------*/
/* 6. 静态函数,函数定义 -------------------------------------------------------------------------------------------*/
extern void RTC_ConfigInit(void); // 1、RTC配置初始化
extern void RTC_SetDateTime(uint8_t Year, uint8_t Month, uint8_t Date, uint8_t Hours, uint8_t Minutes, uint8_t Seconds); // 2、设置RTC的日期和时间
#endif /* __RTC_H */
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)