Здравствуйте
Начал работать с STM32L152CB. Решил тактировать внутренний rtc от внешнего кварца HCE.
Использую кварц частотой 9830400Гц - ABM2 и программирую делитель на 16
Код
void RTC_Config(void)
{
RTC_InitTypeDef RTC_InitStructure;
ErrorStatus err;
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_RTCAccessCmd(ENABLE);
RCC_RTCResetCmd(ENABLE);
RCC_RTCResetCmd(DISABLE);
RCC_RTCCLKCmd(DISABLE);
#if defined(LSE_CLOCK_RTC)
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSI is ready */
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#elif defined(LSI_CLOCK_RTC)
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#elif defined(HSE_CLOCK_RTC)
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div16);
#else
#error "Error define please RTC_CLK_SRC!"
#endif
#if defined(HSE_CLOCK_RTC)
RTC_InitStructure.RTC_AsynchPrediv = (uint32_t)0x7F;
RTC_InitStructure.RTC_SynchPrediv = (uint32_t)0x12BF; /* ((9830400 /16) / (127+1)) = 4800 = (4800-1)*/
#else
/* Calendar Configuration with LSI supposed at 32KHz */
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF; /* (32KHz / 128) - 1 = 0xFF*/
#endif
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
if(!RTC_Init(&RTC_InitStructure)){
TRACE_ERROR("RTCInit prescaler Error \r\n");
}else{
TRACE_INFO("RTCInit prescaler SUCCESS\n\r");
}
/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();
}
Но почему-то после инициализации часы идут раз в 10 быстрее
Непонятно вобщем что делаю не так.
И второе...
При работе с USART1 (пока только с ним и работал), если отправлять байты в прерывании по флагу USART_IT_TXE, целым приходит только первый байт из всей посылки, а если по флагу USART_IT_TC то все нормально, вобщем
вот так работает
Код
if(USART_GetITStatus(hw->us_base, USART_IT_TC) == SET) {
//USART_ClearITPendingBit(hw->us_base, USART_IT_TC);
if(pUs->state == US_ST_SENDFRAME) {
pUs->tx.num++;
// add next char to port
if(pUs->tx.num == pUs->tx.size) {
//USART_ITConfig(hw->us_base, USART_IT_TC, ENABLE);
USART_ITConfig(hw->us_base, USART_IT_TC, DISABLE);
USART_ClearITPendingBit(hw->us_base, USART_IT_TC);
//pUs->state = US_ST_OK;
} else {
USART_SendData(hw->us_base , pUs->tx.buf[pUs->tx.num]);
USART_ClearITPendingBit(hw->us_base, USART_IT_TC);
//return;
}
} else {
//USART_SendData(hw->us_base , pUs->tx.buf[pUs->tx.num]);
//USART_ITConfig(hw->us_base, USART_IT_TXE, DISABLE);
}
}
а вот так нет
Код
if(USART_GetITStatus(hw->us_base, USART_IT_TXE) == SET) {
//USART_ClearITPendingBit(hw->us_base, USART_IT_TC);
if(pUs->state == US_ST_SENDFRAME) {
pUs->tx.num++;
// add next char to port
if(pUs->tx.num >= pUs->tx.size) {
USART_ITConfig(hw->us_base, USART_IT_TC, ENABLE);
USART_ITConfig(hw->us_base, USART_IT_TXE, DISABLE);
} else {
USART_SendData(hw->us_base , pUs->tx.buf[pUs->tx.num]);
//USART_ClearITPendingBit(hw->us_base, USART_IT_TXE);
}
} else {
//USART_SendData(hw->us_base , pUs->tx.buf[pUs->tx.num]);
USART_ITConfig(hw->us_base, USART_IT_TXE, DISABLE);
}
}
причем предыдущий кусок у меня работал на stm32F207
Заранее благодарю за ответы.