Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Траблы с STR91xFA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Aprox
Hесмотря на значительное вычищение багов периферии при переходе с STR91xF на FA, остались неприятности( подозреваю) со всей периферией, которая может работать ассинхронно к такту процессора и шин, к которым подключена периферия. В настоящий момент траблы выявлены при прерываниях от узла ENET и RTC.

1. RTC. При попытке сбросить флаг периодического прерывания в ISR описанным в мануале приемом (чтение SR), флаг запроса ничуть не сбрасывается. Чтобы его сбросить, нужно применить шаманский прием, найденный AlexanrY на "сахара". Т.е. переделать подпрограмму RTC_ClearFlag 91x_rtc.c библиотеки. Она должна выглядеть так:
Цитата
void RTC_ClearFlag(u32 RTC_FLAG)
{
vu32 tmp;
if (RTC_FLAG == RTC_FLAG_Per){
tmp= RTC->CR;
RTC->CR&=~0x0F0000;// clear prediv
if(RTC->SR);
RTC->CR =tmp;// restore prediv
}
else if (RTC_FLAG == RTC_FLAG_Alarm) RTC->CR&=~0x100000;
else if (RTC_FLAG == RTC_FLAG_Tamper) RTC->CR&=~0x1;
}


2. ENET. Периодически генерит так называемые Spurious Interrupts. Если не инициализировать DefaultVector в VIC, то приложение будет спорадически ресетиться и трудно понять почему. Способ борьбы также шаманский- создать в 91x_it.c пустой обработчик Spurious Interrupts и направить на него DefaultVector .
Цитата
void Spurious_Interrupts_Handler()
{//--------------------------
VIC0->VAR = 0xFF;
VIC1->VAR = 0XFF;
}

Запускать VIC в работу так
Цитата
void VIC_Init()
{//------
SCU_AHBPeriphClockConfig(__VIC, ENABLE);
VIC_DeInit();
VIC0->DVAR = (u32)Spurious_Interrupts_Handler;
VIC1->DVAR = (u32)Spurious_Interrupts_Handler;
//.....any else......
}
Aprox
Еще в копилку неприятностей, но уже с библиотекой 91x_enet.c Суть- предложенная подпрограмма инициализации ENET не устанавливает полный дуплекс и 100Mb, когда к ней обращаешься строкой
Цитата
ENET_Init (PHY_FULLDUPLEX_100M);
Убил два дня, разбираясь, почему на фоне сплошного потока передаваемых из устройства пакетов, все пакеты на прием обрываются и дают RUNT ошибку. После досконального обследования регистров PHY обнаружил, что стандартная библиотека врет и вместо полного дуплекса устанавливает полудуплекс и поэтому коллизии. Вылечено было введением процесса Auto-Negotiation с проверкой по его завершению, что установлен именно PHY_FULLDUPLEX_100M.

В целом же, впечатление от STM StdLib все мрачнее и мрачнее. Похоже каждый модуль периферии потребует влезания в подробности и исправления чужих багов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.