Я тоже не профессионал, но могу поделиться своей инициализацией. Частота системная 48 МГц, но это вы уже сами поправите при желании. Сравните со своей. Спойлер
Код:
void init (void) { unsigned long HSEStatus; unsigned int StartUpCounter;
/* Wait till HSE is ready and if Time out is reached exit */ StartUpCounter = 0; do { HSEStatus = (RCC->CR & RCC_CR_HSERDY); // Выделение бита HSEREADY StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
1. Между настройкой татового генератора и использованием переменной SystemCoreClock, не вижу вызова SystemCoreClockUpdate(), иначе там будет 8000000 (стандартная константа). 2. Кажется, немного не так должен настраиваться предделитель. (8000000) / 720 - 1 = 11110. ARR = 10000 Переполнение таймера произойдёт через: (10000 * 11110) / 72000000 (тактовая частота) ~ 1,54секунды. Ну это не столь критично.
3. Вроди бы... если правильно помню, лучше явно указывать значение. TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN;
А если 72МГц в переменной, то получим уже значительно бОльший интервал.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя?
Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup.. Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно?
Проблема была в c++, почему то g++ компилятор не переваривает вектор прерывания в startup.. Собственно отсюда следующий вопрос - как писать на плюсах под cmsis ? неужели надо отказаться от ООП и писать процедурно?
Насколько я понимаю проблема в банальном отсутствии extern "C"...
Насколько я понимаю проблема в банальном отсутствии extern "C"...
Код:
extern "C" void SysTick_Handler() { }
Хотя если стартап на С++, то это не нужно.
стартап на ассемблере .s
пишет: startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и main -> while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s
К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме
startup_stm32.o:(.isr_vector+0xb0): undefined reference to `TIM2_IRQHandler'
что бы повторить эту ошибку у себя, достаточно создать пустой проект с функцией прерывания и while(1) { }, переименовать main.c в .cpp - ну и добавить вектор в .s
К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Reflector писал(а):
К счастью я такое повторить не могу, т.к. давно не пользуюсь стартапами на ассме
Для STM32 первая часть стартапа всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта.
V2oD2o писал(а):
TIM2->ARR = 10000;
А в регистр ARR надо помещать число, на единицу меньше требуемого, поскольку счетчик таймера считает от нуля до содержимого ARR включительно. И, если там будет 10000, прерывание произойдет после 10001-го импульса, а не после 10000-го. В руководстве об этом написано несколько невнятно, тем не менее это так. На остальные косяки, вроде-бы, уже указали...
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Для STM32 первая часть стартапа всегда на асме, написана специалистами MCD Application Team. Для обсуждаемых здесь STM32F10x (x=1..7) их там аж целых три варианта
Прям таки всегда? И что же мешает написать стартап на С или даже С++?
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Вероятно тот факт, что ни в простом, ни в приплюснутом Си не существует нормальных средств положить в начало флеш-памяти программ таблицу векторов. Этот асмовый стартап, собственно и состоит из таблицы векторов и набора заглушек для тех векторов, которые не будут использоваться, чтобы линкер не обиделся на отсутствующие внешние ссылки. А чтобы он не обиделся на повторное объявление внешней ссылки, заглушки в стартапе объявлены слабыми (WEAK). Кстати, и этой возможности в Си я что-то не припомню...
А дальше - вызов SystemInit , переход к __main, и всё! Предложенные MCD Application Team варианты этих программ написаны на простом СИ, для приплюснутого Си в них предусмотрено extern "C" { ... } посредством условной компиляции. SystemInit содержит несколько вариантов тех самых действий, которые V2oD2o показал под комментарием /* CLOCK */, а __main производит необходимую настройку и вызывает main(). Собственно, никто не мешает написать свой вариант этих программ, но зачем? Разве что потренироваться, как это делает топикстартер...
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Плагин для Visual Studio VisualGDB из коробки создает проекты где стартап на Си и никаких в проекте асм файлов. положить в начало флеш-памяти программ таблицу векторов делает типа так:
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Круто! Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Плагин для Visual Studio VisualGDB из коробки создает проекты где стартап на Си и никаких в проекте асм файлов.
Я VisualGDB и юзаю, причем у меня стартап переписан на С++ и никакие extern "C" я не добавляю. Разницы в размере бинарника относительно С естественно нет.
Круто! Но, тем не менее, специалисты из MCD Application Team предпочли написать стартап на асме. Кстати, поразглядывал в отладчике код __main (исходника не нашел, да не очень-то и искал), похоже, он тоже на асме, слишком уж там навороченные операции с регистрами производятся, в дизасме сишного кода мне такое, вроде-бы, не попадалось, хотя точно не скажу.
Нету там ничего на ассме, можно пройтись пошагово отладчиком и убедиться. Единственная функция __libc_init_array() которая вызывается из прекомпилированной либы написана на С, при отладке автоматически скачиваются ее сорсы и можно заходить и в нее тоже.
Понятно, что в Keil и большинстве других сред все на ассме, но мы тут обсуждали саму возможность написания стартапов на С/С++. Это возможно, причем без приложения каких-то сверхусилий. Получается компактный и понятный код который легко модифицировать и именно это должно быть в приоритете, а не желание сэкономить на стартапе 10 байт.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения