#include "ds1302.h"
// 秒 分 时 日 月 星期 年
unsigned char read_rtc_cmd[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char write_rtc_cmd[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char time[7]={0x00,0x56,0x16,0x06,0x11,0x07,0x22};//BCD码 参考数据手册格式
//2021-10-31 16:57:00 星期7
//声明全局变量
extern unsigned char time[7];
void ds1302_TimeInit(void)
{
ds1302_Write(0x8e,0x00); //关闭写保护
for(int i=0;i<7;i++)
{
ds1302_Write(write_rtc_cmd[i],time[i]);
}
ds1302_Write(0x8e,0x80); //打开写保护
}
void ds1302_WriteByte(unsigned char dat)
{
unsigned char i;
ds1302_ioout_init();
for(i=0;i<8;i++) //低位在前 高位在后
{
HAL_GPIO_WritePin(ds_gpiox, ds1302_io, dat&0x01);
SCLK_1();
dat >>= 1;
SCLK_0();
}
}
//上升沿采样 下降沿数据输出
unsigned char ds1302_ReadByte(void)
{
unsigned char tmp;
unsigned char dat=0;
ds1302_ioin_init();
delay_us(2);
for(tmp=0x01;tmp!=0;tmp<<=1)
{
if(HAL_GPIO_ReadPin(ds_gpiox, ds1302_io)!=0)
dat|=tmp;
SCLK_1();
delay_us(4);
SCLK_0();
delay_us(14); //延时读取电压 更加准确
}
return dat;
}
void ds1302_Write(unsigned char addr,unsigned char dat)
{
CE_0(); //初始低
SCLK_0(); //初始低
delay_us(1);
CE_1(); //拉高 使能芯片
delay_us(2);
ds1302_WriteByte(addr); //写入命令字节
ds1302_WriteByte(dat); //写入数据
CE_0(); //结束
SCLK_0();
delay_us(2);
}
unsigned char ds1302_Read(unsigned char addr)
{
unsigned char dat;
CE_0(); //初始低
SCLK_0(); //初始低
delay_us(3);
CE_1(); //拉高 使能芯片
delay_us(3);
ds1302_WriteByte(addr); //写入命令字节
dat=ds1302_ReadByte();
CE_0();
return dat;
}
void ds1302Readtimer(void)
{
unsigned char i;
for(i=0;i<7;i++)
{
time[i]=ds1302_Read(read_rtc_cmd[i]);
}
}
void ds1302init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(ds_gpiox, CE|SCLK, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = CE|SCLK;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ds_gpiox, &GPIO_InitStruct);
}
void ds1302_ioin_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = ds1302_io;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(ds_gpiox, &GPIO_InitStruct);
}
void ds1302_ioout_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(ds_gpiox, ds1302_io, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = ds1302_io;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ds_gpiox, &GPIO_InitStruct);
}
void delay_us(uint32_t us)
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--)
{
;
}
}
STM32HAL库的DS1302RTC时钟驱动程序
需积分: 0 119 浏览量
更新于2023-05-05
2
收藏 2KB ZIP 举报
STM32HAL库是STMicroelectronics为STM32系列微控制器设计的一种高级抽象层库,它简化了开发者与硬件交互的过程。在这个特定的场景中,我们关注的是如何使用STM32HAL库来驱动DS1302实时时钟(RTC)模块。DS1302是一款低功耗、高性能的实时时钟芯片,常用于嵌入式系统中以提供精确的时间保持功能。
`ds1302.c`文件通常包含了DS1302的驱动实现,包括初始化、读写操作等函数。这些函数可能包括`DS1302_Init()`用于初始化DS1302,`DS1302_SetTime()`用于设置当前时间,`DS1302_GetTime()`用于获取当前时间,以及`DS1302_WriteByte()`和`DS1302_ReadByte()`用于向DS1302发送和接收数据。
在`ds1302.h`文件中,你会找到上述函数的声明,以及关于DS1302的一些定义和常量,如I/O端口配置、控制命令和时钟寄存器地址。例如,可能会有定义如下:
```c
#define DS1302_I2C_ADDRESS 0x68 // DS1302的I2C地址
#define DS1302_SECONDS_REG 0x80 // 秒寄存器地址
#define DS1302_MINUTES_REG 0x81 // 分钟寄存器地址
#define DS1302_HOURS_REG 0x82 // 小时寄存器地址
```
DS1302与STM32之间的通信通常通过串行接口进行,可能是SPI或I2C。在HAL库中,这些通信协议被封装在了易于使用的API中。例如,对于SPI接口,你可以使用`HAL_SPI_Transmit()`和`HAL_SPI_Receive()`函数;对于I2C接口,可以使用`HAL_I2C_Master_Transmit()`和`HAL_I2C_Master_Receive()`。
初始化DS1302通常涉及配置STM32的GPIO、SPI或I2C接口,并确保DS1302的电源和时钟线正确设置。`DS1302_Init()`函数会执行这些步骤,包括使能相关的时钟源,配置GPIO引脚为推挽输出或开漏输出,以及初始化SPI或I2C外设。
设置和获取时间的函数`DS1302_SetTime()`和`DS1302_GetTime()`会处理DS1302的BCD(二进制编码十进制)时间和日期格式。由于DS1302的寄存器存储时间数据的方式是BCD,所以需要将用户提供的十进制时间转换为BCD,然后写入相应的寄存器。反之,从DS1302读取时间后,也要将BCD格式转换回十进制。
在实际应用中,DS1302可以用于记录系统启动时间、定时事件或者在无电源的情况下保持时间。结合STM32HAL库,开发人员可以轻松地集成DS1302到他们的项目中,实现精确的时钟管理功能。
总结来说,这个DS1302RTC时钟驱动程序提供了与DS1302实时时钟芯片交互的接口,使得在STM32平台上实现时间管理变得更加简单。通过理解和使用`ds1302.c`和`ds1302.h`中的函数,开发者可以有效地控制DS1302进行时间设置、查询以及其他相关操作。
poism
- 粉丝: 1
- 资源: 5
最新资源
- 基于javaswing的可视化学生信息管理系统
- 车辆、人检测14-TFRecord数据集合集.rar
- 车辆、人员、标志检测26-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 一款完全免费的屏幕水印工具
- 基于PLC的空调控制原理图
- 基于VUE的短视频推荐系统
- Windows环境下Hadoop安装配置与端口管理指南
- 起重机和汽车检测17-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- XAMPP 是一个免费且易于安装的Apache发行版
- 汽车软件需求开发与管理-从需求分析到实现的全流程解析