Всем привет! Пытаюсь реализовать bidir DSHOT300 это протокол цифрового управления драйвером бесщеточного двигателя(подробно написано тут). За основу взял библиотеку на HAL.
Если вкратце то вся суть протола заключается в том чтобы по одному проводу передать 16 бит с управляющим значением для двигателя, а затем драйвер в ответ отправляет 16 бит со значением оборотов двигателя. Вот это знаечение и не получается получить.
Написал вот такой индийский код и пытаюсь в прерывании таймера считывать в буфер поступающий пакет после получения отправляю его по UART.
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */
readeRPM ();
/* USER CODE END TIM4_IRQn 1 */
}
void readeRPM (){
if (flag == 1 ) // включется в прерывании после передачи пакета DMA
{
if((GPIOB->IDR & GPIO_PIN_6) == (uint32_t)GPIO_PIN_RESET) {
readStr = 1; // разрешенаем заполнение буфера
}
}
if(flag == 1 && readStr == 1) {
uint8_t val = (GPIOB->IDR & GPIO_PIN_6) >> 6;
(val > 0) ? (val |= 49) : (val |= 0);
*(str + i) = val;
if(i > 12) {
*(str + i + 1) = '\r';
*(str + i + 2) = '\n';
i = 0;
readStr = 0;
flag = 0;
HAL_UART_Transmit_IT(&huart1, (uint8_t*)str, 18); //отправляем по UART
}else{
i++;
}
}
}
На выходе получаю непонятную картину.
У меня подозрения что вся проблема в прерываниях. Если дергать ногой в прерываниях таймера то получаем:
Подскажите пожалуйста что делаю не так?
Добрый день, первая мысль, что что-то не так с временными интервалами, но по факту, конечно, надо детально смотреть с отладчиком, анализатором итд