ex51 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Может кто подскажет в какую сторону смотреть. Написал программу на C++ под иар 5.50 отладил всё в ОЗУ. Собрался отдавать заказчику, прошил всё во внутренний флэш и получил полный ступор!!! То есть, программа работает, но периодически вылетает в хардфаулт. В ОЗУ всё работает часами! Все опции компилятора одинаковые, уже и листинги все проверил, один к одному с версией в ОЗУ. Единственное, что сразу удалось обнаружить, что программа из флеш работает как минимум в два раза быстрее чем из ОЗУ. Уже неделю бьюсь не могу понять чем работа во флеши так радикально отличается от работы в ОЗУ. Может хоть направления поиска кто даст, куда смотреть. Ерату читал ничего криминального не обнаружил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Возможно неверно настроены waitstate для выполнения из флеша. Посмотрите инициализацию регистра FLASH->ACR. (Или с каким параметром вызывается FLASH_SetLatency()). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ex51 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Да нет настройки вроде все правильные. Вот кусок кода: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба У меня ситуация подобная, только еще хуже. STM32F103, есть устройства на внешней шине, в том числе, контроллер ЖКИ. В симуляторе Keil как-то проходит программа. Только когда обращаюсь к контроллеру ЖКИ, почему-то останавливается и идет только по-шагам. В микроконтроллер с помощью ULINK-ME зашивается, верификация проходит. И генератор на 8 MHz запускается. Но дальше - никаких признаков жизни, в отладчике вываливается в Hard Fault. Даже не дойдя до инициализации ЖКИ. Боюсь и спрашивать... Тут такие "монстры ARM"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Да нет настройки вроде все правильные. Да, вроде ничего криминального. Значит копайте глубже. Вот полезная тема. Доставайте адрес инструкции, вызвавшей HardFault, и анализируйте. Чудеса случаются, но не с нами:) У меня ситуация подобная, только еще хуже. Вам совет точно такой же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Глядя в приведенный выше код, понял, что, кажется, я кое-чего не дописал в RCC. Спасибо! Теперь направление, куда рыть, определилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться