Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Без прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ekka
Привет всем) Такой вопрос. Возможно ли БЕЗ прерываний сделать следующее:

у меня есть пин, на котором периодически проходят импульсы,
По подъему нужно, чтобы включался таймер.

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

Может, кто посоветует, куда копать хотя бы.

МК - STM32f105
Obam
А по-яснее? Включить или запустить?
Ekka
Цитата(Obam @ Jul 27 2016, 12:42) *
А по-яснее? Включить или запустить?



запустить с обновленным счетчиком
Obam
Глава 16.3.11 (стр.442 из CD00171190.pdf) не подходит?
Ekka
Цитата(Obam @ Jul 27 2016, 13:13) *
Глава 16.3.11 (стр.442 из CD00171190.pdf) не подходит?



спасибо))) как раз документацию искала)) сейчас засяду
Obam
"Читала про синхронизацию таймеров и источник их тактирования." - а это тогда откуда?
Ekka
Цитата(Obam @ Jul 27 2016, 13:58) *
"Читала про синхронизацию таймеров и источник их тактирования." - а это тогда откуда?


Просто из статей.
Obam
Цитата(Ekka @ Jul 27 2016, 18:19) *
Просто из статей.


Ё-моё, как будто первый раз замужем (:
Ekka
Цитата(Obam @ Jul 27 2016, 14:27) *
Ё-моё, как будто первый раз замужем (:


О_О"
uriy
Слыхал что на заводах из-за разделения труда встречаются такие проблемы.
Разработчик схемы ничего не знает о микроконтроллере, кроме того что у него есть GPIO и пины питания.
В итоге разработчиками ПО под контроллер приходится делать ШИМ на GPIO, перекидывать аналоговые сигналы на входы АЦП и прочая несуразица.
Похоже тут как раз такой случай.
Ekka
Цитата(uriy @ Jul 28 2016, 07:31) *
Слыхал что на заводах из-за разделения труда встречаются такие проблемы.
Разработчик схемы ничего не знает о микроконтроллере, кроме того что у него есть GPIO и пины питания.
В итоге разработчиками ПО под контроллер приходится делать ШИМ на GPIO, перекидывать аналоговые сигналы на входы АЦП и прочая несуразица.
Похоже тут как раз такой случай.


Хм... у меня просто есть симисторный регулятор.
У него есть пин управления и пин - детектора фазы.
Организовать регулирование мощности с прерываниями и проч. - было уже сделано,
работало прекрасно. Но есть новая задача.
Сделать то же, но без прерываний. Вот и думаю.
uriy
Цитата
Сделать то же, но без прерываний. Вот и думаю.
Зачем???
Ekka
Ребята, не могу таймер 2 канал 2 настроить на шим... у него вообще есть такая возможность? может он суперособенный?
так настаиваю ШИМ

Код
void TIM2_Cfg()
{
    TIM_TimeBaseInitTypeDef tim_struct;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    tim_struct.TIM_Period = POWER;
    tim_struct.TIM_Prescaler = 100;
    tim_struct.TIM_ClockDivision = 0;
    tim_struct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &tim_struct);
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}


void TIM2_CH2_PWM_Cfg()
{
    TIM_ARRPreloadConfig(TIM2,ENABLE);
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_OCInitTypeDef pwm;
    TIM_OCStructInit(&pwm);
    pwm.TIM_Pulse =500;
    pwm.TIM_OCMode = TIM_OCMode_PWM1;
    pwm.TIM_OutputState = TIM_OutputState_Enable;
    pwm.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC2Init(TIM2, &pwm);
    TIM2->CCR2=TIM2->ARR/2;
}

//сама нога PB3
void GPIO_Cfg()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //откл JTDI

    GPIO_InitTypeDef c;
    c.GPIO_Mode = GPIO_Mode_AF_PP;
    c.GPIO_Pin = CONTROL_Pin;
    c.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(PORT_CONTROL_Pin, &c);
}
Ekka
...
amiller
Простой совет:
Забудьте про всякие HAL, Cube, CMSIS и тому подобное. Зачем Вам разбираться с багами индусов?
Если Вы пишите код для какой то периферии, то нужно знать, как эта периферия работает.
И перед написанием кода нужно по крайней мере один раз прочитать раздел раздел 15 "General-purpose timers (TIM2 to TIM5)" из документа "RM0008".
Там ответы на все Ваши вопросы. Кроме Вас в Вашем коде ошибки вряд ли кто найдёт. Навскидку варианты:
Где то в другом месте программы повторно инициализируются используемые ноги процессора.
Вы просто забыли в программе осуществить вызов представленных функций для настройки таймера.
Что-то забыли в настройке, но здесь пусть смотрят знатоки по применению этих библиотек.
Там меньше десятка регистров, в которые при настройке нужно записать нужные значения.
Разберитесь один раз и у Вас будет собственный код настройки таймеров, в котором Вам будет всё понятно и который можно будет портировать под разные проекты. Под STM вообще без проблем.
Ekka
Привет, ребята) снова стучу сюда. Правда вопрос другой.
Не могу найти библиотеку для USB на МК stm32f105R8, на сайте st что-то не нашла. Может есть у кого или кто ссылку знает?
Буду очень признательна.
Ekka
Народ)) Кто-то использовал USB на МК stm32f105? Куда хоть копать-то? В инете почти ничего именно по этому мк нет(
jcxz
Цитата(Ekka @ Aug 3 2016, 14:42) *
Народ)) Кто-то использовал USB на МК stm32f105? Куда хоть копать-то? В инете почти ничего именно по этому мк нет(

А чем отличается USB на МК stm32f105 от USB на любом другом МК?
И что мешает взять пример USB-стека от любого другого МК и адаптировать его под Ваш МК, переписав слой абстрагирования от железа (HAL)? Юзермануал на железо USB-контроллера у Вас имеется.
Откройте IAR, с ним идёт куча примеров под разные МК. В том числе и с USB-стеками. Там точно есть USB-стеки с HAL для МК NXP. Возможно есть и под STM.
HAL-уровень в USB-примерах IAR это собственно один файл usb_hw.c
Ekka
Взяла библиотеку для USB для stm32f10 и проч. Подгоняю под себя. Почему, когда флеху включаю в разъем вылетает в HardFault_Handler() ???

что это вообще за штука такая
Obam
Цитата(Ekka @ Aug 3 2016, 16:43) *
…вылетает в HardFault_Handler() ???
что это вообще за штука такая


Даже не знаю: смеяться или …
Нажмите для просмотра прикрепленного файла - вот для посветления
jcxz
Цитата(Ekka @ Aug 3 2016, 18:43) *
Почему, когда флеху включаю в разъем вылетает в HardFault_Handler() ???
что это вообще за штука такая

Да уж....
Может Вам пока поупражняться со светодиодами - позажигать-гасить? Или даже замахнуться на UART?!!!
Но USB...... wink.gif
Ekka
Цитата(jcxz @ Aug 3 2016, 15:03) *
Да уж....
Может Вам пока поупражняться со светодиодами - позажигать-гасить? Или даже замахнуться на UART?!!!
Но USB...... wink.gif


это да, не отрицаю. Но хоть сдохни, надо. Трудно дается..(((



Потуплю еще немного тут)

ноги DP и DM должны быть как AF? а ID, SOF - на вход. VBUS - на выход?

smile3046.gif
Ekka
Снова стучу сюды) Нашла библиотеку для stm105/7, настроила ноги (надеюсь, как надо), запускаю. Ответ от USBH_Process почти всегда приходит
HOST_IDLE. Может, кто-нибудь работал с этой штукой и знает, в чем именно может быть проблема?
Иногда еще вываливается в HOST_ERROR_STATE
Ekka
Всем Доброго времени суток) USB удалось запустить в режиме хоста и девайса)) Интересует один вопрос: как отличить, что именно подключено? Например, флешка к МК или МК к компу как ком-порт? Двойной режим не использую пока. Просто, может, знает кто-то в чем конкретно отличие при подключении? Как-то по питанию можно определить? По пину какому-нибудь? По ID?
Obam
Цитата(Ekka @ Aug 23 2016, 12:54) *
Всем Доброго времени суток) USB удалось запустить в режиме хоста и девайса)) Интересует один вопрос: как отличить, что именно подключено? Например, флешка к МК или МК к компу как ком-порт? Двойной режим не использую пока. Просто, может, знает кто-то в чем конкретно отличие при подключении? Как-то по питанию можно определить? По пину какому-нибудь? По ID?


Выв. 4 в микроUSB определяет кем будет ("0" - хост, "1" - девайс)
firew0rker
Документ "RM0008 Reference manual STM32F10xxxx..."
параграф "28.4.1 USB on-the-go full-speed (OTG_FS) ID line detection"
Ekka
Спасибо большое! Сейчас посмотрю))) biggrin.gif
AVR
Раз зашла тема про USB и уровень автора понятен (без обид sm.gif), то, возможно, такая ссылочка пригодится, мне она помогла понять: http://www.usbmadesimple.co.uk
Там автор рекламирует свою железяку, но можно сказать что бесплатная программа Wireshark (как минимум под ОС Linux) вполне себе сниффит USB, даже кажется с первых пакетов - может пригодиться для отладки.
Ekka
Всем спасибо большое за ответы))) все получилось)
AVR
Цитата(Ekka @ Aug 30 2016, 16:52) *
Всем спасибо большое за ответы))) все получилось)
Можно ли, для истории, пояснить что получилось и как?
Ekka
Мне нужно было, чтобы мк работал как хост и как ком-порт. Это получилось)
Ekka
Здравствуйте, снова пишу сюда. Может, кто-то сталкивался с такой штукой. Пытаюсь работать с FATFS, монтирую флешку.
Непонятка в следующем: если вызываю функцию FATFS единожды в main в while(1){} - все работает.
Пытаюсь по-человечески перенести в прерывание по кнопке - виснет.

функция, которую вызываю в цикле мэина единожды:
Код
RESULT_MOUNT=f_mount(&FileSystem, "0", 1);

все нормально, возвращает FR_OK.
То же вызываю в прерывании по кнопке - зависает.
В чем может быть проблема? О_О
jcxz
Цитата(Ekka @ Sep 7 2016, 14:33) *
Здравствуйте, снова пишу сюда. Может, кто-то сталкивался с такой штукой. Пытаюсь работать с FATFS, монтирую флешку.
Непонятка в следующем: если вызываю функцию FATFS единожды в main в while(1){} - все работает.
Пытаюсь по-человечески перенести в прерывание по кнопке - виснет.

А с чего Вы решили что эти функции могут вызываться из ISR??? 01.gif
Скорей всего они даже не могут вызываться из разных задач ОСРВ без спец. обёрток, обеспечивающих сериализацию. Про ISR даже речи быть не может.
Наиболее правильно все функции FatFS вызывать из одной задачи ОС.
Ekka
Цитата(jcxz @ Sep 7 2016, 11:06) *
А с чего Вы решили что эти функции могут вызываться из ISR??? 01.gif
Скорей всего они даже не могут вызываться из разных задач ОСРВ без спец. обёрток, обеспечивающих сериализацию. Про ISR даже речи быть не может.
Наиболее правильно все функции FatFS вызывать из одной задачи ОС.


Но я не использую никакую ОС. Объясните, пожалуйста, по-подробнее, что Вы имели ввиду)

Т.е. они у меня тут только в мэине и будут работать?

jcxz
Цитата(Ekka @ Sep 7 2016, 19:33) *
Т.е. они у меня тут только в мэине и будут работать?

Конечно.
Ekka
Цитата(jcxz @ Sep 7 2016, 16:54) *
Конечно.


Спасибо за ответы)
jcxz
Если Вам надо отделить работу файловой системы от каких-то других задач (чтобы они не мешали другу и тормозили), то поставьте ОС и все функции работы с файловой системой вынесите в отдельную задачу. Но тогда ещё Вам нужно продумать алгоритм межзадачного взаимодействия для запроса функций из задачи файловой системы.
scifi
Цитата(jcxz @ Sep 8 2016, 09:41) *
Если Вам надо отделить работу файловой системы от каких-то других задач (чтобы они не мешали другу и тормозили), то поставьте ОС и все функции работы с файловой системой вынесите в отдельную задачу. Но тогда ещё Вам нужно продумать алгоритм межзадачного взаимодействия для запроса функций из задачи файловой системы.

Вовсе не обязательно. Main Loop тоже вполне позволяет параллелить задачи, особенно с помощью Protothreads. При этом отсутствует геморрой с синхронизацией. Из недостатков - задержки отклика: всё-таки функции файловой системы могут тормозить в случае стирания флэш, к примеру.
jcxz
Цитата(scifi @ Sep 8 2016, 13:08) *
Из недостатков - задержки отклика: всё-таки функции файловой системы могут тормозить в случае стирания флэш, к примеру.

Вот именно. Вот именно устранение этого я имел в виду под "отделить работу от других задач".
Ekka
Снова привет всем. Простите, что все до кучи в одной теме, но вопрос очень непонятный.
Настраиваем ДМА с АЦП через Куб.
На 4 канала.
В чем вопрос: в инете говорится, что запускать ДМА с АЦП надо примерно так:
Код
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)dmaBuf, (uint32_t)dmaBufSize*2);


Почему вдруг *2 ???
При таком запуске ДМА благополучно лезет в соседние массивы и пихает туда то, что забрал с АЦП.
Однако если запустить так:
Код
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)dmaBuf, (uint32_t)dmaBufSize);


заполняется либо полмассива, либо часть. В результате не могу нормально усреднить значения.
Может кто-то знает, в чем моя проблема?
Как надо правильно запускать ДМА? Или, может, у меня какая-то настройка отсутствует?
У меня уже глаз замылился с этим ДМА.
Сергей Борщ
QUOTE (Ekka @ Sep 29 2016, 11:28) *
Как надо правильно запускать ДМА?
А вы посмотрите внимательно, что происходит внутри этой чУдной функции. Отследите, какие значения в какие регистры она пишет. А потом откройте описание каждого конкретного регистра и разберитесь, что туда должно писаться исходя из вашей задачи. И вам все станет ясно.
Ekka
Вопрос с ДМА снят) Разобрались.
Возник другой вопрос. Может, конечно, тоже вопрос не из умных,
но можно ли как-то заставить FATFS работать в прерывании обычного таймера?
Она же в прерываниях, вроде не работает.

Просто у меня в чем беда:
несчастный триак работает на прерываниях (плохо, конечно, не отрицаю)
и если ФатФС тормозит в мэине - лампочка тоже моргает, импульсы нарушаются.
Может, кто умный/опытный что посоветует?

Засада еще в том, что FreeRTOS взять пока не могу((
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.