stm32 基于HAL工程硬件I2C读取PCF8563
参考链接:https://download.csdn.net/download/xqw19891201/11267260
PCF8563 的读写地址可以从手册上获取
#include "stm32xxxx.h"
#include "stm32xxxx_hal.h"
#define PCF8563_ADDRESS 0xA2 // PCF8563的I2C地址
I2C_HandleTypeDef hi2c; // I2C句柄
// 从PCF8563读取一个字节
uint8_t PCF8563_ReadByte(uint8_t reg)
{
uint8_t data;
HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
return data;
}
// 从PCF8563读取时间和日期
void PCF8563_ReadDateTime(uint8_t *buffer)
{
HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, buffer, 7, HAL_MAX_DELAY);
}
int main(void)
{
// 初始化硬件I2C外设
HAL_Init();
// 初始化时钟和GPIO引脚
// ...
// 配置I2C参数
hi2c.Instance = I2C1;
hi2c.Init.ClockSpeed = 400000;
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c.Init.OwnAddress1 = 0;
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c.Init.OwnAddress2 = 0;
hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
// 初始化I2C外设
HAL_I2C_Init(&hi2c);
uint8_t dateTimeBuffer[7];
// 读取PCF8563的时间和日期
PCF8563_ReadDateTime(dateTimeBuffer);
// 处理读取的时间和日期数据
// ...
while (1)
{
// 主循环
// ...
}
}
// 读取PCF8563的时间
void PCF8563_ReadDateTime(uint8_t *buffer)
{
HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, buffer, 7, HAL_MAX_DELAY);
}
int main(void)
{
// ...
uint8_t dateTimeBuffer[7];
// 读取PCF8563的时间和日期
PCF8563_ReadDateTime(dateTimeBuffer);
// 处理读取的时间和日期数据
// ...
while (1)
{
// 主循环
// ...
}
}
// BCD转换为Buffer
void BCDtoBuffer(uint8_t *bcd, uint8_t *buffer, uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
buffer[i] = ((bcd[i] >> 4) & 0x0F) * 10 + (bcd[i] & 0x0F);
}
}
// Buffer转换为BCD
void BuffertoBCD(uint8_t *buffer, uint8_t *bcd, uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
bcd[i] = ((buffer[i] / 10) << 4) | (buffer[i] % 10);
}
}
// 设置PCF8563的时间
void PCF8563_SetDateTime(uint8_t *buffer)
{
uint8_t bcd[7];
BuffertoBCD(buffer, bcd, 7); // 将Buffer转换为BCD
bcd[0] &= 0x7F; // 清除时钟暂停位
HAL_I2C_Mem_Write(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, bcd, 7, HAL_MAX_DELAY);
}
// 读取PCF8563的时间
void PCF8563_ReadDateTime(uint8_t *buffer)
{
uint8_t bcd[7];
HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, bcd, 7, HAL_MAX_DELAY);
BCDtoBuffer(bcd, buffer, 7); // 将BCD转换为Buffer
}
int main(void)
{
// ...
uint8_t dateTimeBuffer[7];
// 设置PCF8563的时间为2023年6月1日 12:34:56
dateTimeBuffer[0] = 56; // 秒(BCD格式)
dateTimeBuffer[1] = 34; // 分钟(BCD格式)
dateTimeBuffer[2] = 12; // 小时(BCD格式)
dateTimeBuffer[3] = 1; // 日(BCD格式)
dateTimeBuffer[4] = 6; // 月(BCD格式)
dateTimeBuffer[5] = 23; // 年(BCD格式)
dateTimeBuffer[6] = 0; // 星期几(BCD格式)
// 设置PCF8563的时间
PCF8563_SetDateTime(dateTimeBuffer);
// 读取PCF8563的时间和日期
PCF8563_ReadDateTime(dateTimeBuffer);
// 处理读取的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2022-06-24 lwip框架示意图