Я тоже не профессионал, но могу поделиться своей инициализацией. Частота системная 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МГц в переменной, то получим уже значительно бОльший интервал.
Таймер считает? Глобальное разрешение прерываний включено? Обработчик прерывания имеет правильное имя?
Проблема была в 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 байт.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения