参考链接:https://download.csdn.net/download/xqw19891201/11267260
#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);
// 处理读取的
标签:HAL,dateTimeBuffer,uint8,stm32,hi2c,I2C,PCF8563 From: https://www.cnblogs.com/hzijone/p/17501718.html