/* USER CODE BEGIN Header *//********************************************************************************* @file i2c.h* @brief This file contains all the function prototypes for* the i2c.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* USER CODE END Header *//* Define to prevent recursive inclusion -------------------------------------*/#ifndef__I2C_H__#define__I2C_H__#ifdef__cplusplusextern"C"{#endif/* Includes ------------------------------------------------------------------*/#include"main.h"/* USER CODE BEGIN Includes */#include"i2c_clock_pcf8563.h"#definePCF8563_ADDRESS0xA2/* USER CODE END Includes */extern I2C_HandleTypeDef hi2c1;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */voidMX_I2C1_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef__cplusplus}#endif#endif/* __I2C_H__ */
源文件
/* USER CODE BEGIN Header *//********************************************************************************* @file i2c.c* @brief This file provides code for the configuration* of the I2C instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include"i2c.h"/* USER CODE BEGIN 0 */bool pcf8563_read_reg(pcf8563_driver_t* drv,uint8_t reg,uint8_t* data,uint8_t data_size);
bool pcf8563_write_reg(pcf8563_driver_t* drv,uint8_t reg,constuint8_t* data,uint8_t data_size);pcf8563_driver_t pcf8563_driver ={.addr = PCF8563_ADDRESS,.op ={.read_reg = pcf8563_read_reg,.write_reg = pcf8563_write_reg,},};/* USER CODE END 0 */I2C_HandleTypeDef hi2c1;/* I2C1 init function */voidMX_I2C1_Init(void){/* USER CODE BEGIN I2C1_Init 0 *//* USER CODE END I2C1_Init 0 *//* USER CODE BEGIN I2C1_Init 1 *//* USER CODE END I2C1_Init 1 */hi2c1.Instance = I2C1;hi2c1.Init.Timing =0x10D19CE4;hi2c1.Init.OwnAddress1 =0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 =0;hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if(HAL_I2C_Init(&hi2c1)!= HAL_OK){Error_Handler();}/** Configure Analogue filter*/if(HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE)!= HAL_OK){Error_Handler();}/** Configure Digital filter*/if(HAL_I2CEx_ConfigDigitalFilter(&hi2c1,0)!= HAL_OK){Error_Handler();}/* USER CODE BEGIN I2C1_Init 2 */if(pcf8563_driver_init(&pcf8563_driver)){// printf("PCF8563 init success\r\n");#defineTIMESTAMP_START_VALUE1746250282Utime_t rtc_time;pcf8563_get_time(&rtc_time);if(rtc_time<TIMESTAMP_START_VALUE){rtc_time = TIMESTAMP_START_VALUE;pcf8563_set_time(&rtc_time);}}/* USER CODE END I2C1_Init 2 */}voidHAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){GPIO_InitTypeDef GPIO_InitStruct ={0};RCC_PeriphCLKInitTypeDef PeriphClkInit ={0};if(i2cHandle->Instance == I2C1){/* USER CODE BEGIN I2C1_MspInit 0 *//* USER CODE END I2C1_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)!= HAL_OK){Error_Handler();}__HAL_RCC_GPIOA_CLK_ENABLE();/**I2C1 GPIO ConfigurationPA9 ------> I2C1_SCLPA10 ------> I2C1_SDA*/GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);/* I2C1 clock enable */__HAL_RCC_I2C1_CLK_ENABLE();/* USER CODE BEGIN I2C1_MspInit 1 *//* USER CODE END I2C1_MspInit 1 */}}voidHAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle){if(i2cHandle->Instance == I2C1){/* USER CODE BEGIN I2C1_MspDeInit 0 *//* USER CODE END I2C1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_I2C1_CLK_DISABLE();/**I2C1 GPIO ConfigurationPA9 ------> I2C1_SCLPA10 ------> I2C1_SDA*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);/* USER CODE BEGIN I2C1_MspDeInit 1 *//* USER CODE END I2C1_MspDeInit 1 */}}/* USER CODE BEGIN 1 */bool pcf8563_read_reg(pcf8563_driver_t* drv,uint8_t reg,uint8_t* data,uint8_t data_size){HAL_StatusTypeDef status =HAL_I2C_Mem_Read(&hi2c1, drv->addr, reg,I2C_MEMADD_SIZE_8BIT, data, data_size, HAL_MAX_DELAY);if(status != HAL_OK){return false;}return true;}bool pcf8563_write_reg(pcf8563_driver_t* drv,uint8_t reg,constuint8_t* data,uint8_t data_size){const HAL_StatusTypeDef status =HAL_I2C_Mem_Write(&hi2c1,drv->addr, reg, I2C_MEMADD_SIZE_8BIT,data, data_size,HAL_MAX_DELAY);if(status != HAL_OK){return false;}return true;}/* USER CODE END 1 */
FreeRTOS测试
voidStartDefaultTask(void* argument){/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */time_t time;for(;;){// printf("hello\n");if(pcf8563_get_time(&time)){printf("time: %ld\n",(uint32_t)time);}osDelay(1000);}/* USER CODE END StartDefaultTask */}