当前位置: 首页 > 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.xdnf.cn/news/1061011.html

相关文章:

  • FPGA基础 -- Verilog 命名事件
  • QT6与VS下实现没有CMD窗口的C++控制台程序
  • MySQL 的 WITH ROLLUP 功能
  • python画三维立体图
  • 容器运行时保护:用Falco构建云原生安全防线
  • angular 图斑点击,列表选中并滚动到中间位置
  • ROS学习之服务通信
  • 2025虚幻引擎文件与文件夹命名规律
  • Tensorflow C++ API从入门到放弃
  • STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议
  • MySQL八股文
  • AIGC - Prompt Optimizer 提示词优化器
  • 编程马拉松的定义、运作与发展
  • 解锁微服务潜能:深入浅出 Nacos
  • S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解
  • SSH服务与rsync服务配置实战
  • FPGA基础 -- Verilog 概率分布函数
  • Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • AJAX拦截器失效排查指南:当你的beforeSend有效但error/complete沉默时
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • API 接口:程序世界的通用语言与交互基因
  • Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?
  • 主流防火墙策略绕过漏洞的修复方案与加固实践
  • 啊啊啊啊啊啊啊啊code
  • C++实现手写strlen函数
  • 什么是池化
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析
  • RK3568笔记八十五:LVGL播放AVI视频