minas Опубликовано 5 апреля, 2020 Поделиться Опубликовано 5 апреля, 2020 (изменено) Просьба не кидать тапками. Экспериментирую с 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 Изменено 5 апреля, 2020 пользователем minas 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 6 апреля, 2020 Поделиться Опубликовано 6 апреля, 2020 Я решал похожую задачу. Рекомендую переписать код так чтобы использовалось не вычисление значение задержки и помещалось в HAL_delay() , а вычислялось количество секунд и уже в цикле for() например , выполнялась задержка HAL_delay(1000); К примеру если получили 5 секунд , то выполняем for() 5 раз а в нем помещена задержка в секунду . Так работать будет 100%. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Yurkin2015 Опубликовано 6 апреля, 2020 Поделиться Опубликовано 6 апреля, 2020 15 hours ago, minas said: и дальше переключение не происходит Надо убрать все printf() из функции прерывания HAL_UART_RxCpltCallback(). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
artos5 Опубликовано 6 апреля, 2020 Поделиться Опубликовано 6 апреля, 2020 48 минут назад, Yurkin2015 сказал: Надо убрать все printf() Я и не посмотрел что в колбеке творится. printf в колбеке приведет к зависанию камня . В HAL_delay переменная у меня когда-то приводило к зависанию МК . 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
minas Опубликовано 7 апреля, 2020 Автор Поделиться Опубликовано 7 апреля, 2020 Решил проблему. Проблема оказалась не в printf а в том, что что DMA еще не получило данные от uart а while(1) уже молотит. В итоге, в первую задержку не заходят данные от из rxBuf[4]. Способ решения, не использовать DMA вовсе, либо поставить задержку в виде HAL_Delay(10) в while(1) тем самым выждать окончание приема данных(в правильном варианте вообще осуществлять проверку завершения приема). И да printf в HAL_UART_RxCpltCallback вообще никак не влияет проверено 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.