Hi All,
We are using the STM8L050J3 chip and trying to get time using an internal RTC with LSI. We are getting some responses but are not sure what it is. Here is our result (TIME: 3108:4877:2644) and code. We are using the cosmic compiler. Could anyone help me make it correct and point out where the issue is? All support is hugely appreciated.
Code:
#include "stm8l15x.h"
#include <stdio.h>
#ifdef _COSMIC_
#define ASM _asm
#endif
#ifdef _IAR_
#define ASM asm
#endif
#define STARTUP_SWIM_DELAY_5S \
{ \
ASM(" PUSHW X \n" \
" PUSH A \n" \
" LDW X, #0xFFFF \n" \
"loop1: LD A, #50 \n" \
\
"loop2: DEC A \n" \
" JRNE loop2 \n" \
\
" DECW X \n" \
" JRNE loop1 \n" \
\
" POP A \n" \
" POPW X " );\
}
uint8_t i;
// Simple delay
void delay_ms(uint16_t ms) {
uint32_t i;
while (ms--) {
for (i = 0; i < 1600; i++);
}
}
// Redirect printf to UART
void UART1_Init_Custom(void) {
CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
USART_Init(USART1, 9600, USART_WordLength_8b, USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx |USART_Mode_Tx));
USART_Cmd(USART1, ENABLE);
}
void RTC_Init_Custom(void) {
RTC_InitTypeDef rtc_init;
RTC_TimeTypeDef time;
RTC_DateTypeDef date;
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1 );
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
RTC_WakeUpCmd(DISABLE);
RTC_EnterInitMode();
// Configure RTC prescalers for LSI (~38 kHz)
RTC_StructInit(&rtc_init);
rtc_init.RTC_HourFormat = RTC_HourFormat_24;
// LSI ~38kHz ? we need to divide to get 1Hz
// 38,000 / (PrescalerA + 1)(PrescalerS + 1) = 1
// Try 37 * 1024 = 37888 ~ 1Hz
rtc_init.RTC_AsynchPrediv = 36; // divide by 37
rtc_init.RTC_SynchPrediv = 1023; // divide by 1024
RTC_Init(&rtc_init);
// Set time: 12:34:56
RTC_TimeStructInit(&time);
time.RTC_Hours = 12;
time.RTC_Minutes = 34;
time.RTC_Seconds = 56;
RTC_SetTime(RTC_Format_BIN, &time);
// Set date: 11 April 2025 (Friday)
RTC_DateStructInit(&date);
date.RTC_WeekDay = 5;
date.RTC_Date = 11;
date.RTC_Month = 4;
date.RTC_Year = 2025;
RTC_SetDate(RTC_Format_BIN, &date);
RTC_ExitInitMode();
RTC_WaitForSynchro();
}
void UART1_SendStr(char* str)
{
while (*str)
{
USART_SendData8(USART1, *str++);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
delay_ms(1);
}
}
void print_current_datetime(void) {
RTC_TimeTypeDef time;
RTC_DateTypeDef date;
char buffer[128];
RTC_GetTime(RTC_Format_BIN, &time);
RTC_GetDate(RTC_Format_BIN, &date);
printf("Date: 20%02d-%02d-%02d\n", date.RTC_Year, date.RTC_Month, date.RTC_Date);
sprintf(buffer, "\r\nTIME: %02d:%02d:%02d\r\n",(uint8_t)time.RTC_Hours,(uint8_t)time.RTC_Minutes,(uint8_t)time.RTC_Seconds);
UART1_SendStr(buffer);
//USART_SendData8(time.RTC_Hours);
// USART_SendData8('\r');
printf("Time: %02d:%02d:%02d\n", time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds);
}
void main(void) {
STARTUP_SWIM_DELAY_5S;
//delay_ms(1000);
GPIO_Init(GPIOC, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); // TxD: output
GPIO_Init(GPIOA, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); //
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
UART1_Init_Custom();
RTC_Init_Custom();
printf("RTC Initialized.\n");
while (1) {
USART_SendData8(USART1,0x41);
delay_ms(1000);
print_current_datetime();
}
}
/*
and output is:
////OUTPUT /////
TIME: 3107:13069:2644
A
TIME: 3107:14861:2644
A
TIME: 3108:1293:2644
A
TIME: 3108:3085:2644
A
TIME: 3108:4877:2644
*/