Jump to content
minas

Ошибки в задержке HAL_DELAY

Recommended Posts

Posted (edited)

Просьба не кидать тапками.

Экспериментирую с discovery f4. Суть эксперимента передать данные с компа на отладочную плату по uart массив из 5 символов, где с 1 по 4 символы указывают какой светодиод должен зажечься, а 5 символ указывает задержку в секундах. Используется DMA.

Например, посылается команда в uart в виде "10001"  это означает что зажечь Led1  и с интервалом в 1 сек от Led1 переключать светодиоды по кругу в основном цикле. Команда "00015" - зажечь Led4 и с интервалом в 5 сек от этого переключать светодиоды с этим интервалом в основном цикле.

Задержку использую HAL_DELAY. 

Основная проблема в том, что в HAL_Delay(0x3E8*(rxBuf[4]-0x30)) в самой первой проверке у меня, в основном цикле, не получается сформировать задержку, т.е. подаю например "10001" в итоге горит только LED1 и дальше переключение не происходит. 

0x3E8 - это 1000 в hex, rxBuf[4] - char из uart, 0x30 смещение в ASCII

Чтобы не загаживать тему прикрепил main

  while (1)
  {

		if (rxBuf[0]=='1')
		{

			HAL_Delay(0x3E8*(rxBuf[4]-0x30));
			HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);
			HAL_Delay(0x3E8*(rxBuf[4]-0x30));
			HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
			HAL_Delay(0x3E8*(rxBuf[4]-0x30));
			HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
			HAL_Delay(0x3E8*(rxBuf[4]-0x30));
			HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

		}

		//////////
  }
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
	
if(rxBuf[0] =='1')
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
			chn = 12;
			printf("LED_12 ON\r\n");
}
else
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
			chn = 120;
			printf("LED_12 OFF\r\n");
}

if(rxBuf[1] =='1')
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
			chn = 13;
			printf("LED_13 ON\r\n");
}
else
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
			chn = 130;
			printf("LED_13 OFF\r\n");
}

if(rxBuf[2] =='1')
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
			chn = 14;
			printf("LED_14 ON\r\n");
}
else
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
			chn = 140;
			printf("LED_14 OFF\r\n");
}

if(rxBuf[3] =='1')
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
			chn = 15;
			printf("LED_15 ON\r\n");
}
else
{
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
			chn = 150;
			printf("LED_15 OFF\r\n");
}
if(rxBuf[4] >'0')
{
		printf("Time %d \r\n", (rxBuf[4]-0x30)*1000);
	
}


	HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxBuf, sizeof(rxBuf));
	

}

 

main.c

Edited by minas

Share this post


Link to post
Share on other sites

Я решал похожую задачу. 

Рекомендую переписать код так чтобы использовалось не вычисление значение задержки и помещалось в HAL_delay() , а вычислялось количество секунд и уже в цикле for() например , выполнялась задержка HAL_delay(1000);

К примеру если получили 5 секунд , то выполняем for() 5 раз а в нем помещена задержка в секунду . Так работать будет 100%. 


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites
15 hours ago, minas said:

и дальше переключение не происходит

Надо убрать все printf() из функции прерывания HAL_UART_RxCpltCallback().

Share this post


Link to post
Share on other sites

Время – деньги и наноамперы: применение часов реального времени Maxim Integrated

Зачем использовать внешнюю микросхему часов реального времени (RTC), а не внутренние RTC микроконтроллера? Хотя бы потому, что у RTC MAX31342 производства Maxim Integrated типовое потребление составляет 150 нА при 3 В и температуре 25°С, а у встроенных RTC одного из самых малопотребляющих микроконтроллеров при тех же условиях – примерно 370 нА.

Читать статью

48 минут назад, Yurkin2015 сказал:

Надо убрать все printf()

Я и не посмотрел что в колбеке творится. printf в колбеке приведет к зависанию камня .

В HAL_delay переменная у меня когда-то приводило к зависанию МК . 


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Решил проблему. Проблема оказалась не в printf а в том, что что DMA еще не получило данные от uart а while(1) уже молотит. В итоге, в первую задержку не заходят данные от из rxBuf[4].

Способ решения, не использовать DMA вовсе, либо поставить задержку в виде HAL_Delay(10) в while(1) тем самым выждать окончание приема данных(в правильном варианте вообще осуществлять проверку завершения приема).

И да printf в HAL_UART_RxCpltCallback вообще никак не влияет проверено 

 

Share this post


Link to post
Share on other sites
                     

Чип-резисторы Panasonic - технология мягких выводов и сертификация AEC-Q200

Технология мягких выводов чип-резисторов производства компании Panasonic. Обзор серий с оптимизированными параметрами: прецизионных тонкопленочных, токоизмерительных, антисерных, резисторов с повышенной стойкостью к статике и импульсным нагрузкам, резисторных сборок.

Читать статью

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • все там выпрямляется ..это примерная схема
    • Актуально. Полный набор резисторов 0805 + набор конденсаторов = 750 руб. Полный набор чип резисторов 0805 1 ом-10 мом. Ряд Е-24 точность 5% В наборе: 169 номиналов (4225 шт). Набор состоит из семи пакетов: единицы ом - 1 R - 9,1 R десятки ом - 10 R - 91 R сотни ом - 100 R - 910 R единицы Ком - 1 K - 9,1 K десятки Ком - 10 K - 91 K сотни Ком - 100 K - 910 K единицы мом - 1 М - 10 М Плюс набор чип, smd конденсаторов 0805 В наборе: 10 пф NPO 5% 50 V - 25 шт. 100 пф NPO 5% 50 V - 25 шт. 1000 пф X7R 10% 50 V - 25 шт. 0,01 мкф X7R 10% 50 V - 100 шт. 0,1 мкф X7R 10% 50 V - 100 шт. 1 мкф X7R 10% 50 V - 25 шт. Номиналы 0,01 мкф; 0,1 мкф по 100 шт., остальные по 25 шт., всего 6 ном. 300 шт. Все полоски промаркированы. Резисторы: Fenghua (H.K.) Electronics Ltd Конденсаторы: Samsung Electro-Mechanics
    • Они опираются на желание колониальной администрации править и воровать вечно, поддерживая у населения надежды на перемены и тем самым удерживая его от протестов. Нашим внукам будут рассказывать тоже самое, распродавая ресурсы, а в дальнейшем и территории.
    • Всё получилось. Нужно было в таймера1 понизить частоту. Я поставил 560 герц, теперь таймер0 успевает тикать.
    • Не, не ремонтировал. Я вообще ремонтами не занимаюсь. Электроника это мое хобби.
    • Думаю, никто не будет против, если выложите ее сюда. Хоть это и древность несусветная, а вдруг кому-нибудь поможет. Помню, попили они мне, молодому и неопытному, кровушки...
    • Если только на 1 Ом, и греться будет не хуже двигателя в вашем авто.
×
×
  • Create New...