Перейти к содержанию

STM32F103C8T6 + ChibiOs


WaL60

Рекомендуемые сообщения

Всем привет!

Итак, имею стандартную плату с данным контроллером на борту, двумя перемычками, светодиодом на PC13 и кнопкой ресета.

Пытаюсь поморгать светодиодом, используя ChibiOs.

С чем бьюсь второй день - что-то не так со временем. Попробовал несколько разных версий чиби, изначально юзал демку RT-STM32F103-MAPLEMINI, перебив порт в треде мигалки, затем на форуме ChibiOs скачал демку под плату BluePill, но подозреваю, что это не столь важно, так как результат один:

сейчас в main.c следующий код:

#include "hal.h"
#include "ch.h"

int main(void) {
    halInit();
    chSysInit();

    uint8_t time = 100;
    while(1) {
        palSetPad(GPIOC, GPIOC_LED);
        chThdSleepMilliseconds(time);
        palClearPad(GPIOC, GPIOC_LED);
        chThdSleepMilliseconds(time);
    }
    return 0;
}

Он отлично выполняется, частота мигания верна ( смотрю осциллографом на выходе)

Начинаю занижать частоту мигания, теперь у меня

    uint8_t time = 300;

А на осциллографе наоборот уменьшается. Длительность паузы получается 45мсек.

Дальше - еще интереснее. если

    uint8_t time = 500;

то импульсы есть, но частота опять не верна. а если

while(1) {
        palSetPad(GPIOC, GPIOC_LED);
        chThdSleepMilliseconds(500);
        palClearPad(GPIOC, GPIOC_LED);
        chThdSleepMilliseconds(500);
    }

то импульсов уже нет,  на порту постоянная единица, изредка проскакивают плохо различимые "иголки"- просадка до нуля и сразу же единица.

Где я что упускаю, подскажите?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

2 часа назад, Yurkin2015 сказал:

Надо uint16 использовать 

В принципе, ничего не меняется.

Если 300, то все нормально. При 350 светодиод горит уже 50мсек, а не горит - 350.

При time = 400 горит уже 5 мсек.

На 500 миганий не видно, на осциллограмме проскакивают "иголки"

Дебаггер гоняет по всем 4 строчкам цикла while, когда светодиод мигает. Когда не мигает, то прыгает между двумя первыми строками цикла. Глубже, внутрь  chThdSleepMilliseconds не лез, т.к. там мало что пойму пока

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

а прототип  chThdSleepMilliseconds как выглядит? Не может так быть, что аргумент короткое целое?

в настройках OS таймер для TimeBase какой указан? Если SysTick, то надо это дело уничтожить и пересадить на любой другой таймер общего назначения, возможно поможет

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, mail_robot сказал:

а прототип  chThdSleepMilliseconds как выглядит? Не может так быть, что аргумент короткое целое?

chThdSleepMilliseconds это макрос, вызывающий chThdSleep(MS2ST(msec))

void chThdSleep(systime_t time) {

  chSysLock();
  chThdSleepS(time);
  chSysUnlock();
}

.....

typedef uint32_t systime_t;

 

А вот с таймером я найти  и разобраться не могу.

111.zip

Ссылка на комментарий
Поделиться на другие сайты

попробуйте тогда методом тыка вызвать усыплялку потока с аргументами близкими к крайним. например 255 и 256. И смотрите на эффект.

А настройка опорного таймера должна быть гдето в конфигурационном заголовочнике, там где у вас переменные среды определены типа размера кучи под потоковые функции. Я сам с чиби знаком очень поверхностно, так как пользую CMSIS OS и поэтому советую чисто по аналогии, так как многие вещи у операционок одинаково или похоже реализуются. Она как то более понятной мне показалась. CMSIS OS это тот же FreeRTOS, только слегка доведенный до человеческого вида. Лучше или хуже сказать не могу, оно просто работает

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, mail_robot сказал:

попробуйте тогда методом тыка вызвать усыплялку потока с аргументами близкими к крайним. например 255 и 256. И смотрите на эффект.

На 200 длительность паузы похожа на правду

При 250 пауза ~150. При 300 пауза ~100. Переходов резких нет, как я плавно паузу увеличиваю, так она на самом деле плавно и уменьшается.

 

______

по таймерам нашел что. в файле chconf.h

/*===========================================================================*/
/**
 * @name System timers settings
 * @{
 */
/*===========================================================================*/

/**
 * @brief   System time counter resolution.
 * @note    Allowed values are 16 or 32 bits.
 */
#define CH_CFG_ST_RESOLUTION                16

/**
 * @brief   System tick frequency.
 * @details Frequency of the system timer that drives the system ticks. This
 *          setting also defines the system tick time unit.
 */
#define CH_CFG_ST_FREQUENCY                 2000

/**
 * @brief   Time delta constant for the tick-less mode.
 * @note    If this value is zero then the system uses the classic
 *          periodic tick. This value represents the minimum number
 *          of ticks that is safe to specify in a timeout directive.
 *          The value one is not valid, timeouts are rounded up to
 *          this value.
 */
#define CH_CFG_ST_TIMEDELTA                 2

/** @} */

В файле mcuconf.h

/*
 * ST driver system settings.
 */
#define STM32_ST_IRQ_PRIORITY               8
#define STM32_ST_USE_TIMER                  2

Изменение таймера или приоритета прерывания ничего не меняют.

Изменение  CH_CFG_ST_FREQUENCY кое-что дает. Например, если присвоить миллион, то при паузе 400мсек пауза верна. А при паузе 1сек реальная задержка 17-18 мсек.

PS

Вообще, мне не принципиально использовать чиби - просто это единственное, с чем я работал.

Мне принципиально только одно - среда разработки eclipse. А там хоть все  с нуля пиши. Хотя последнее не хотелось бы

 

Изменено пользователем WaL60
добавил
Ссылка на комментарий
Поделиться на другие сайты

не знаю что тут посоветовать. Надо читать доку на операционку значит. А это довольно мутное занятие

возможно у вас глючная версия попалась. Может надо другую функцию использовать, так как эта может прерываться каким нибудь условием ограничения таймслота или еще чем нибудь. Еще надо выяснить какой тип многозадачности используется. У ОС-ок много всяких загогулин бывает. Я вам скажу так - судя по вашим метаниям опыт у вас не великий и где-то в самом начале. Есть смысл бросить и освоить что-то более понятное и распространенное. Я за всю свою историю кодинга нарывался на исходники с чиби только один раз и она крутилась под 407-ым камнем. Писал там крутой поц и мне надо было только чутка подпилить все его творчество не особо вдаваясь в подробности. В основном народ юзает FreeRTOS и ее клоны/обертки. К коим собсна и CMSIS OS относится. И там все проще простого и разжевано до атомов в доках. И пофик в чем вы пишете, операционка добавляется одинаково просто.

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Сообщаю - дело оказалось в самой плате. Когда я без всяких ОСРВ залил туда простую мигалку, светодиод просто горел. Закрались смутные сомнения и как раз прислали новую платку.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...