2022-04-04 02:46 AM
I'm using STM32G070KBT6 controller.
I'm trying to use external RTC and External RTC were ( DS1341). i2c based RTC.
Here is my code
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// Convert normal decimal numbers to binary coded decimal
uint8_t decToBcd(int val)
{
return (uint8_t)( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
int bcdToDec(uint8_t val)
{
return (int)( (val/16*10) + (val%16) );
}
typedef struct {
uint8_t seconds;
uint8_t minutes;
uint8_t hour;
uint8_t dayofweek;
uint8_t dayofmonth;
uint8_t month;
uint8_t year;
} TIME;
TIME time;
// function to set time
void Set_Time (uint8_t sec, uint8_t min, uint8_t hour, uint8_t dow, uint8_t dom, uint8_t month, uint8_t year)
{
uint8_t set_time[7];
set_time[0] = decToBcd(sec);
set_time[1] = decToBcd(min);
set_time[2] = decToBcd(hour);
set_time[3] = decToBcd(dow);
set_time[4] = decToBcd(dom);
set_time[5] = decToBcd(month);
set_time[6] = decToBcd(year);
HAL_I2C_Mem_Write(&hi2c1, DS1341_ADDRESS_Write, 0x00, 1, set_time, 7, 1000);
}
void Get_Time (void)
{
uint8_t get_time[7];
HAL_I2C_Mem_Read(&hi2c1, DS1341_ADDRESS_Write, 0x00, 1, get_time, 7, 1000);
time.seconds = bcdToDec(get_time[0]);
time.minutes = bcdToDec(get_time[1]);
time.hour = bcdToDec(get_time[2]);
time.dayofweek = bcdToDec(get_time[3]);
time.dayofmonth = bcdToDec(get_time[4]);
time.month = bcdToDec(get_time[5]);
time.year = bcdToDec(get_time[6]);
}
/* USER CODE END 0 */
int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
Set_Time(03, 05, 7, 5, 4, 2, 22);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
Get_Time();
printf("\n Time : %02d:%02d:%02d", time.hour, time.minutes, time.seconds);
printf("\n Time : %02d-%02d-20%02d", time.dayofmonth, time.month, time.year);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Here is the dock light output
Time : 10:164:13 --> 164 acts as a sec
Time : 00-00-2000
Time : 11:00:16
Time : 40-00-2000
Time : 11:02:24
Time : 00-00-2000
My issues are:
Please, let me know my mistakes to learn from this.
Thanks in advance for your time and support
2022-04-04 03:54 AM
shouldn't you enable LSE for RTC sake?