当前位置: 首页 > news >正文

STM32 HAL 初始化I2C启动DS1307

void bsp_ds1307_init(void)
{// 初始化数据数组:包含时钟配置、时间日期和密码const uint8_t init_data[] = {0x80, 0x00, 0x00 , 0x05, 0x01, 0x01, 0x21, 0x10, \0x19, 0x61, 0x05, 0x18};uint8_t a[4];uint16_t i;// 1. 读取DS1307地址8~11的4字节数据(存储的密码)HAL_I2C_Mem_Read(&hi2c1, DS1307_ADDR, 8, I2C_MEMADD_SIZE_8BIT, a, 4, 100);// 2. 验证读取的密码是否与init_data中存储的匹配for(i = 0; i < 4; i++)if(init_data[8 + i] != a[i])break;// 3. 如果密码不匹配(i<4),则写入完整初始化数据if(i < 4){HAL_I2C_Mem_Write(&hi2c1, DS1307_ADDW, 0, I2C_MEMADD_SIZE_8BIT, \(uint8_t*)init_data, 12, 100);}
}

初始化数据详解

init_data数组的 12 个字节依次配置如下:

索引寄存器地址功能描述值解析(BCD 格式)
00x00秒寄存器0x80 → CH=1(振荡器停止)
10x01分寄存器0x00 → 00 分
20x02时寄存器0x00 → 00 时(24 小时制)
30x03星期寄存器0x05 → 星期五
40x04日期寄存器0x01 → 1 日
50x05月寄存器0x01 → 1 月
60x06年寄存器0x21 → 2021 年
70x07控制寄存器0x10 → SQWE=1(启用方波,频率 1Hz)
80x08用户自定义寄存器(密码第 1 字节)0x19
90x09用户自定义寄存器(密码第 2 字节)0x61
100x0A用户自定义寄存器(密码第 3 字节)0x05
110x0B用户自定义寄存器(密码第 4 字节)0x18

关键配置点

  1. 振荡器状态

    • 初始值 0x80 会导致时钟停止运行(CH=1)。这可能是设计问题,通常应设为 0x00 启动时钟。
  2. 方波输出

    • 控制寄存器(0x07)配置为 0x10,启用方波输出(SQWE=1),频率为 1Hz(RS0=0,RS1=0)。
  3. 时间日期

    • 设置为 2021 年 1 月 1 日 星期五 00:00:00。若需更新时间,应修改此数据。
  4. 密码验证

    • 通过比较地址 0x08~0x0B 的 4 字节数据判断是否需要初始化。

潜在问题

  1. 振荡器停止

    • 秒寄存器初始值 0x80 会导致时钟停止。若需启动时钟,应在写入后清除 CH 位(例如:sec &= 0x7F)。
  2. 密码存储冲突

    • 地址 0x08~0x0F 属于用户自定义区域,但某些应用可能将其用于其他功能,需注意冲突。
  3. 时间过时

    • 预设时间为 2021 年,若设备长期未使用,需手动更新时间。

改进建议

void bsp_ds1307_init(void)
{const uint8_t init_data[] = {0x00, 0x00, 0x00 , 0x05, 0x01, 0x01, 0x25, 0x10, \0x19, 0x61, 0x05, 0x18};  // 修改:秒寄存器初始值0x00(启动时钟)uint8_t a[4];uint16_t i;HAL_I2C_Mem_Read(&hi2c1, DS1307_ADDR, 8, I2C_MEMADD_SIZE_8BIT, a, 4, 100);for(i = 0; i < 4; i++)if(init_data[8 + i] != a[i])break;if(i < 4){HAL_I2C_Mem_Write(&hi2c1, DS1307_ADDW, 0, I2C_MEMADD_SIZE_8BIT, \(uint8_t*)init_data, 12, 100);}// 确保振荡器启动(清除CH位)uint8_t sec = 0;HAL_I2C_Mem_Read(&hi2c1, DS1307_ADDR, 0, I2C_MEMADD_SIZE_8BIT, &sec, 1, 100);sec &= 0x7F;  // 清除CH位HAL_I2C_Mem_Write(&hi2c1, DS1307_ADDW, 0, I2C_MEMADD_SIZE_8BIT, &sec, 1, 100);
}

总结

该初始化函数主要实现了:

  • 密码验证机制(通过地址 0x08~0x0B 的 4 字节数据)
  • 默认时间设置(2021 年 1 月 1 日)
  • 方波输出配置(1Hz)
http://www.lqws.cn/news/448003.html

相关文章:

  • 第1章: 伯努利模型的极大似然估计与贝叶斯估计
  • apisix-使用hmac-auth插件进行接口签名身份验证\apisix consumer
  • 机构运动分析系统开发(Python实现)
  • 工程师生活:清除电热水壶(锅)水垢方法
  • 前端HTML学习笔记
  • 《思维力:高效的系统思维》
  • python画三维立体图
  • 【支持向量机】SVM线性可分支持向量机学习算法——硬间隔最大化支持向量机及例题详解
  • 打卡Day55
  • 【lenovo】LEGION 2020款跳过windows账号登录
  • 12.10 在主线程或子线程中更新 UI
  • 退出python解释器的四种方式
  • C#语言入门-task2 :C# 语言的基本语法结构
  • vue3 defineExpose的使用
  • 不同系统修改 Docker Desktop 存储路径(从C盘修改到D盘)
  • 解锁微服务潜能:深入浅出 Nacos
  • 蜻蜓Q系统的技术演进:从Laravel 6到Laravel 8的升级之路-优雅草卓伊凡
  • C# winform教程(二)----GroupBox
  • ROS学习之服务通信
  • 【AI编程】第3期,针对AI生成的改枪码列表创建对应的数据库表
  • AWS CloudFormation深度解析:构建现代云原生应用基础设施
  • SpringBoot扩展——发送邮件!
  • Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲
  • 网络编程及原理(五)
  • Kotlin 2.6 猜数小游戏
  • AI免费工具:promptpilot、今天学点啥、中英文翻译
  • WSL 安装使用和常用命令
  • 设计模式精讲 Day 7:桥接模式(Bridge Pattern)
  • OpenAI 公布《走向理解与预防失准泛化:由“角色特征”驱动的突现性失准》研究总结
  • 用“Gemini 2.0 Flash Preview Image Generation”模型修改图片,有哪些常用的提示词和方法