Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546

Cube страчивает HAL_Delay (при переменной)

12.10.2025, 20:13. Показов 2228. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучаю Cube: помигал светодиодом, теперь ловлю АЦП. По простачку - чтоб не выводить на ПК, хочу чтоб светодиод изменял скорость мигания в зависимости от АЦП. Подпаял переменник на первый порт, края - на питания; настроил всё по примеру; - соответствующая переменная изменения ловит. Листинг такой:


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 uint32_t adcResult = 0;
      int adcResult2 = 0;
 
 
      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1, 100);
      adcResult = HAL_ADC_GetValue(&hadc1);
      HAL_ADC_Stop(&hadc1);
 
      HAL_GPIO_WritePin(Svetodiod_GPIO_Port, GPIO_PIN_13, GPIO_PIN_SET);
      adcResult2=(adcResult-3700)*3;
      HAL_Delay(adcResult2); // 1000ms (HAL_Delay останавливает программу)
      HAL_GPIO_WritePin(Svetodiod_GPIO_Port, GPIO_PIN_13, GPIO_PIN_RESET);
      HAL_Delay(adcResult2);

В отладке изменения "adcResult2" наблюдаю - но светодиод (при полном Ране) своё мигание не изменяет - почему? При этом: при перекомпиляции с явно заданным значением (1000 и др.) - нормально изменяет скорость. Это наводит на мысль - что оная функция не воспринимает переменки - а только константы. - прошу прокомментировать.

В переменных два разных типа установил ради изучения - наследуются нормально.

От АЦП приходят значения в диапазоне от 3800 до 4300 при полном провороте потенциометра (когда скручивается он от нуля до наибольшего - что пропагандирует изменения значений от 0 до 63350 примерно) - с чего-бы это?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2025, 20:13
Ответы с готовыми решениями:

К знатокам кодогенератора Cube. Как добавить в проект, созданный Cube кубом еще одно прерывания без Cube
Когда-то давно я начал разрабатывать проект с помощью кодогенератора Cube. Теперь остались...

PinboardV2+STM32F103C8T6+CUBE+KEIL
С наступающим НГ всех! Не сильно надеясь на ответ (так как форум похоже полумертвый) все же...

Не работает рабочая прошивка в Led cube 8*8*8
Нужна помощь специалистов т.к. своих знаний мне явно не хватает Начну по порядку . С МК работать...

21
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
13.10.2025, 16:34
Вы в отладчике смотрели что в adcResult и adcResult2 при разных положениях движка переменника?
0
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
13.10.2025, 17:42  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
в отладчике смотрели
Да.

Вопрос, собственно, про восприимчивость переменных у HAL_Delay.

***
Я переделал на реакцию на таймер - но не могу поймать внятное объяснение - как изменять период таймера на лету: инфы попадающиеся мне завалены темами про таймер и другими - вперемешку, - трудно понять моё. Собственно сам таймер у меня работает, и я не хочу помещать в листинг уже сделанное, осталось только сменить период - как? Я посмотрел переменные объекта - нашёл "Period" - но мне не удалось правильно вместить оное в листинг. Мне, собственно, надо изменять период таймера по значению из АЦП - прошу прояснить и кинуть ссылкой на пример.

***

Сейчас сделал через HAL_Delay с константой - только закрутил это по циклу: вроде работает - но замечаются нестабильности: при постоянном положении потенциометра на АЦП значения из него изменяются; при крайних положениях - вообще происходят сбои - что надо перевключать платку; мне кажется - это связано с шумностью каналов.

Открыт вопрос: почему значения из регистра АЦП получаются от 3800 до 4300? Я ожидал от 0 до 63350 примерно...
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
13.10.2025, 17:48
Цитата Сообщение от Levontay Посмотреть сообщение
почему
проверяй свою схему - как подключен резистор к АЦП.
Цитата Сообщение от Levontay Посмотреть сообщение
Я ожидал от 0 до 63350 примерно
АЦП в STM32 12-ти битный. 212 = 4096. 63350 там не будет никогда.
2
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
13.10.2025, 17:52
Цитата Сообщение от Levontay Посмотреть сообщение
Да.
И что показал отладчик?
Отладчиком в HAL_Delay() заходили? Что видели?
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
13.10.2025, 18:53
Кручу переменный резистор и меняю скважность ШИМ четырех светодиодов. Элементарным кодом:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            if(ADCmon){
                uint16_t v = getADCval(0);
                int32_t d = v - oldADCval;
                if(d < -ADCthreshold || d > ADCthreshold){
                    oldADCval = v;
                    printADCvals(USB_sendstr);
                    printADCvals(usart_send);
                    v >>= 2; // 10 bits
                    TIM3->CCR1 = TIM3->CCR2 = TIM3->CCR3 = 0xff; TIM3->CCR4 = 0;
                    if(v >= 0x300) TIM3->CCR4 = v - 0x300;
                    else if(v >= 0x200) TIM3->CCR3 = v - 0x200;
                    else if(v >= 0x100){ TIM3->CCR2 = v - 0x100; TIM3->CCR3 = 0; }
                    else{ TIM3->CCR1 = v; TIM3->CCR2 = TIM3->CCR3 = 0; }
                }
            }
АЦП молотит непрерывно, заполняя массив - по 9 значений на каждый канал. Когда мне нужно считать текущие данные, я вычисляю медиану из этих девяти. Дальше - проверяю порог (чтобы не реагировать на шумы). Выплевываю текущие значения АЦП в USART1 и USB-CDC. А затем просто из четырех светодиодов формирую "линейку": все диоды ниже светят на постоянку, а соответствующий уровню ШИМится. Разве что нужно было здесь экспоненту сделать: зрение-то у нас не умеет в линейность.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
13.10.2025, 21:43
Levontay, надо узнать int adcResult2 = 0; это по моему объявление переменной как 16 битной поэтому когда считаете adcResult2=(adcResult-3700)*3; то результат будет на выходе длинной 32 бита может от того и зависает. Кстати сразу говорю учитесь работать с АЦП без HAL.
1
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
14.10.2025, 18:56  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Отладчиком в HAL_Delay() заходили?
На "другой" проге заметил что входные данные - "25" (собственно - любые), а внутри - "wait" и "Delay" равны "2" - нэзрозумыло...

Цитата Сообщение от VladimirU Посмотреть сообщение
это по моему объявление переменной как 16 битной
Изменил на "uint32_t" - не повлияло.

- страхыття.

Оный дэлэй представляет собой, собственно - цикл, - может я просто поставлю оный цикл себе или напишу собственную процедуру?

***
Вопрос про таймер в силе.

***
В видосе мастер смотрел переменные отладки через окно маониторинга программатора - где это?

И как вообще лучше мониторить переменные в реальном времени? - чтоб я крутил переменник - и наблюдал увеличение и уменьшение значений (а не как щас - через F8)?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
14.10.2025, 21:54
Цитата Сообщение от Levontay Посмотреть сообщение
И как вообще лучше мониторить переменные в реальном времени?
отладчик то какой?
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
14.10.2025, 23:02
ValeryS, ещё в кубе есть способ после целочисленного значения ставить заглавную "U"
C
1
adcResult2=(adcResult-3700U)*3U;
я так понимаю это указатель, что данное число Unsigned?
Levontay, это сама функция

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}
чаще всего зависание бывает если с переменными накосячиш.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
14.10.2025, 23:24
Цитата Сообщение от VladimirU Посмотреть сообщение
ValeryS, ещё в кубе есть способ после целочисленного значения ставить заглавную "U"
во первых это не в кубе а в языке С, а во вторых как это относится к моему вопросу
Цитата Сообщение от ValeryS Посмотреть сообщение
отладчик то какой?
0
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
15.10.2025, 08:21  [ТС]
Я вошёл в процедуру:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}
и обнаружил что переменная "Delay" равняется входной переменной "adcResult" (972), это значение передаётся нормально в "wait", которая после цикла равняется 973. - как это понимать? - Что делать - чтоб понять дальше?

Мне кажется - используется компилированный ранее код этой процедуры - при первоисточнике которого было использовано значение "2".

***
Какими кнопками можно пошагово трассировать с заходом и "без" в процедуру? А-то я каждый раз делаю сборку по F11 и отладку с брек-поинтами по F8...

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
отладчик то какой?
В смысле? по умолчанию - GCC.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,490
Записей в блоге: 3
15.10.2025, 10:20
Цитата Сообщение от Levontay Посмотреть сообщение
В смысле? по умолчанию - GCC.
В смысле gcc - это компилятор. Спрашивают про отладчик - что подключено к камню (плате)? Через что прошиваешь/отлаживаешь?
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
15.10.2025, 11:59
Цитата Сообщение от Levontay Посмотреть сообщение
Я вошёл в процедуру HAL_Delay()
Цитата Сообщение от Levontay Посмотреть сообщение
и обнаружил что переменная "Delay" равняется входной переменной "adcResult" (972)
Чему равно при разном положении движка переменника?
Проверьте при крайне правом, при среднем и крайне левом положении и напишите какие будут цифры.
И еще объясните как так вышло что
Цитата Сообщение от Levontay Посмотреть сообщение
От АЦП приходят значения в диапазоне от 3800 до 4300 при полном провороте потенциометра
Почему не от 0 до 4095? Как переменник подключили?
Цитата Сообщение от Levontay Посмотреть сообщение
Какими кнопками можно пошагово трассировать с заходом и "без" в процедуру? А-то я каждый раз делаю сборку по F11 и отладку с брек-поинтами по F8...
Зависит от IDE.
Откройте меню отладчика и посмотрите какие кнопки назначены на какие действия.
Цитата Сообщение от Levontay Посмотреть сообщение
В смысле? по умолчанию - GCC.
GGC это не отладчик.
Тем более не аппаратный. Наверное имелось в виду используете ST-Link, J-link или еще что-то? И со стороны компа что?
0
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
15.10.2025, 13:21  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
отладчик - что подключено к камню
А-а! - программатор!: STLink...

Цитата Сообщение от locm Посмотреть сообщение
Почему не от 0 до 4095?
Так я про это "у вас" спрашиваю.

Щас замерил - напряжения "не те" - буду перепаивать.

Собственно вопрос был не про напряжения - а про чихорду в библиотечной! процедуре (и, напомню - про таймер).
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
15.10.2025, 13:37
Цитата Сообщение от Levontay Посмотреть сообщение
Так я про это "у вас" спрашиваю.
Думаете мы тут экстрасенсы чтобы ответить на это не видя схемы и всего кода?
Может где-то накосячили при сборке или комплектующие неисправны, как мы это узнаем?
Цитата Сообщение от Levontay Посмотреть сообщение
Щас замерил - напряжения "не те" - буду перепаивать.
С этого нужно было начинать - перепроверять сборку.
Цитата Сообщение от Levontay Посмотреть сообщение
Собственно вопрос был не про напряжения - а про чихорду в библиотечной! процедуре
У меня она работает правильно. У других тоже. Вывод?
0
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
15.10.2025, 14:20  [ТС]
Подправил напряжения; проследил соответствие на АЦП: 200-3700 получается.
Для быстрого мелькания поделил выход на 5 - получил меньше тысячи периода для HAL_Delay.
По трассировке "внутри" я замечаю что внутренняя переменная "wait" изменяется на единицу в любом случае (как я и писал выше), и происходит это в цикле:

C
1
2
3
4
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
- при этом отладка виснет - ибо цикл "уходит в мир богов и демонов".
Собственно мне кажется подозрительным - странное приращение в итерации - на "(uint32_t)(uwTickFreq)": это получается - что при каждой итерации мы объявляем новую переменную - так-ли? "uwTickFreq" типа "HAL_TickFreqTypeDef" имеет значение "HAL_TICK_FREQ_1KHZ" - это что с чем совместимо? - странно...

***
Другая прога с АЦП - где задержка делается зацикливанием "HAL_Delay с константой" - заработала нормально.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
15.10.2025, 16:14
Цитата Сообщение от Levontay Посмотреть сообщение
А-а! - программатор!: STLink...
отладчик в смысле программа.
Если это STM32CubeIDE то для проверки переменных без остановки программы нужно переменную подсоединить в окно Live Expressions
0
-70 / 9 / 1
Регистрация: 18.09.2020
Сообщений: 1,546
15.10.2025, 20:07  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
окно Live Expressions
Это что-ли?:



- пусто...





Цитата Сообщение от ValeryS Посмотреть сообщение
дчик в смысле программа
Есть такое: "GDB Hardware debaging".
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
15.10.2025, 20:34
Цитата Сообщение от Levontay Посмотреть сообщение
пусто...
переменная должна быть глобальной, локальная может быть расположена в регистре
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2025, 20:34
Помогаю со студенческими работами здесь

Cube+Coocox+SD Card (SDIO)
Всех приветствую! Люди помогите решить проблему. Кто делал такую связку Cube+Coosox+SD Card...

Документация к HAL и CUBE на русском
Считаю, что незаслуженно мало инфы на русском по теме HAL для STM32. Сразу скажу, что HAL не...

cube + keil disk_timerproc
Доброе время суток, собираю проект на FatFS, сил моих уже нет, не могу скомпилировать, Добавил...

STM32F103 + Cube + SD
Всем день добрый! Делаю логгер. Объем записываемых данных - около 120кб/мин. Записываю по 512 байт...

STM32F105 Cube USB VCP Unknown device
День добрый! Была платка с STM32F103, посадил на нее STM32F105 камень. Разведены только линии DP...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru