STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не страдай ерундой. Переводи весь проект в .сpp. С++ компилятор чисто С-ный код скомпилирует в лучшем виде. Стартап можешь в .с оставить, тогда перед обработчиками прерываний extern "C" поставишь да и всё..

ЗЫ: достаточно легко сделать, чтобы всё компилировалось и gcc, и iar, и даже keil.
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

А со стеком все в порядке? А некоторые системы под стек дефолтно дают мало места...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

та на стеке и не хранится ничего. все данные глобальные - либо буфферы, либо экземпляры класов. да и функция пустая. не должно переполняться. я к тому же пока не разбирался как здесь заполнение стека проверять (в иаре то попроще с этим - и граф шкала есть, да и предупреждение он выдает).
по совету знакомого, я сделал пустой проект с простенькой програмкой и смоделировал похожую ситуацию вызова внешней .срр функции - ничего не вывалилось. значит линковщик таки работает правильно и причина в чем-то другом.
проверял на дискавери, оригинальная железяка дома, к семи доберусь и буду ставить эксперименты.

Добавлено after 4 hours 41 minute 53 seconds:
ну я хз котаны - вместо того чтобы делать новый проект из кубовского файла, я создал чистый прямо в куб-идэе и руками перезабил всю инфу. сгенерил код, перенес все те же юзер файлы, скопипастил куски юзер кода и оно не падает.
пока что спортивного интереса копаться в чем же разница между проектами нет - может косяк в их коде, может у меня что-то было. Если повторяться не будет то и хрен с ним, а если будет то потрачу денек.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Ярослав555 писал(а):сгенерил код, перенес все те же юзер файлы, скопипастил куски юзер кода
Я в кубическом main() держу ровно две строчки (чтобы меньше копипастить).Между /* USER CODE BEGIN Init */ и /* USER CODE END Init */ вписываю что-то вроде My_Init(); и, между /* USER CODE BEGIN 2 */ и /* USER CODE END 2 */ - My_main(); причем, не уведомляя кубики, что из этого My_main() я не вернусь.

А, нет, три: еще между /* USER CODE BEGIN Includes */ и /* USER CODE END Includes */ ставлю #include "My_Header.h", в котором, в частности, описаны и My_Init(); и My_main();

И все. сгенерив новый кубический проект, по-простому, добавляю эти три строчки, и моя разработка подключена. А кубики - они такие. Однажды, после очередного обновления, посыпались какие-то ошибки. Перегенерил проект - все ОК. Оказалось, новый CubeMX криво воспринимал проект из-под старого. Еще что-то было... Да и перенести проект на новый камень - это самое простое решение - генеришь его заново, добавляешь эти самые 3 строчки, и вперед! Да, пару раз понадобилось что-то дописать куда-то в прерывающие программы, тоже вызовы своих программ. Чаще всего у кубических программ обслуживания прерываний заявлен коллбэк и его хватает, но где-то его не оказалось.

Добавлено after 22 minutes 14 seconds:
Да, и где-нибудь на видном месте (например, в начале My_Header.h), надо указать комментарием, в какие кубические файлы надо вписывать свои вызовы.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А вся инициализация периферии, обработчики прерываний - тоже свои, или сгенерированные?

P.S. А, сразу не увидел оговорку про прерывания. Точек связи сгенерированного кода со своим всё же больше трёх.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3785755#p3785755"]Точек связи сгенерированного кода со своим всё же больше трёх.[/uquote]
Почему? Колбеки редефайнятся в своем файле и возможно даже править не приходится.
По поводу мейна - у меня как-то сложилось что в мейне только начальная инициализация и запуск системного таймера. Дальше все остальное происходит через вызовы этого системного таймера. Мои объекты имеют функцию poll - в ней находится большой свич с описанием действий и переходов, рискну назвать это машиной состояний. Иногда даже две таких функций - быстрая и легкая (например простое сравнение) и медленная (математически нагруженная). Такая архитектура позволяет асинхронную работу частей программы, никто никого не ждет - есть состояние значит переход на новое состояние, нет - ретурн. Разные обьекты ставятся на разные таски - кто-то на 1 мС, кто-то на 100 мС.
Максимум что попадает в цикл мейна - мигание светодиодом, причем в последнее время я туда пакую софтверный шим для этого светодиода. По плавности мигания можно увидеть насколько ровно идет программа. Главный цикл имеет наинизший приоритет и если ему совсем времени не остается, значит и какой-то таск может захлебнуться. Для моих задач хватает, не атомные реакторы строю.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

То есть, *_it.c/h файлики, которые генерируются кубом, Вы просто не компилируете вообще?
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

Как это не компилирую? Компилирую. Просто обратите внимание что оригинальные Callback функции объявлены с директивой weak - слабые. Это по своему назначению и не функци вовсе, а так - заглушки. Совершенно законно можно определить Callback функцию с тем же именем у себя в файле, и компилятор возьмет именно ее, как более высшую по проритету. Лично я пока не экспериментировал с выносом Callback в отдельный файл, но спокойно пишу их в мейне в секции юзер кода. Там делаю свич по переданному параметру - таймер, юарт и т.д., и дальше передаю обработку по ветке в нужный объект.
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Пт дек 07, 2018 13:56:33

Сообщение neko »

Утречка всем.
Нужен STM32 F103C8T6 для ослика DSO138
нашел на али чипы с припиской
LQFP48 и QFP48 QFP
что это значит и подойдут ли такие?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

это тип корпуса. STM32 F103C8T6 сущевствуют только в LQFP48. Думаю китайцы не вдавались в детали описания и это все одни и те же чипы.
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Пт дек 07, 2018 13:56:33

Сообщение neko »

Спасибо, прикупил
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

STM32F103C8T6. Запустил ШИМ на таймере 1, Ок. Пытаюсь запустить на таймере 2 шим 1 - на выходе РА15 глухо. Подскажите плиз где чего я неправильно сделал:
Спойлер

Код: Выделить всё

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Timer 2 clock enabled
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | // Enabled Alternate Function I/O clock
                             RCC_APB2ENR_IOPAEN; // Enabled Clock GPIO A

AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE |     // Disable JTAG
	             AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1; // Partial remap Timer 2 

GPIOA->CRH =  GPIO_CRH_MODE15_1 | // Output Push-Pull max speed 2 MHz
                         GPIO_CRH_CNF15_1;   // AFO Push-Pull

TIM2->PSC = 359; // Prescaller 16 bit
TIM2->ARR = 0xFFFF;  // Value Auto Reload Register
TIM2->CCR1 = 0x0FFF; // TIM2 capture/compare register 1

TIM2->CCER |= TIM_CCER_CC1E | // Compare 1 output enable
                        TIM_CCER_CC1P;  // Compare 1 output polarity
	
TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; //PWM mode 1, channel 1 Ouput

TIM2->CR1 = TIM_CR1_ARPE | // Auto-reload preload enable
	            TIM_CR1_URS;   // Update request source
	
TM2->CR2 = 0x00;
	
TIM2->DIER = 0; Update interrupt enable
	
TIM2->CR1 |= TIM_CR1_CEN; // Counter enable

Исправил код, добавил remap чтобы всё было в одном месте - не помогло.
Последний раз редактировалось Frogfot Сб фев 15, 2020 12:08:01, всего редактировалось 5 раз.
Хорошему коту и в декабре - март :)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3791101#p3791101"]Пытаюсь запустить на таймере 2 шим 1 - на выходе РА11 глухо.[/uquote]
Во-первых, не PA11, а PA15 который у тебя и настраивается. Во-вторых, этот пин находится в колонке Remap, а его то ты и не делаешь(AFIO->MAPR).
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Reflector",url="/forum/viewtopic.php?p=3791107#p3791107"][uquote="Frogfot",url="/forum/viewtopic.php?p=3791101#p3791101"]Пытаюсь запустить на таймере 2 шим 1 - на выходе РА11 глухо.[/uquote]
Во-первых, не PA11, а PA15 который у тебя и настраивается. Во-вторых, этот пин находится в колонке Remap, а его то ты и не делаешь(AFIO->MAPR).[/uquote]
Ок, спасибо, сейчас исправлю. На РА 11 запускал с таймера 1 выход 4, забыл исправить, а ремап упустил из вида.

Типа так?

Код: Выделить всё

AFIO->MAPR = AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1; // Partial remap Timer 2 
Добавлено after 9 hours 18 minutes 59 seconds:
2 Reflector: исправил, всё равно нет ШИМа на выходе. Где-то ещё одна собака порылась :) А может и не одна.
Хорошему коту и в декабре - март :)
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

у таймера, что касается канала все перепроверь
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="a797945",url="/forum/viewtopic.php?p=3791211#p3791211"]у таймера, что касается канала все перепроверь[/uquote]
Таймер в режиме переполнения отлично работет, прерывания выдаёт. Пытаюсь выдать с него ШИМ - где-то что-то или не доделал, или неправильно сделал, ШИМа нет.
Хорошему коту и в декабре - март :)
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 13, 2020 07:41:02

Сообщение Кислородный »

Мануал и даташит в помощь!
ШИМ получился 0% для первого канала, а настраивается для второго канала - регистр CCR2, в то время как регистр CCR1 по умолчанию = 0, а законфиген на ШИМ именно первый канал. Нужно поменять CCR2 на CCR1.
Ну и при значениях PSC = 359 и ARR = 65535, у вас получится оооочень бооооольшооой период в несколько секунд при дефолтной частоте 8 МГц. Для отдельных вспышек светодиода пойдет, но не для регулировки яркости этого светодиода.

Ну и вторым вопросом, чусствую, будет вопрос "аааа, куда пропала отладкааааа??? почему он в пошаговой отладке отвалился???"
Последний раз редактировалось Кислородный Сб фев 15, 2020 10:26:38, всего редактировалось 1 раз.
еавс!
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Frogfot, я от всех F1 уже избавился, потому проверить не могу, но на PA15 еще JTDI висит и это вход. В большинстве случаев используется SWD и лишние ноги JTAG отключаются через тот же ремап в начале программы.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Совершенно верно.

Код: Выделить всё

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;  // PA15 отключить от J-TAG
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Reflector",url="/forum/viewtopic.php?p=3791227#p3791227"]Frogfot, я от всех F1 уже избавился, потому проверить не могу.[/uquote]Круто, я ещё играюсь F103, вот хочу попробовать Black Pils на STM32F411.
[uquote="Reflector",url="/forum/viewtopic.php?p=3791227#p3791227"]Frogfot но на PA15 еще JTDI висит и это вход. В большинстве случаев используется SWD и лишние ноги JTAG отключаются через тот же ремап в начале программы.[/uquote]
Слона то я и не заметил :) Благодарю, уже когда-то натыкался на эти грабли, но запамятовал. Шью я тоже по SWD.Типа так?

Код: Выделить всё

AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE
Сейчас исправлю, попробую.
Последний раз редактировалось Frogfot Сб фев 15, 2020 10:52:56, всего редактировалось 3 раза.
Хорошему коту и в декабре - март :)
Ответить

Вернуться в «ARM»