Попытка сделать STM32F103 и HC-05 работать вместе

Тутанхаман
Вт 05 декабря 2017 г. 9:43 утра
У меня есть проект, где с одной стороны я использую телефон Android для управления STM32F103 MC через BT на другой стороне. Я использую библиотеку arduino_stm32 и Arduino Ide. У меня есть какое -то странное поведение с входящими данными. Я сделал простой тест, который отправляет 10 байт строки "0123456789" от Android на STM32, но я получаю только случайные 1-5 байт. Код на стороне STM32:
void TFT_write_cmd(uint16_t command){ GPIOD->ODR &= ~RS; GPIOD->ODR &= ~CS; GPIOD->ODR &= ~WR; GPIOE->ODR = command; HAL_Delay(1); GPIOD->ODR |= WR; HAL_Delay(1); GPIOD->ODR |= CS; GPIOD->ODR |= RS; HAL_Delay(1); } void TFT_write_data(uint16_t data){ GPIOD->ODR &= ~CS; GPIOD->ODR &= ~WR; GPIOE->ODR = data; HAL_Delay(1); GPIOD->ODR |= WR; HAL_Delay(1); GPIOD->ODR |= CS; HAL_Delay(1); } void writeRegister16(uint16_t reg, uint16_t data){ TFT_write_cmd(reg); TFT_write_data(data); }

Стивестронг
Вторник 05 декабря 2017 г. 9:55 утра
Кажется излишним использованием длинных переменных, я думаю, что "uint16_t" будет покрывать ваши потребности.

Вы пробовали две синие таблетки, передающие данные друг другу?
Или между ПК и АД через USB -серийный адаптер?

Вы проверяли с помощью входящих данных? Может быть, модуль HC не выводит данные, как вы ожидаете.

Тутанхаман
Ср. 06 декабря 2017 г. 5:49
Я подключил свой STM32F103 с arduino nano непосредственно через UART, и результат такой же, я.эн. Я посылаю 10 байтов каждые 5 секунд из Arduino, но STM32 получает случайным образом только 1-5 байтов. Передача данных в противоположном направлении работает просто идеально. Итак, теперь есть три возможности -

1. Проблема с этим конкретным устройством (я сомневаюсь в этом из -за поведения одинакова для всех трех портов UART)
2. Проблема с моим кодом (я не вижу, что именно может быть неправильно, кроме того, я пробовал много разных комбинаций)
3. Проблема с жесткой реализацией в библиотеке arduino_stm32 (она также не выглядит реальной, потому что я не вижу, чтобы никто другой испытывал ту же ошибку)

Rogerclark
Ср. 06 декабря 2017 г. 8:46 утра
Уровни напряжения ??

Стивестронг
Ср 6 декабря 2017 г. 9:47
Помимо того, что указал Роджер (уровни напряжения), как вы интерпретируете полученные байты? Я не вижу этого в вашем коде.
Иногда должна быть сброшена переменная «полученная», где вы это делаете?

Пожалуйста, опубликуйте простой набросок, который позволяет нам воспроизводить вашу проблему.

Пито
Ср. 06 декабря 2017 г. 13:01
Как насчет In file included from C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:32:0: C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.h:362:17: error: conflicting declaration 'SPIClass SPI' extern SPIClass SPI;//(1);// dummy params ^ In file included from C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\cores\maple/wirish.h:49:0, from C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.h:47, from C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:32: C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\cores\maple/libmaple/HardwareSPI.h:276:20: error: 'SPI' has a previous declaration as 'HardwareSPI SPI' extern HardwareSPI SPI; ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp: In member function 'uint8 SPIClass::dmaTransfer(uint8*, uint8*, uint16)': C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:380:63: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_attach_interrupt(dma_dev*, dma_stream, void (*)())' dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:385:82: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_setup_transfer(dma_dev*, dma_stream, volatile void*, volatile void*, volatile void*, uint32, uint32)' receiveBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT));// receive buffer DMA ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:386:45: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_set_num_transfers(dma_dev*, dma_stream, uint16)' dma_set_num_transfers(DMA1, DMA_CH2, length); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:394:84: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_setup_transfer(dma_dev*, dma_stream, volatile void*, volatile void*, volatile void*, uint32, uint32)' transmitBuf, DMA_SIZE_8BITS, (DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit FF repeatedly ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:398:101: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_setup_transfer(dma_dev*, dma_stream, volatile void*, volatile void*, volatile void*, uint32, uint32)' transmitBuf, DMA_SIZE_8BITS, (DMA_MINC_MODE | DMA_FROM_MEM | DMA_TRNS_CMPLT));// Transmit buffer DMA ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:400:45: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_set_num_transfers(dma_dev*, dma_stream, uint16)' dma_set_num_transfers(DMA1, DMA_CH3, length); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:402:26: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_enable(dma_dev*, dma_stream)' dma_enable(DMA1, DMA_CH2);// enable receive ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:403:26: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_enable(dma_dev*, dma_stream)' dma_enable(DMA1, DMA_CH3);// enable transmit ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:419:30: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_disable(dma_dev*, dma_stream)' dma_disable(DMA1, DMA_CH3); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:420:27: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_disable(dma_dev*, dma_stream)' dma_disable(DMA1, DMA_CH2); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp: In member function 'uint8 SPIClass::dmaSend(uint8*, uint16, bool)': C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:437:63: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_attach_interrupt(dma_dev*, dma_stream, void (*)())' dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:442:58: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_setup_transfer(dma_dev*, dma_stream, volatile void*, volatile void*, volatile void*, uint32, uint32)' transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:443:45: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_set_num_transfers(dma_dev*, dma_stream, uint16)' dma_set_num_transfers(DMA1, DMA_CH3, length); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:444:26: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_enable(dma_dev*, dma_stream)' dma_enable(DMA1, DMA_CH3);// enable transmit ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:451:27: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_disable(dma_dev*, dma_stream)' dma_disable(DMA1, DMA_CH3); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp: In member function 'uint8 SPIClass::dmaSend(uint16*, uint16, bool)': C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:462:63: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_attach_interrupt(dma_dev*, dma_stream, void (*)())' dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:467:59: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_setup_transfer(dma_dev*, dma_stream, volatile void*, volatile void*, volatile void*, uint32, uint32)' transmitBuf, DMA_SIZE_16BITS, flags);// Transmit buffer DMA ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:468:45: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_set_num_transfers(dma_dev*, dma_stream, uint16)' dma_set_num_transfers(DMA1, DMA_CH3, length); ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:469:26: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_enable(dma_dev*, dma_stream)' dma_enable(DMA1, DMA_CH3);// enable transmit ^ C:\Users\Matjas\Documents\Arduino\hardware\Arduino_STM32\STM32F4\libraries\SPI\src\SPI.cpp:476:27: error: cannot convert 'dma_channel' to 'dma_stream' for argument '2' to 'void dma_disable(dma_dev*, dma_stream)' dma_disable(DMA1, DMA_CH3); ^ Error compiling

Mrburnette
Ср. 06 декабря 2017 г. 13:24
Вы всегда можете использовать свой компьютер, если он оснащен BT (для тестирования.)

Кроме того, последовательное устройство на передачу устройства может смешать любого. Несколько лет назад я построил подразделение QBF Arduino для отправки и получения 4800/9600 серийных потоков. Может я должен обновить дизайн, чтобы использовать BT.

https: // www.хакерс.io/rayburne/the-qb ... tor-ae7015

В любом случае, если у вас есть старая доска Mini/Micro AVR, вы можете построить себе QBF.


Луча

Маркб
Ср. 06 декабря 2017 г., 13:47
Что происходит в остальной части вашего кода?

Одна возможность, которая приходит на ум, заключается в том, что прерывания отключаются (или длинный (относительно серийного уровня символов) периода времени, проведенного в подпрограмме обслуживания прерывания) в каком -то другом разделе кода в течение достаточно длительного периода, чтобы вызвать серийный неправильно. Тест - это вырезать все, кроме минимума, необходимого для получения строки символов.

Это поднимает вопрос о том, как вы смотрите на полученные данные, чтобы увидеть, что это ошибочно. То есть он перешел обратно в Serial1/Bluetooth, другой порт или показан на локальном дисплее?

Тутанхаман
Ср. 06 декабря 2017 г. 16:58
Так много ответов! Спасибо, ребята!
[Rogerclark - Ср 6 декабря 2017 г. 8:46] - Уровни напряжения ??
Модуль HC-05 питается из STM32F103's +5V, а RX/TX подключены к выводам Tollerant PA9/PA10 5 В. Это то, что ты имел в виду? Извините, я не парень HW, я.эн. Это мои первые шаги :)
[Стивестронг - Ср 6 декабря 2017 г. 9:47] - Помимо того, что указал Роджер (уровни напряжения), как вы интерпретируете полученные байты? Я не вижу этого в вашем коде.
Иногда должна быть сброшена переменная «полученная», где вы это делаете?

Пожалуйста, опубликуйте простой набросок, который позволяет нам воспроизводить вашу проблему.
Я пишу все полученные байты в буфер, а затем вывожу их на дисплей SSD1306: C:\Users\Matjas\Documents\Arduino\libraries\Adafruit_SSD1351-STM32-master\Adafruit_SSD1351.cpp: In member function 'void Adafruit_SSD1351::spiwrite(uint8_t)': C:\Users\Matjas\Documents\Arduino\libraries\Adafruit_SSD1351-STM32-master\Adafruit_SSD1351.cpp:41:9: error: 'SPI' was not declared in this scope SPI.transfer(c); ^ C:\Users\Matjas\Documents\Arduino\libraries\Adafruit_SSD1351-STM32-master\Adafruit_SSD1351.cpp: In member function 'void Adafruit_SSD1351::begin()': C:\Users\Matjas\Documents\Arduino\libraries\Adafruit_SSD1351-STM32-master\Adafruit_SSD1351.cpp:356:9: error: 'SPI' was not declared in this scope SPI.begin(); ^ Error compiling.

Тутанхаман
Ср. 06 декабря 2017 г. 18:01
[Пито - Ср. 06 декабря 2017 г. 13:01] - \ Ps: afaik HC-05 ложится спать, когда не активен в течение 5 секунд.. Вы должны отправить символ в модуль, чтобы разбудить HC-05.
Спасибо за совет - я не знал этого. Но я не думаю, что это связано с проблемой, но я обязательно изменю свой код, чтобы избежать его.

Тутанхаман
Ср. 06 декабря 2017 г. 18:17
[Mrburnette - Ср. 06 декабря 2017 г. 13:24] - Вы всегда можете использовать свой компьютер, если он оснащен BT (для тестирования.)

Кроме того, последовательное устройство на передачу устройства может смешать любого. Несколько лет назад я построил подразделение QBF Arduino для отправки и получения 4800/9600 серийных потоков. Может я должен обновить дизайн, чтобы использовать BT.

https: // www.хакерс.io/rayburne/the-qb ... tor-ae7015

В любом случае, если у вас есть старая доска Mini/Micro AVR, вы можете построить себе QBF.


Луча
Спасибо, я уверен, что должен сделать один.

Тутанхаман
Ср. 06 декабря 2017 18:25
[Маркб - Ср. 06 декабря 2017 г. 13:47] - Что происходит в остальной части вашего кода?

Одна возможность, которая приходит на ум, заключается в том, что прерывания отключаются (или длинный (относительно серийного уровня символов) периода времени, проведенного в подпрограмме обслуживания прерывания) в каком -то другом разделе кода в течение достаточно длительного периода, чтобы вызвать серийный неправильно. Тест - это вырезать все, кроме минимума, необходимого для получения строки символов.

Это поднимает вопрос о том, как вы смотрите на полученные данные, чтобы увидеть, что это ошибочно. То есть он перешел обратно в Serial1/Bluetooth, другой порт или показан на локальном дисплее?
На самом деле, я сейчас работаю с минимальной конфигурацией, как я уже упоминаю, я подключил Arduino Nano к STM32 UART, который отправляет 10 байтов каждые 5 секунд, и проблема все еще есть. Единственное, что я связал с STM32, - это OLED -дисплей SSD1306, который я использую для отладки. Кроме того, я еду в светодиодной полосе WS2812B, так что, вероятно, это может быть причиной. Я постараюсь сделать минимальный набросок для расследования.

Тутанхаман
Чт, 07 декабря 2017 г., 5:49
Я нашел происхождение проблемы. Я использую Fastled Library, которая отключает прерывания:

https: // github.com/fastled/fastled/uppense/488

Это очень разумно для вождения светодиодов, но это разрушает все остальное :( Итак, теперь я могу плавно управлять светодиодами, но я не могу получить через интерфейс UART (и не только UART) или, если я включу прерывания, анимация не будет такой плавной.

Итак, теперь у меня есть еще одна проблема - как получать данные на STM32F103 с отключенным прерыванием? Как я знаю, есть некоторые пользовательские реализации для Arduino, которые не используют прерывания, есть ли что -то подобное для библиотеки STM32_arduino?

Спасибо!

Rogerclark
Чт, 07 декабря 2017 г. 6:29 утра
Что вы делаете, которые нуждаются в светодиодах, включенных и выключенных в таких крайностях

Вы отправляете данные IR ?

Тутанхаман
Чт, 07 декабря 2017 г. 8:39
Мне нужно обновить 600 x ws2812b светодиоды 60 раз в секунду в секунду :)

Rogerclark
Чт, 07 декабря 2017 г. 8:56 утра
Вы должны были упомянуть, что в своем посте

Есть 2 или 3 либера

Попробуйте GOOGLING FORUM для WS2812B, так как шанс найти LIBS, как и мой (кроме того, что у меня есть тот, который я написал в своем аккаунте GitHub), а один был написан, мой Рик Кимбалл, я не могу вспомнить, кто написал 3 -й

Либе, которую вы используете, вероятно, с тем, с которой я начал, и это просто слегка модифицированная версия Adafruit Lib и ломает USB и время и все остальное, поскольку он отключает прерывания (что вы не должны делать)

Тутанхаман
Чт, 07 декабря 2017 г., 19:19
Спасибо! Я думаю, что вы правы, и мне лучше найти лучшую реализацию WS2812B, так что я собираюсь копаться в этом.

Пито
Пт 08 декабря 2017 г. 12:29
Модуль HC-05 питается из STM32F103's +5V, а RX/TX подключены к выводам Tollerant PA9/PA10 5 В. Это то, что ты имел в виду? Извините, я не парень HW, Модуль ванильного HC-05 3 равен 3.3v VCC, если это не модуль с 5 В->3.Регулятор напряжения 3 В (HC-05 установлен на плате прорыва).

Тутанхаман
Пт, 08 декабря 2017 г., 17:23
[Пито - Пт, 08 декабря 2017 г. 12:29] - Модуль HC-05 питается из STM32F103's +5V, а RX/TX подключены к выводам Tollerant PA9/PA10 5 В. Это то, что ты имел в виду? Извините, я не парень HW, Модуль ванильного HC-05 3 равен 3.3v VCC, если это не модуль с 5 В->3.Регулятор напряжения 3 В (HC-05 установлен на плате прорыва).
Я кормлю его 5 вольт, но у него есть регулятор напряжения. У меня эта интерфейсная плата:
Изображение