STM32+RTOS проблема с работой таймеров в прерываниях

Кто любит RISC в жизни, заходим, не стесняемся.

Аффтар выпей йаду!

Пей!
3
100%
Остынь.
0
Голосов нет
 
Всего голосов: 3

Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Эволюционирую проект из Bare Metal до RTOS использую CubIDE.
В проекте АЦП работает по прерыванию от таймера, в прерывании цикл с остановом по тикам таймера - дергает ножками АЦП для её запуска.
В RTOS сделать цикл с остановкой по таймеру не удаётся.
Спойлер

Код: Выделить всё

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
 if (htim->Instance == TIM1)
{
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);

			for (volatile __IO uint32_t i = 0, f = 0; f <255 ;[b][u] f =  htim->Instance->CNT[/u][/b])
			{
				 i = htim->Instance->CNT;
				if (i > 6)
					f = 255;
				if(htim->Instance->CNT != last)
				{
					HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
					last = htim->Instance->CNT;
				}
			}
}
}
Не запускается, а вот плохой костыль:
Спойлер

Код: Выделить всё

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
 if (htim->Instance == TIM1)
{
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);

			for (volatile __IO uint32_t i = 0, f = 0; f <255 ; [b][u]f ++[/u][/b])
			{
				 i = htim->Instance->CNT;
				if (i > 6)
					f = 255;
				if(htim->Instance->CNT != last)
				{
					HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
					last = htim->Instance->CNT;
				}
			}
}
}
Работает и показывает ожидаемую картинку в 3 импульса.
:oops: Помогите кто чем может. Отладчик в обоих случаях значения

Код: Выделить всё

htim->Instance->CNT
не показывает - всегда 0.
Хочу понять что я не так делаю и как мне реализовать требуемый функционал - цикл в котором буду дергать ножки АЦП контролируя временные интервалы.
____________________________
Поделиться рецептом можно в ЛС
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение tonyk »

Какой вопрос такой ответ.

Начнём с простого. АЦП внешний? Какой именно?
Реклама
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение AVI-crak »

Что это??? И под какими веществами написано???
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Вещества все забористые, иное уже не берет. Не могу никак запустить цикл по таймеру в прерываниях. Без подключения RTOS работает.
АЦП внешний. Какой именно не суть важно, формулировка была неудачная в первом сообщении - проблема с таймерами, а не с АЦП. Просто нужно ткнуть носом, что не так с таймерами.
____________________________
Поделиться рецептом можно в ЛС
Реклама
Эиком - электронные компоненты и радиодетали
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

таймер - это не счётчик. Забудьте о существовании CNT
Не удивлюсь, если то что Вы хотите таймер может выполнять сам. А чтоб это настроить читайте как устроены таймеры у stm32 (или у Вас другая платформа?)
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение tonyk »

The_Blind_WatchMaker писал(а):АЦП внешний. Какой именно не суть важно
Суть важно. Есть подозрение, что ТС не с того бока подходит к вопросу. Глядя на обработчик прерывания, у меня тоже возник вопрос о веществах, принятых ТС перед его написанием.
Реклама
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Счас буду нести бред:
Как позже выяснилось проблема не совсем с RTOS в новом проекте без ОС тоже повторяется.
У меня работает в другом проекте на этой же отладочной плате из этого же STM32CubeIDE: один таймер вызывает прерывание каждые 100 мкс, другой используется для контроля времени выхода из прерывания и контроля тайминга дергания ножками внешней АЦП.
В последующих проектах воспроизвести этот функционал не удаётся :oops: с одинаковыми настройками...
Причём самый бред в том, что:
Спойлер

Код: Выделить всё

for (uint32_t i = 0, f = 0;(  (__HAL_TIM_GET_COUNTER(htim) < 6) ); f ++ ) //(f < 255) &&   - не работает
for (uint32_t i = 0, f = 0;(  (f < 255) &&(__HAL_TIM_GET_COUNTER(htim) < 6) ); f ++ ) // работает как и хотелось до 6 тиков
В чём магия? Отладчик ни в одном случае CNT регистр таймеров мне не показывает...

Добавлено after 4 minutes 25 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4392433#p4392433"]
The_Blind_WatchMaker писал(а):АЦП внешний. Какой именно не суть важно
Суть важно. Есть подозрение, что ТС не с того бока подходит к вопросу. Глядя на обработчик прерывания, у меня тоже возник вопрос о веществах, принятых ТС перед его написанием.[/uquote]
В обработчике простой код для проверки - дергаю ножкой, которая поближе ко мне, чтобы в неё щупом тыкать поудобней было.
____________________________
Поделиться рецептом можно в ЛС
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение VladislavS »

Код: Выделить всё

while(__HAL_TIM_GET_COUNTER(htim)<6);
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4392455#p4392455"]

Код: Выделить всё

while(__HAL_TIM_GET_COUNTER(htim)<6);
[/uquote]
Как раз с этого всё и началось код в файле подготовленном для управления АЦП содержал:

Код: Выделить всё

while ((__HAL_TIM_GET_COUNTER(htim) < Start_Limit) && !flag_2)
И теперь оно не работает... почему я ника не пойму :oops:

Код: Выделить всё

for (uint32_t i = 0, f = 0;( (f < 255) && (__HAL_TIM_GET_COUNTER(htim) < 6) ); f ++ ) //
Это уже кривые потуги разобраться в чём дело, я ж не такой профи, чтобы ассемблер вызывать и вообще.
Могу штатный дебаггер запустить, но он не помогает, CNT всегда пустой...
Есть мысль, что какой-то системный счётчик срабатывает пока в конструкции "while(__HAL_TIM_GET_COUNTER(htim)<6)" счетчик CNT не меняется, система считает, что получился "бесконечный цикл".
А если в условии добавляется "(f < 255) && (__HAL_TIM_GET_COUNTER(htim) < 6)" и в цикле " f ++ ", то такой ошибки не возникает.
Но из меня специалист так себе... ткните носом пжлст.
____________________________
Поделиться рецептом можно в ЛС
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение VladislavS »

Не надо мудрить. Если задача подождать пока счётчик станет равен 6, то так и надо писать "подождать пока счётчик меньше 6". Если не работает, то либо счётчик не тикает, либо читается не тот счётчик. Открываем отладчик, листинг и смотрим. Введение 100500 переменных-счётчиков цикла только усложняет отладку. Вот скажите, зачем в цикле переменная i ? Ну так, чисто поржать.
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Грешно смеяться над больными людьми. Стыдно.
Лучше подскажите почему в цикле условие по таймеру не хочет работать без дополнительных 100500 переменных счётчиков цикла...
____________________________
Поделиться рецептом можно в ЛС
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение VladislavS »

Если не работает, то либо счётчик не тикает, либо читается не тот счётчик.
Эти два варианта, я так понимаю, вы уже проверили?
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

Проверил на 3-х платах: STM32CubeIDE (WIN) STM32F429ZI Disco, STM32F429ZI NUCLEO; STM32CubeIDE (Lin) STM32F429ZI Disco, STM32F429ZI NUCLEO, STM32F103C6T6.
//f103C6T6
Спойлер

Код: Выделить всё

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	int f = 0;
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
	while ((__HAL_TIM_GET_COUNTER(htim) < 16) && (f < 65534) ) //&& (f < 65534)
	{
		f++;

		if (__HAL_TIM_GET_COUNTER(htim) != last)
		{
			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
			last = __HAL_TIM_GET_COUNTER(htim);
		}
	}
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13, GPIO_PIN_RESET);
}
/* USER CODE END 4 */
//F429ZI (Nucleo & Discovery)
Спойлер

Код: Выделить всё

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	int f = 0;
	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
	while ((__HAL_TIM_GET_COUNTER(htim) < 6) & (f < 200))
	{
		f++;

		if (__HAL_TIM_GET_COUNTER(htim) != last)
		{
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
			last = __HAL_TIM_GET_COUNTER(htim);
		}
	}
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9, GPIO_PIN_RESET);
}
/* USER CODE END 4 */
Нигде не работает условие вида "while (__HAL_TIM_GET_COUNTER(htim) < 6)" только если условие "while ((__HAL_TIM_GET_COUNTER(htim) < 16) && (f < 65534) )" и в коде "f++".
СпойлерУ f103C6T6 медленно пины переключаются, на разницу "(__HAL_TIM_GET_COUNTER(htim) < 6)" и "(__HAL_TIM_GET_COUNTER(htim) < 16)" не стоит обращать внимания
Добавлено after 3 minutes 22 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=4392509#p4392509"]
Если не работает, то либо счётчик не тикает, либо читается не тот счётчик.
Эти два варианта, я так понимаю, вы уже проверили?[/uquote]
Проверил. Когда "работает" я вижу на осциллографе то количество фронтов которое и ожидал - 6 для F429 и 8 для F103 (код выше). У 103 медленно ноги дергает потому фронты 1 к 2 тикам таймера. Я так думаю.
____________________________
Поделиться рецептом можно в ЛС
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

HAL_TIM_PeriodElapsedCallback

это не вызов при переполнении? и CNT=0?
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

[uquote="a797945",url="/forum/viewtopic.php?p=4392556#p4392556"]HAL_TIM_PeriodElapsedCallback

это не вызов при переполнении? и CNT=0?[/uquote]

Таймер же в этот момент начинает с 0 считать, верно? В это же суть прерываний и организации "Real Time" кода? Я и собираюсь первые несколько тиков взять на подёргать ножками. В чём прикол я не понял. Вещества тяжелые с юмором туго.
____________________________
Поделиться рецептом можно в ЛС
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

когда Вы включаете счетчик по f - зависаете в одном обработчике, и у таймера есть время по тикать;
нет этого счетчика - Вы каждый раз в новом прерывании и cnt опять еще только =0
Последний раз редактировалось a797945 Вт мар 28, 2023 14:21:04, всего редактировалось 1 раз.
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

[uquote="a797945",url="/forum/viewtopic.php?p=4392562#p4392562"]когда Вы включаете счетчик по f - зависаете в одном обработчике,
нет этого счетчика - Вы каждый раз в новом прерывании и cnt опять еще только =0[/uquote]
А почему так-то? Я хотел, чтобы код вида:
Спойлер

Код: Выделить всё

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
   while ((__HAL_TIM_GET_COUNTER(htim) < 6) )
   {
      if (__HAL_TIM_GET_COUNTER(htim) != last)
      {
         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
         last = __HAL_TIM_GET_COUNTER(htim);
      }
   }
   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9, GPIO_PIN_RESET);
}
/* USER CODE END 4 */
дал мне 6 фронтов вот и всё, а почему без без "f" не получается я не понимаю, но вряд-ли дело в выходе из прерывания. Т.к. когда код имеет вид как в этом посте ничего не работает HardFault как я понимаю.
Я выше писал
Спойлер
Есть мысль, что какой-то системный счётчик срабатывает пока в конструкции "while(__HAL_TIM_GET_COUNTER(htim)<6)" счетчик CNT не меняется, система считает, что получился "бесконечный цикл".
А если в условии добавляется "(f < 255) && (__HAL_TIM_GET_COUNTER(htim) < 6)" и в цикле " f ++ ", то такой ошибки не возникает.
Но из меня специалист так себе...
Мысль в общем такая, но как это выявить я не знаю.
____________________________
Поделиться рецептом можно в ЛС
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

я не знаю Хал, первая ссылка гугля про HAL_TIM_PeriodElapsedCallback сказала - это обработчик по переполнению - т.е. таймер оттикал период и снова =0.
с помощью Вашего f++ - Вы ЗАДЕРЖИВАЕТЕСЬ в обработчике и можете дождаться нужного тика таймера.

у таймера есть каналы и флаги, на необходимость пользоваться CNT я пока не натыкался.
Последний раз редактировалось a797945 Вт мар 28, 2023 14:35:23, всего редактировалось 1 раз.
Аватара пользователя
The_Blind_WatchMaker
Родился
Сообщения: 14
Зарегистрирован: Вт ноя 29, 2022 12:17:58
Откуда: Деревенский

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение The_Blind_WatchMaker »

[uquote="a797945",url="/forum/viewtopic.php?p=4392572#p4392572"]я не знаю Хал, первая ссылка гугля про HAL_TIM_PeriodElapsedCallback сказала - это обработчик по переполнению - т.е. таймер оттикал период и снова =0.
с помощью Вашего f++ - Вы ЗАДЕРЖИВАЕТЕСЬ в обработчике и можете дождаться нужного тика таймера.[/uquote]
Я думал, что while ((__HAL_TIM_GET_COUNTER(htim) < 6) ) в функции HAL_TIM_PeriodElapsedCallback обеспечит мне задержку в прерывании на 6 тиков таймера, но такой код вызывает системную ошибку.
А как мне добиться выполнения кода вида
Спойлер

Код: Выделить всё

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
   while ((__HAL_TIM_GET_COUNTER(htim) < 6) )
   {
      if (__HAL_TIM_GET_COUNTER(htim) != last)
      {
         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
         last = __HAL_TIM_GET_COUNTER(htim);
      }
   }
   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9, GPIO_PIN_RESET);
}
/* USER CODE END 4 */
без костылей в виде "f++"?
____________________________
Поделиться рецептом можно в ЛС
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32+RTOS проблема с работой таймеров в прерываниях

Сообщение a797945 »

это я уже не внимательно читаю.

вопрос сводится к тому, что есть проблемы с поллингом регистра CNT ?
попробуйте пост проверку do{}while()
или посмотреть во что компилится
Ответить

Вернуться в «ARM»