ЗЫ: достаточно легко сделать, чтобы всё компилировалось и gcc, и iar, и даже keil.
STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Не страдай ерундой. Переводи весь проект в .сpp. С++ компилятор чисто С-ный код скомпилирует в лучшем виде. Стартап можешь в .с оставить, тогда перед обработчиками прерываний extern "C" поставишь да и всё..
ЗЫ: достаточно легко сделать, чтобы всё компилировалось и gcc, и iar, и даже keil.
ЗЫ: достаточно легко сделать, чтобы всё компилировалось и gcc, и iar, и даже keil.
- Реклама
А со стеком все в порядке? А некоторые системы под стек дефолтно дают мало места...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
та на стеке и не хранится ничего. все данные глобальные - либо буфферы, либо экземпляры класов. да и функция пустая. не должно переполняться. я к тому же пока не разбирался как здесь заполнение стека проверять (в иаре то попроще с этим - и граф шкала есть, да и предупреждение он выдает).
по совету знакомого, я сделал пустой проект с простенькой програмкой и смоделировал похожую ситуацию вызова внешней .срр функции - ничего не вывалилось. значит линковщик таки работает правильно и причина в чем-то другом.
проверял на дискавери, оригинальная железяка дома, к семи доберусь и буду ставить эксперименты.
Добавлено after 4 hours 41 minute 53 seconds:
ну я хз котаны - вместо того чтобы делать новый проект из кубовского файла, я создал чистый прямо в куб-идэе и руками перезабил всю инфу. сгенерил код, перенес все те же юзер файлы, скопипастил куски юзер кода и оно не падает.
пока что спортивного интереса копаться в чем же разница между проектами нет - может косяк в их коде, может у меня что-то было. Если повторяться не будет то и хрен с ним, а если будет то потрачу денек.
по совету знакомого, я сделал пустой проект с простенькой програмкой и смоделировал похожую ситуацию вызова внешней .срр функции - ничего не вывалилось. значит линковщик таки работает правильно и причина в чем-то другом.
проверял на дискавери, оригинальная железяка дома, к семи доберусь и буду ставить эксперименты.
Добавлено after 4 hours 41 minute 53 seconds:
ну я хз котаны - вместо того чтобы делать новый проект из кубовского файла, я создал чистый прямо в куб-идэе и руками перезабил всю инфу. сгенерил код, перенес все те же юзер файлы, скопипастил куски юзер кода и оно не падает.
пока что спортивного интереса копаться в чем же разница между проектами нет - может косяк в их коде, может у меня что-то было. Если повторяться не будет то и хрен с ним, а если будет то потрачу денек.
Я в кубическом main() держу ровно две строчки (чтобы меньше копипастить).Между /* USER CODE BEGIN Init */ и /* USER CODE END Init */ вписываю что-то вроде My_Init(); и, между /* USER CODE BEGIN 2 */ и /* USER CODE END 2 */ - My_main(); причем, не уведомляя кубики, что из этого My_main() я не вернусь.Ярослав555 писал(а):сгенерил код, перенес все те же юзер файлы, скопипастил куски юзер кода
А, нет, три: еще между /* 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)
А вся инициализация периферии, обработчики прерываний - тоже свои, или сгенерированные?
P.S. А, сразу не увидел оговорку про прерывания. Точек связи сгенерированного кода со своим всё же больше трёх.
P.S. А, сразу не увидел оговорку про прерывания. Точек связи сгенерированного кода со своим всё же больше трёх.
- Реклама
[uquote="WiseLord",url="/forum/viewtopic.php?p=3785755#p3785755"]Точек связи сгенерированного кода со своим всё же больше трёх.[/uquote]
Почему? Колбеки редефайнятся в своем файле и возможно даже править не приходится.
По поводу мейна - у меня как-то сложилось что в мейне только начальная инициализация и запуск системного таймера. Дальше все остальное происходит через вызовы этого системного таймера. Мои объекты имеют функцию poll - в ней находится большой свич с описанием действий и переходов, рискну назвать это машиной состояний. Иногда даже две таких функций - быстрая и легкая (например простое сравнение) и медленная (математически нагруженная). Такая архитектура позволяет асинхронную работу частей программы, никто никого не ждет - есть состояние значит переход на новое состояние, нет - ретурн. Разные обьекты ставятся на разные таски - кто-то на 1 мС, кто-то на 100 мС.
Максимум что попадает в цикл мейна - мигание светодиодом, причем в последнее время я туда пакую софтверный шим для этого светодиода. По плавности мигания можно увидеть насколько ровно идет программа. Главный цикл имеет наинизший приоритет и если ему совсем времени не остается, значит и какой-то таск может захлебнуться. Для моих задач хватает, не атомные реакторы строю.
Почему? Колбеки редефайнятся в своем файле и возможно даже править не приходится.
По поводу мейна - у меня как-то сложилось что в мейне только начальная инициализация и запуск системного таймера. Дальше все остальное происходит через вызовы этого системного таймера. Мои объекты имеют функцию poll - в ней находится большой свич с описанием действий и переходов, рискну назвать это машиной состояний. Иногда даже две таких функций - быстрая и легкая (например простое сравнение) и медленная (математически нагруженная). Такая архитектура позволяет асинхронную работу частей программы, никто никого не ждет - есть состояние значит переход на новое состояние, нет - ретурн. Разные обьекты ставятся на разные таски - кто-то на 1 мС, кто-то на 100 мС.
Максимум что попадает в цикл мейна - мигание светодиодом, причем в последнее время я туда пакую софтверный шим для этого светодиода. По плавности мигания можно увидеть насколько ровно идет программа. Главный цикл имеет наинизший приоритет и если ему совсем времени не остается, значит и какой-то таск может захлебнуться. Для моих задач хватает, не атомные реакторы строю.
То есть, *_it.c/h файлики, которые генерируются кубом, Вы просто не компилируете вообще?
Как это не компилирую? Компилирую. Просто обратите внимание что оригинальные Callback функции объявлены с директивой weak - слабые. Это по своему назначению и не функци вовсе, а так - заглушки. Совершенно законно можно определить Callback функцию с тем же именем у себя в файле, и компилятор возьмет именно ее, как более высшую по проритету. Лично я пока не экспериментировал с выносом Callback в отдельный файл, но спокойно пишу их в мейне в секции юзер кода. Там делаю свич по переданному параметру - таймер, юарт и т.д., и дальше передаю обработку по ветке в нужный объект.
- Сообщения: 19
- Зарегистрирован: Пт дек 07, 2018 13:56:33
Утречка всем.
Нужен STM32 F103C8T6 для ослика DSO138
нашел на али чипы с припиской
LQFP48 и QFP48 QFP
что это значит и подойдут ли такие?
Нужен STM32 F103C8T6 для ослика DSO138
нашел на али чипы с припиской
LQFP48 и QFP48 QFP
что это значит и подойдут ли такие?
это тип корпуса. STM32 F103C8T6 сущевствуют только в LQFP48. Думаю китайцы не вдавались в детали описания и это все одни и те же чипы.
- Сообщения: 19
- Зарегистрирован: Пт дек 07, 2018 13:56:33
STM32F103C8T6. Запустил ШИМ на таймере 1, Ок. Пытаюсь запустить на таймере 2 шим 1 - на выходе РА15 глухо. Подскажите плиз где чего я неправильно сделал:
Исправил код, добавил remap чтобы всё было в одном месте - не помогло.
Спойлер
Код: Выделить всё
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
Последний раз редактировалось Frogfot Сб фев 15, 2020 12:08:01, всего редактировалось 5 раз.
Хорошему коту и в декабре - март 
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Frogfot",url="/forum/viewtopic.php?p=3791101#p3791101"]Пытаюсь запустить на таймере 2 шим 1 - на выходе РА11 глухо.[/uquote]
Во-первых, не PA11, а PA15 который у тебя и настраивается. Во-вторых, этот пин находится в колонке Remap, а его то ты и не делаешь(AFIO->MAPR).
Во-первых, не PA11, а PA15 который у тебя и настраивается. Во-вторых, этот пин находится в колонке Remap, а его то ты и не делаешь(AFIO->MAPR).
[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, забыл исправить, а ремап упустил из вида.
Типа так?
Добавлено after 9 hours 18 minutes 59 seconds:
2 Reflector: исправил, всё равно нет ШИМа на выходе. Где-то ещё одна собака порылась
А может и не одна.
Во-первых, не PA11, а PA15 который у тебя и настраивается. Во-вторых, этот пин находится в колонке Remap, а его то ты и не делаешь(AFIO->MAPR).[/uquote]
Ок, спасибо, сейчас исправлю. На РА 11 запускал с таймера 1 выход 4, забыл исправить, а ремап упустил из вида.
Типа так?
Код: Выделить всё
AFIO->MAPR = AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1; // Partial remap Timer 2 2 Reflector: исправил, всё равно нет ШИМа на выходе. Где-то ещё одна собака порылась
Хорошему коту и в декабре - март 
[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 МГц. Для отдельных вспышек светодиода пойдет, но не для регулировки яркости этого светодиода.
Ну и вторым вопросом, чусствую, будет вопрос "аааа, куда пропала отладкааааа??? почему он в пошаговой отладке отвалился???"
ШИМ получился 0% для первого канала, а настраивается для второго канала - регистр CCR2, в то время как регистр CCR1 по умолчанию = 0, а законфиген на ШИМ именно первый канал. Нужно поменять CCR2 на CCR1.
Ну и при значениях PSC = 359 и ARR = 65535, у вас получится оооочень бооооольшооой период в несколько секунд при дефолтной частоте 8 МГц. Для отдельных вспышек светодиода пойдет, но не для регулировки яркости этого светодиода.
Ну и вторым вопросом, чусствую, будет вопрос "аааа, куда пропала отладкааааа??? почему он в пошаговой отладке отвалился???"
Последний раз редактировалось Кислородный Сб фев 15, 2020 10:26:38, всего редактировалось 1 раз.
еавс!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Frogfot, я от всех F1 уже избавился, потому проверить не могу, но на PA15 еще JTDI висит и это вход. В большинстве случаев используется SWD и лишние ноги JTAG отключаются через тот же ремап в начале программы.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Совершенно верно.
Код: Выделить всё
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1; // PA15 отключить от J-TAG[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.Типа так?
Сейчас исправлю, попробую.
[uquote="Reflector",url="/forum/viewtopic.php?p=3791227#p3791227"]Frogfot но на PA15 еще JTDI висит и это вход. В большинстве случаев используется SWD и лишние ноги JTAG отключаются через тот же ремап в начале программы.[/uquote]
Слона то я и не заметил
Код: Выделить всё
AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE
Последний раз редактировалось Frogfot Сб фев 15, 2020 10:52:56, всего редактировалось 3 раза.
Хорошему коту и в декабре - март 


