Перейти к содержанию

minas

Members
  • Постов

    2
  • Зарегистрирован

  • Посещение

Электроника

  • Стаж в электронике
    3-5 лет

Достижения minas

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

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

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

    Просьба не кидать тапками. Экспериментирую с 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
×
×
  • Создать...