Closed dvv closed 5 years ago
TIM4 в stm32f103c8t6 есть. Возможно, надо просто подключить нужный заголовочный файл:
#include "stm32f10x.h"
?
Ну и замечание заодно: если будете печатать в Serial из разных процессов, то желательно обернуть запись в мьютексы. Потому что вряд ли ардуиновский Serial рассчитан на многопоточность.
Дело в том, что такого заголовочного файла нет. Могли бы вы создать тут пример с выводом в USBSerial на базе stm32duino? Спасибо
Файл этот лежит в примерах, в директории common. Также могут понадобиться файлы, которые лежат уровнем выше. Вполне возможно, что и в stm32duino есть этот файл, это стандатрный заголовочный файл от ST. К сожалению, у меня сейчас совсем нет времени разбираться с stm32duino.
Похоже, дело уже было сделано. Но целиком кода найти не могу, а копипаста из того треда не помогает. Читаю
Помогла замена
#pragma weak PendSVC_ISR = PendSV_Handler
в os_target.cpp на#pragma weak __exc_pendsv = PendSV_Handler
но в os_target.cpp нет PendSVC_ISR
.
Вы свой проект сюда приложите, (или куда удобнее), я посмотрю.
Ну и замечание в сторону: "не помогает", "не работает" - не очень информативные описания проблемы. Гораздо полезнее: "компилятор ругается на...", "текст ошибки: ..." :)
Что касаемо PendSVC_ISR - это староне название, его сейчас убрали отовсюду.
Сейчас это прерывание занывается PendSV_Handler.
Попробуйте в os_target.cpp добавить эту строчку
#pragma weak __exc_pendsv = PendSV_Handler
Поставил platformio (в виде плагина к vs code), заморгал светодиодиком (у меня плата STM32MINI, с алиэкспресс). Ну, думаю, успех близко. Но не тут то было...
Пытаюсь подцепить scmrtos
- не выходит каменный цветок. Сначала не компилировалось - я пытался файлы настройки оси положить в директорию src, а такого сценария не предусмотрено. Хорошо, положил в lib/scmrtos, хотя это и не правильно.
Теперь компилируется, но не работает. Как только я пытаюсь задействовать что-то из библиотеки ардуино, сразу компилироваться перестаёт - вылезает ошибка многократного определения функции TIM4_IRQHandler
. Оказывается, библиотека ардуины внутри себя определяет все эти вектора, и для их использования надо вызывать какие-то спец. функции.
Но это не самое главное. Я дизасемблировал результирующий elf, и там нет функции __exc_pendsv
. Почему-то не цепляет. Возможно потому, что она в ассемблерном файле.
В общем, дальше надо копать очень глубоко, а мой выходной закончился :)
(Вот поэтому не люблю такие комбайны автоматизированные - пока всё работает, они прекрасны. А как только что-то идёт не так, как задумали авторы комбайна, так всё, туши свет. Механизма поправить дело или нет, или он закопан глубоко-глубоко).
Только пожаловался - заработало:) Взял версию scmrtos, в которой обработчик PendSV в cpp файле, отключил custom таймер (с ним почему-то не работает, возможно ардуиновская либа его как-то перенастраивает), вернул SysTick - заработало. По крайней мере, светодиодик мигает из задачи. Остальное не знаю. Где искать выхлоп от Serial.print() - не знаю. USB не энумерируется, в аппаратном USART - тихо. Короче, вот, прикладываю то, что у меня получилось. Если будет развитие - пишите сюда. test1.zip
Во, задышал serial. Я заменил Serial на Serial1, и появились импульсы на PA9. Добавил передачу управления между процессами - работает. В общем, вот: test2.zip. Надеюсь, поможет. (USB-CDC для bluepill и для моего клона не поддерживается, как я понял).
Ага, спасибо! Поправилось (у меня плата со светодиодом на PB1), собралось, залилось, но не замигало (
До-scmrtos-ные проекты собирал с учетом таких определений -- там всё хозяйство на основе libmaple
и USBSerial (Serial
) рабочий.
Очевидно, разные варианты из определений BLUEPILL_F103C8 vs. stm32f1 многое делают по разному.
Думаю, что надо всё же допилить custom таймер. Видимо, systick где-то ещё используется в недрах библиотек. Типа, тайм-ауты отрабатываются и всё такое. Надо просто следовать их правилам, зацепить обработчик таймерного прерывания через TimerHandleInit(), attachIntHandle().
Успех! USBSerial и моргалка. Спасибо!
Тестовый код для platformio для maple board (stm32f103c8t6).
Печатаются минусы в
/dev/ttyACM0
. После включения OS (раскомментировать вsetup
),/dev/ttyACM0
пропадает.Очевидно какой-то стык в использовании системного таймера scmRTOS и stm32duino. Прямое заимствование из здешнего примера не прошло -- отсутствуют определения уже в
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
.Подскажите пож, как пофиксить?