Делаю часы на stm32. использую плату stm32discovery Задействовал часовой кварц, настроил для него прерывания и моргаю синим светодиодом раз в секунду. Теперь хочу подключить lcd nokia 3310. Запускаю через eclipse отладку (для отладки используется st-link gdb server) На каком-то этапе отладчик отваливается, а плата продолжает жизнерадостно моргать. Подозреваю что дело в задержках в реальном времени, которые отладчик естественно не может отследить и поэтому отваливается.
Какие есть способы отлаживать программу в которой есть такие особенности? (к отладке приема данных по интерфейсам наверно тоже относится. как дать понять отладчику что вот эту часть нужно прошагать, а на эту отпустить контроллер для к-н обработки?)
У меня нормально отлаживается stm32 но я пользуюсь другими отладчиками и средой программирования. Вполне возможно дело не в задержках, а что-то Вы намутили в проекте. Проблемы бывают, например, при неправильных таймингах флеши, при слишком активном обмене по DMA, при коротких циклах поллинга флагов периферии, при слишком высокой частоте тактирования jtag, при неправильной настройке AFIO GPIO на котором висит jtag, также возможно у Вас происходит банальный сброс по вачдогу или вылет по недопустимой инструкции. Возможны и аппаратные проблемы, если отлаживаемое устройство питается от отдельного импульсного БП без (или с плохим) EMI-фильтром на входе
А вачдог у вас в проекте используется? Если да, то его следует тормозить вместе с остальными таймерами чтобы не произошел сброс при входе в отладку.
Про EMI - правельно замечено. Сразу легче жить стало когда комп с дискавери начал питаться через хороший UPS. До этого работало через раз. Ну и версию IDE с драйвером на ST-link самую свежую.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Торможение таймеров при отладке на отваливание отладчика не влияет. Оно влияет, например, на переполнение таймеров и возникновение событий пока программа остановлена. Иногда это важно, иногда наоборот, в любом случае это не то, что Вы ищите.
Покажите свой код, может удастся увидеть потенциально ненадежные места
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Нашел место на котором отваливается дебагер выдает
Код:
ST_LINK Halt Reason halt requested by NVIC, including step Unknown(Err)
Отваливается когда доходит до функции delay_ms(100) и начинает в ней крутиться:
Код:
/* задержка в микросекундах * диапазон значений от 0x00000001 до 0x00FFFFFF/multiplier * работает на прерывании */ void delay_us(uint32_t us) { SysTick_Config(us*multiplier); __WFI(); //Wait for Interrupt. }
///* код для обработчика прерываний */ // //void SysTick_Handler(void) //{ // //для отключения счетчика, когда дойдет до 0, если не отключать, будет постоянно работать // /* // SysTick->CTRL=0x00000000; //отключение системного таймера // SysTick->VAL=0x00000000; //сброс текущего значения системного таймера // */ //}
/* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */ BKP_DeInit();
/* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}
/* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */ RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();
/* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */ //RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ RTC_SetPrescaler(16383); /* частота=32768/PrescalerValue+1 */
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); }
Ну так вы активируете СисТик, далее ждем прерывание. Прерывание появилось, а обрабочик, но он закомментирован. Процу только в HardFault и остается.
При разработке прог я юзаю болванку с обработчиками из пакета дискавери(не нужно вручную их прописывать). Только во все Fault-обработчики ставлю бесконечный цикл while(TRUE); Так сразу видно что сделал что-то не то.
Обработчик у меня не закомментирован, он в другом файле написан, тут я комментарий добавил чтобы не забыть как его использовать и заодно показать какой он. А с бесконечным циклом попробую, может в какое другое прерывание вываливается
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения