Witam, jakiś czas temu założyłem temat dotyczący komunikacji uC z DS1307 za pomocą I2C (https://www.elektroda.pl/rtvforum/topic1812072.html) jako że nie udało mi się tego zrobić aż do teraz - a potrzebuję RTC na gwałt, postanowiłem uruchomić wewnętrzny RTC.
Przeglądałem kilka przykładów (w tym te od ST, oraz przykłady z książki o STM32 od Pana Paprockiego). I niestety nie mogę włączyć oscylatora LSE. Szczerze mówiąc nie wiem dlaczego. Postępowałem zgodnie z instrukcjami - dodałem odpowiednie komendy dotyczące RCC, NVIC (docelowo, przerwanie od RTC co sekundę) ustawiłem preskaler itd. Niestety kontroler zatrzymuję się w niżej zaznaczony miejscu.
Próbowałem zmieniać podłączone oscylatory - i przy LSI oraz HSE/128 debuger zatrzymuje się na "RTC_WaitForSynchro();"
Jeśli ktoś spotkał się z tym problemem - i wie jak temu zaradzić, proszę o porady.
Pozdrawiam Dominik
Ustawienia RTC oraz kolejność inicjalizacji:
Pozostałe:
Dodatkowe info:
Atollic TrueSTUDIO + (ST-Link) + płyta z stm32f103VB
Przeglądałem kilka przykładów (w tym te od ST, oraz przykłady z książki o STM32 od Pana Paprockiego). I niestety nie mogę włączyć oscylatora LSE. Szczerze mówiąc nie wiem dlaczego. Postępowałem zgodnie z instrukcjami - dodałem odpowiednie komendy dotyczące RCC, NVIC (docelowo, przerwanie od RTC co sekundę) ustawiłem preskaler itd. Niestety kontroler zatrzymuję się w niżej zaznaczony miejscu.
Próbowałem zmieniać podłączone oscylatory - i przy LSI oraz HSE/128 debuger zatrzymuje się na "RTC_WaitForSynchro();"
Jeśli ktoś spotkał się z tym problemem - i wie jak temu zaradzić, proszę o porady.
Pozdrawiam Dominik
Ustawienia RTC oraz kolejność inicjalizacji:
Cytat:
void RTC_Configuration(void)
{
// Wlaczenie oscylatora LSE
/* oraz inne próby
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
// LSE bedzie zrodlem sygnalu zegarowego dla RTC
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
*/
//RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); // PRÓBA Z LSI
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); // ORAZ Z HSE/128
// Wlaczenie taktowania RTC
RCC_RTCCLKCmd(ENABLE);
// Czekaj na synchronizacje
RTC_WaitForSynchro();
// Czekaj na zakonczenie operacji
RTC_WaitForLastTask();
// Wlacz przerwanie od RTC (co 1s)
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
// Okres RTC bedzie wynosil 1s
RTC_SetPrescaler(32767); // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
RTC_WaitForLastTask();
}
void SystemInit2(void) // tutaj pokazana kolejnosc
{
RCC_Configuration();
NVIC_Configuration();
EXTI_Configuration();
GPIO_Configuration();
RTC_Configuration();
}
Pozostałe:
Cytat:
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit(); // reset ustawień RCC
RCC_HSEConfig(RCC_HSE_ON); // Wlacz HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //czekaj az HSE bedzie gotowy
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2); // tu 0 na 2
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
} /* else { } */
// WŁĄCZAM PORTY GPIO:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
//WŁĄCZAM RCC DLA DRUGICH OPCJI PORTÓW.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
RCC_ClearFlag();
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
// TODO Wlacz przerwanie od IRQ4 (PA4)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// TODO WLACZ PRZERWANIE OD RTC
// Ustalenie grupy przerwan
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// Wlacz przerwanie od RTC
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
}
Dodatkowe info:
Atollic TrueSTUDIO + (ST-Link) + płyta z stm32f103VB