По #chibios и #stm32 достаточно много материала для изучения, но большая его часть на английском языке. Здесь буду выкладывать ссылки на англоязычный контент, если у кого есть желание помочь с переводом статей и туториалов для нашего блога и форума я буду благодарен. Начнем (буду дополнять список, переведенное будем вычеркивать)! Troubleshooting: I²C on STM32 // готово, перевел @koteika ссылка Using an Eclipse-based IDE // переводится Getting started with the STM32F4-Discovery board and ChibiOS/RT RTOS Concepts How to create a thread // готово, перевел @koteika ссылка ChibiOS/RT style guide Debugging ChibiOS/RT applications Регистры и битовые маски // готово, перевел @koteika ссылка Производительность ОС Использование HAL GPT Как портировать код с Chibios 2.x на Chibios 3.x // готово, перевел @koteika ссылка
Самая первая ссылка... Спойлер: Перевод Методика поиска и устранений неисправности шины I²C на STM32 Однажды вы захотите использовать данный интерфейс для связи в каких либо своих проектах, и может так случиться что I²C не заработает...., вы либо не получите каких либо данных, либо получите кракозябры(мусор).. Данное руководство подскажет вам как избежать не которые ошибки, при работе с I²C : Для начала проверяем: - Убеждаемся что используем внешние подтягивающие резисторы. Внутренние подтяжки не подойдут для работы с I²C . Также следует обратить внимание на соответсвие номинала резистора для скорости шины I²C : 100 кГц резистор не более 10 кОм 400 кГц------------------------4,7 кОм 1МГЦ--------------------------2 кОм - Убедитесь в правильности подключения линий SDA и SCL - Правильно настройти PAL драйвер для линий SDA и SCL, они должны быть настроены на режим альтернативной функции - PAL_MODE_ALTERNATE и режим пина с открытым стоком OPENDRAIN.. Примеры можно посмотреть ниже. - Убедиться что вы используете правильный идентификатор драйвера I²C... Нельзя использовать I2CD1, если используется I2CD2.. - Можно использовать диагностические функции драйвера I²C, для того что бы получить коды ошибок, подробнее смотреть http://chibios.sourceforge.net/docs..._i2_c.html#ga653f9c593af20d15fdbf893e4c117d78 - Посмотреть примеры программ I²C в папке testhal, они гораздо проще для понимая чем примеры в папке демо. Примеры настройки PAL драйвера: Для STM32F1xx : palSetPadMode(GPIOB, 6, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SCL */ palSetPadMode(GPIOB, 7, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SDA */ Для STM32F4xx : palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SCL */ palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SDA */ Если не смогли устранить причину, то следует првоерить работоспособность вашего оборудования. Можно использовать осциллогроф или логический анализатор, что бы проверить шлет ли Master какие ли данные.. Вы можете заменить чип, если это позволяют ваши возможности. Если не помогло, то не стисняйтесь задавать вопросы на форумах, пожалуйста дайте как можно больше деталей касательно вашей неисправности.. Вроде все как надо))) Извиняюсь если где то что упустил..
Вторую статью тоже беру.. Так как не получилось настроить Эклипс у меня для стм под линем, может тут что получится..
How to create a thread Как создавать потоки Спойлер: Перевод Создание нового потока является наиболее распространенной задачей при использовании ОС реального времени. Давайте рассмотрим как это делается в ChibiOS / RT. После инициализации ChibiOS / RT, используя chSysInit () у нас появляются два потока по умолчанию: Idle thread. Этот поток имеет самый низкий приоритет в системе, так как он работает только тогда, когда другие потоки не используются либо спят. Эти потоки обычно переключает систему в режим пониженного энергопотребления и больше ничего не делают. Main thread. Это главный поток, он выполняет основную функцию main() при запуске. Основной поток создается на уровне NORMALPRIO, и он может изменить свой приоритет, если требуется. Есть два класса потоков в ChibiOS / RT: Static Threads (Статические потоки) это класс потоков которые находятся в статической памяти во время компиляции. Dynamic Threads (Динамические потоки) это потоки созданные путем выделения памяти во время компиляции. Создание статического потока Для того чтобы создать статический поток, рабочая зона должна быть объявлена с помощью макросов WORKING_AREA как показано ниже: Код: static WORKING_AREA(myThreadWorkingArea, 128); Этот макрос резервирует 128 байт стека для потока и пространства всех необходимых и связанных с ним структур. Статический поток может быть запущен вызовом chThdCreateStatic (), как показано в следующем примере: Код: Thread *tp = chThdCreateStatic(myThreadWorkingArea, sizeof(myThreadWorkingArea), NORMALPRIO, /* приоритет */ myThread, /* функция потока */ NULL); /* параметры потока */ Переменная tp получает указатель на объект потока, этот указатель часто принимается в качестве параметра другими API. Теперь полный пример: Код: /* * My simple application. */ #include <ch.h> /* * Рабочее пространство */ static WORKING_AREA(myThreadWorkingArea, 128); /* *Поток(мигаем диодом) */ static msg_t myThread(void *arg) { while (TRUE) { LED_ON(); chThdSleepMilliseconds(500); LED_OFF(); chThdSleepMilliseconds(500); } } int main(int argc, char *argv[]) { /*стартуем поток*/ (void)chThdCreateStatic(myThreadWorkingArea, sizeof(myThreadWorkingArea), NORMALPRIO, myThread, NULL); . . . } Следует отметить, что память, выделенная для MyThread () статически определена и не может быть использована повторно. Статические потоки более безопастны, потому что нет никакого риска выхода из строя распределения памяти, потому что происходит фрагментация стека. Создание динамическогог потока при помощи распределения стека Создание потока из кучи памяти: Код: Thread *tp = chThdCreateFromHeap(NULL, /* NULL = Default heap. */ THD_WA_SIZE(128),/*размер стека */ NORMALPRIO, /* приоритет */ myThread, /* функция потока */ NULL); /* параметры потока */ Память выделяется из указанного стека и поток выполняется. Обратите внимание, что память не освобождается, когда поток завершается. Например: Код: /* * My simple application. */ #include <ch.h> /* *мигаем светодиодом */ static msg_t myThread(void *arg) { unsigned i = 10; while (i > 0) { LED_ON(); chThdSleepMilliseconds(500); LED_OFF(); chThdSleepMilliseconds(500); i--; } return (msg_t)i; } int main(int argc, char *argv[]) { Thread *tp = chThdCreateFromHeap(NULL, THD_WA_SIZE(128), NORMALPRIO+1, myThread, NULL); if (tp == NULL) chSysHalt(); /* Memory exausted. */ /* The main thread continues its normal execution.*/ . . /* * Now waits for the spawned thread to terminate (if it has not terminated * already) then gets the thread exit message (msg) and returns the * terminated thread memory to the heap (default system heap in this * example). */ msg_t msg = chThdWait(tp); . . } Создание динамического потока, используя распределение памяти(не стека..) Код: /* * My simple application. */ #include <ch.h> /* * LED flashing thread. */ static msg_t myThread(void *arg) { unsigned i = 10; while (i > 0) { LED_ON(); chThdSleepMilliseconds(500); LED_OFF(); chThdSleepMilliseconds(500); i--; } return (msg_t)i; } int main(int argc, char *argv[]) { Thread *tp = chThdCreateFromMemoryPool(myPool, NORMALPRIO+1, myThread, NULL); if (tp == NULL) chSysHalt(); /* Pool empty. */ /* The main thread continues its normal execution.*/ . . /* * Now waits for the spawned thread to terminate (if it has not terminated * already) then gets the thread exit message (msg) and returns the * terminated thread memory to the original memory pool. */ msg_t msg = chThdWait(tp); . . } Еще перевод) Тут если я правильно понял pool это распределение в обычной памяти, то есть не фиксированный размер у этой области, в отличии от стека, где задаем кол-во байт.
либо pool это очень быстрое распределение в памяти, в си вродь есть функция выделения динамической памяти malloc, вот это из этих степей походу.. выделяем когда нужно, прога выполняеться, и далее нужно удалить этот кусок памяти..
Давай попробуем сделать адекватную IDE для разработки с красивым и функциональным редактором и нормальной отладкой.
Обновление для переводов: Регистры и битовые маски Производительность ОС Использование HAL GPT Как портировать код с Chibios 2.x на Chibios 3.x