Тутанхаман
Вт 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 не выводит данные, как вы ожидаете.
Вы пробовали две синие таблетки, передающие данные друг другу?
Или между ПК и АД через USB -серийный адаптер?
Вы проверяли с помощью входящих данных? Может быть, модуль HC не выводит данные, как вы ожидаете.
Тутанхаман
Ср. 06 декабря 2017 г. 5:49
Я подключил свой STM32F103 с arduino nano непосредственно через UART, и результат такой же, я.эн. Я посылаю 10 байтов каждые 5 секунд из Arduino, но STM32 получает случайным образом только 1-5 байтов. Передача данных в противоположном направлении работает просто идеально. Итак, теперь есть три возможности -
1. Проблема с этим конкретным устройством (я сомневаюсь в этом из -за поведения одинакова для всех трех портов UART)
2. Проблема с моим кодом (я не вижу, что именно может быть неправильно, кроме того, я пробовал много разных комбинаций)
3. Проблема с жесткой реализацией в библиотеке arduino_stm32 (она также не выглядит реальной, потому что я не вижу, чтобы никто другой испытывал ту же ошибку)
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.
Луча
Кроме того, последовательное устройство на передачу устройства может смешать любого. Несколько лет назад я построил подразделение QBF Arduino для отправки и получения 4800/9600 серийных потоков. Может я должен обновить дизайн, чтобы использовать BT.
https: // www.хакерс.io/rayburne/the-qb ... tor-ae7015
В любом случае, если у вас есть старая доска Mini/Micro AVR, вы можете построить себе QBF.
Луча
Маркб
Ср. 06 декабря 2017 г., 13:47
Что происходит в остальной части вашего кода?
Одна возможность, которая приходит на ум, заключается в том, что прерывания отключаются (или длинный (относительно серийного уровня символов) периода времени, проведенного в подпрограмме обслуживания прерывания) в каком -то другом разделе кода в течение достаточно длительного периода, чтобы вызвать серийный неправильно. Тест - это вырезать все, кроме минимума, необходимого для получения строки символов.
Это поднимает вопрос о том, как вы смотрите на полученные данные, чтобы увидеть, что это ошибочно. То есть он перешел обратно в Serial1/Bluetooth, другой порт или показан на локальном дисплее?
Одна возможность, которая приходит на ум, заключается в том, что прерывания отключаются (или длинный (относительно серийного уровня символов) периода времени, проведенного в подпрограмме обслуживания прерывания) в каком -то другом разделе кода в течение достаточно длительного периода, чтобы вызвать серийный неправильно. Тест - это вырезать все, кроме минимума, необходимого для получения строки символов.
Это поднимает вопрос о том, как вы смотрите на полученные данные, чтобы увидеть, что это ошибочно. То есть он перешел обратно в 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] - Что происходит в остальной части вашего кода?На самом деле, я сейчас работаю с минимальной конфигурацией, как я уже упоминаю, я подключил Arduino Nano к STM32 UART, который отправляет 10 байтов каждые 5 секунд, и проблема все еще есть. Единственное, что я связал с STM32, - это OLED -дисплей SSD1306, который я использую для отладки. Кроме того, я еду в светодиодной полосе WS2812B, так что, вероятно, это может быть причиной. Я постараюсь сделать минимальный набросок для расследования.
Одна возможность, которая приходит на ум, заключается в том, что прерывания отключаются (или длинный (относительно серийного уровня символов) периода времени, проведенного в подпрограмме обслуживания прерывания) в каком -то другом разделе кода в течение достаточно длительного периода, чтобы вызвать серийный неправильно. Тест - это вырезать все, кроме минимума, необходимого для получения строки символов.
Это поднимает вопрос о том, как вы смотрите на полученные данные, чтобы увидеть, что это ошибочно. То есть он перешел обратно в Serial1/Bluetooth, другой порт или показан на локальном дисплее?
Тутанхаман
Чт, 07 декабря 2017 г., 5:49
Я нашел происхождение проблемы. Я использую Fastled Library, которая отключает прерывания:
https: // github.com/fastled/fastled/uppense/488
Это очень разумно для вождения светодиодов, но это разрушает все остальное Итак, теперь я могу плавно управлять светодиодами, но я не могу получить через интерфейс UART (и не только UART) или, если я включу прерывания, анимация не будет такой плавной.
Итак, теперь у меня есть еще одна проблема - как получать данные на STM32F103 с отключенным прерыванием? Как я знаю, есть некоторые пользовательские реализации для Arduino, которые не используют прерывания, есть ли что -то подобное для библиотеки STM32_arduino?
Спасибо!
https: // github.com/fastled/fastled/uppense/488
Это очень разумно для вождения светодиодов, но это разрушает все остальное Итак, теперь я могу плавно управлять светодиодами, но я не могу получить через интерфейс UART (и не только UART) или, если я включу прерывания, анимация не будет такой плавной.
Итак, теперь у меня есть еще одна проблема - как получать данные на STM32F103 с отключенным прерыванием? Как я знаю, есть некоторые пользовательские реализации для Arduino, которые не используют прерывания, есть ли что -то подобное для библиотеки STM32_arduino?
Спасибо!
Rogerclark
Чт, 07 декабря 2017 г. 6:29 утра
Что вы делаете, которые нуждаются в светодиодах, включенных и выключенных в таких крайностях
Вы отправляете данные IR ?
Вы отправляете данные 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 и время и все остальное, поскольку он отключает прерывания (что вы не должны делать)
Есть 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 вольт, но у него есть регулятор напряжения. У меня эта интерфейсная плата: