Полная версия этой страницы:
Проблема с stm32f103vc
Может кто подскажет в какую сторону смотреть.
Написал программу на C++ под иар 5.50 отладил всё в ОЗУ. Собрался отдавать заказчику, прошил всё во внутренний флэш и получил полный ступор!!!
То есть, программа работает, но периодически вылетает в хардфаулт. В ОЗУ всё работает часами! Все опции компилятора одинаковые, уже и листинги все проверил, один к одному с версией в ОЗУ. Единственное, что сразу удалось обнаружить, что программа из флеш работает как минимум в два раза быстрее чем из ОЗУ.
Уже неделю бьюсь не могу понять чем работа во флеши так радикально отличается от работы в ОЗУ.
Может хоть направления поиска кто даст, куда смотреть. Ерату читал ничего криминального не обнаружил.
AHTOXA
May 11 2010, 18:12
Возможно неверно настроены waitstate для выполнения из флеша. Посмотрите инициализацию регистра FLASH->ACR. (Или с каким параметром вызывается FLASH_SetLatency()).
Да нет настройки вроде все правильные.
Вот кусок кода:
void RCC_Configuration(void)
{
/* Setup the microcontroller system. Initialize the Embedded Flash Interface,
initialize the PLL and update the SystemFrequency variable. */
RCC_DeInit();
// Enable external crystal generator
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) {
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2
RCC_MCOConfig(RCC_MCO_PLLCLK_Div2); // MCO output frequency configure
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADCCLK = PCLK2/6
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8); // PLLCLK = 7.3728MHz * 8 = 58.98 MHz
RCC_PLLCmd(ENABLE); // Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //* Wait till PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source
while(RCC_GetSYSCLKSource() != 0x08); // Wait till PLL is used as system clock source
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // DMA clock enable
...
Частота кварца 7372800
У меня ситуация подобная, только еще хуже. STM32F103, есть устройства на внешней шине, в том числе, контроллер ЖКИ. В симуляторе Keil как-то проходит программа. Только когда обращаюсь к контроллеру ЖКИ, почему-то останавливается и идет только по-шагам. В микроконтроллер с помощью ULINK-ME зашивается, верификация проходит. И генератор на 8 MHz запускается. Но дальше - никаких признаков жизни, в отладчике вываливается в Hard Fault. Даже не дойдя до инициализации ЖКИ.
Боюсь и спрашивать... Тут такие "монстры ARM"...
AHTOXA
May 11 2010, 19:10
Цитата(ex51 @ May 12 2010, 00:34)

Да нет настройки вроде все правильные.
Да, вроде ничего криминального. Значит копайте глубже. Вот
полезная тема. Доставайте адрес инструкции, вызвавшей HardFault, и анализируйте. Чудеса случаются, но не с нами

Цитата(ViKo @ May 12 2010, 00:48)

У меня ситуация подобная, только еще хуже.
Вам совет точно такой же.
Глядя в приведенный выше код, понял, что, кажется, я кое-чего не дописал в RCC.
Спасибо! Теперь направление, куда рыть, определилось.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.