当前位置: 首页 > 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)

相关文章:

  • 【Rust发邮件】Rust如何通过smtp协议发送邮件
  • 【FineDance】ModuleNotFoundError: No module named ‘smplx‘
  • Async、await是什么?跟promise有什么区别?使用的好处是什么
  • 常见误区解读之四:相较传统架构,超融合不够稳定?
  • matlab 求fir滤波器系数量化前和量化后的幅频响应对比图
  • 深度解析PECI:平台环境控制接口硬件架构
  • Transformer架构与注意力机制
  • springboot 常用各种注释的含义
  • 深度学习实战文档图像矫正
  • Ubuntu 多网卡安全路由配置(SSH 不断线版)
  • AWS CloudFormation深度解析:构建现代云原生应用基础设施
  • Kafka消费者客户端源码深度解析:从架构到核心流程
  • Java同步机制四大工具对比
  • Java死锁的例子
  • 微信小程序:实现左侧菜单、右侧内容、表单、新增按钮等组件封装
  • 微信小程序传参过来了,但是数据没有获取到
  • 计算机网络学习笔记:TCP可靠传输实现、超时重传时间选择
  • FPGA基础 -- Verilog 禁止语句
  • 电力物联网,5G/4G通讯终端,电力系统通信
  • openstack的实现原理
  • 广东网站建设公司哪家便宜/网上推广app怎么做
  • 网站建设费用高低有什么区别/app营销策划方案
  • 800字以上网站设计方案/上海百度移动关键词排名优化
  • 网站输入字符 显示出来怎么做/站长工具日本
  • 做presentation的网站/免费网站推广网站短视频
  • 网站设计与制作说明/全是广告的网站