1. 认识DS3231M:高精度RTC芯片的硬件基础
DS3231M是一款让我眼前一亮的实时时钟芯片,它最大的特点就是精度超高而且价格亲民。我第一次用这个芯片是在一个数据采集项目里,需要长时间记录传感器数据的时间戳,当时试过几种RTC芯片,最后发现DS3231M的表现最稳定。
这个芯片内部集成了MEMS谐振器,不像传统RTC需要外接晶振。我记得刚开始玩电子的时候,最头疼的就是外接晶振的匹配问题,有时候稍微碰一下就会导致时钟不准。DS3231M直接把谐振器做在芯片内部,从根本上解决了这个问题。它的计时精度在-40°C到+85°C范围内能达到±5ppm,算下来一天误差不到0.5秒,对于大多数应用来说完全够用了。
硬件连接特别简单,只需要基本的I2C线路加上电源就行。VCC接3.3V,GND接地,SDA和SCL线记得加上拉电阻,一般用4.7k到10k都可以。如果要用备份电池,把VBAT接到3V的纽扣电池上,这样主电源断开时时间还能继续走。我在实际项目中发现,即使用最便宜的CR2032电池,也能维持好几年的备份时间。
引脚功能方面,除了基本的电源和I2C引脚,还有几个功能脚很实用。32KHz脚可以输出32.768kHz的方波,INT/SQW脚既能做中断输出也能产生1Hz方波。我在一个辉光管时钟项目里就用到了1Hz输出功能,直接驱动继电器的滴答声效果很棒。
2. STM32标准库下的I2C通信实现
说到I2C通信,我刚开始用STM32的时候也是踩过不少坑。硬件I2C虽然方便,但有时候会遇到各种奇怪的问题,所以我现在更习惯用软件模拟I2C,稳定性更好控制。
先来看看I2C的初始化。在标准库里,我们需要配置GPIO为开漏输出模式,这是因为I2C总线需要支持线与功能。记得一定要加上拉电阻,不然信号根本拉不高。我一般用4.7k的电阻,在400kHz速度下工作很稳定。
void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
}
I2C的时序实现要特别注意延时时间。太快了从机跟不上,太慢了影响系


1467

被折叠的 条评论
为什么被折叠?



