Jump to content
Sign in to follow this  
Desert _Eagl.5

Связь Stm32F103 С Labview

Recommended Posts

здраствуйте

Хотел бы связать контроллер stm32f103 с программой LabView но незнаю как это сделать.

Впринципи я работал с системой сбора данных (такая коробочка

post-151416-0-51427300-1366515916.jpg) тут все просто подключил куда нада и все.

Так вот как можно наподобии того что выше подключить мк, может быть какнибудь через UART посылать данные в комп, а прогой их дальше обрабатывать?

Share this post


Link to post
Share on other sites

Ну задействуй UART в своём STM и шли в комп что хочешь.

В чём проблемы то?

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Материалы вебинара Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN

Опубликованы запись, ответы на вопросы и материалы вебинара, посвящённого преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре были рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату, также новая группа продукции – встраиваемые источники питания в кожухе.

Подробнее

Я с LabView не работал, не в курсах :( Это надо спрашивать там, где LabView обсуждают ...

Вот первая же ссылка из гугля по запросу "labviw com port" - http://www.automatio...read.php?t=5314 ....

Edited by hd44780

Share this post


Link to post
Share on other sites

Запускаем новый BLE 5.2-чип BlueNRG-LP от STMicroelectronics

Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.

Подробнее

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

  • Similar Content

    • By Tuxford
      С помощью STM32CubeMX сгенерил самый примитывний проект чтобы что-то принять-передать по USB. Все бы ничего, но обмена не происходит, хотя в системе устройство видно.
      Шаг за шагом обнаружил что приходит прерывание SOF, и просто скидывается. На этом финиш. И так постоянно. Находил проекты по эти борды (Blue pill, STM32 Smart), где собственно все то же. Но нифига не рабтает.

      Что же такого особенного в этом MCU особенного чтобы USB работал?
      PS. Пробывал делать тоже на STM32L4-Discovery. Работает старта. В чем разница?
      IOC в атаче.
      TestBP.ioc
    • By john2103
      Доброго времени суток, товарищи, пытаюсь создать функции передачи по spi с использованием cmsis и прерываний. Раньше пользовался HAL на "полу- интуитивном" уровне. Все работало. Сейчас пытаюсь все писать только на cmsis и вот возникла проблема... Я попытался сделать две функции ( Отправка по SPI - 8-битного  массива и передача 8 битная DFF = 0 и отправка 16 битного массива и передача 16 бит DFF =1 и все это через прерывания)Результат смотрю анализатором и вот в чем проблема... если сначала идет функция передачи 8 битная а потом 16 битная то мелькает лишняя передача, 8 бит 0x00 и потом идет правильная передача, 16 битная. Не могу понять откуда берется эта передача??? (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF) ,  если поставить передачи 8 бит 16 бит 8 бит 16 бит то получается вот это (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF 0xAA 0xBB 0xCC 0xFE 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF), если между функциями вставить задержку 1 мс то все ок иначе тот результат о котором писал ..."головной убор Михаила Боярского"
      void SPI1_STM32F1_init(void) { // --- Инициализация порта для работы spi --- // ------ Настраиваем порт А -------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //--- Включаем тактирование порта А RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //--- Включаем тактирование альтернативных функции RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //--- Включаем тактированние SPI1 // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_CNF7|GPIO_CRL_MODE5|GPIO_CRL_MODE7); //--- Обнуление первоначальных параметров порта GPIOA->CRL |= ( GPIO_CRL_MODE5 // --- |Настройка вывода SCL, на работу в режиме альтернативной функции |GPIO_CRL_CNF5_1 // --- |режим output mode 11b - max 50 Мгц, CNF = 10b Альтернативная функция output push-pull ) |GPIO_CRL_MODE7 // --- |Настройка вывода MOSI |GPIO_CRL_CNF7_1 // --- | ); // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF6|GPIO_CRL_CNF6); GPIOA->CRL |= GPIO_CRL_MODE6; SPI1->CR1 |= SPI_CR1_BIDIMODE; // --- BIDIMODE режим работы (1 - одна линия, 0 - две линии связи) SPI1->CR1 |= SPI_CR1_BIDIOE; // --- BIDIOE Этот бит в сочетании с битом BIDImode выбирает направление передачи в двунаправленном режиме // --- 0: Output disabled (receive-only mode) // --- 1: Output enabled (transmit-only mode) SPI1->CR1 &=~SPI_CR1_CRCEN; // --- Аппаратный расчет CRC включить // --- 0: расчет CRC отключен // --- 1: Расчет CRC включен SPI1->CR1 &= ~SPI_CR1_CRCNEXT; // --- Следующая передача данных будет завершаться CRC-кодом. // --- 0: Этап передачи данных // --- 1: Следующая передача завершится передачей RCR SPI1->CR1 &= ~SPI_CR1_DFF; // --- Формат кадра данных // --- 0: Размер кадра передачи 8 бит // --- 1: Размер кадра передачи 16 бит SPI1->CR1 &= ~SPI_CR1_RXONLY; // --- Этот бит совместно с BIDIMODE выбирает направление передачи в 2-х проводном (MISO и MISO) режиме. // --- 0: Full duplex — передача и прием // --- 1: Output disabled — только прием SPI1->CR1 |= SPI_CR1_SSM; // --- Программное управление ведомым устройством. Когда бит SSM установлен, сигнал NSS заменяется значением бита SSI. // --- 0: Программное управление ведомым отключено // --- 1: Программное управление ведомым включено SPI1->CR1 |= SPI_CR1_SSI; // --- Внутренний выбор ведомого. Этот бит работает только когда бит SSM установлен. Значение этого бита принудительно подается на NSS, а значение IO вывода NSS игнорируется. // --- 1: (Master) Заменяет значение на выводе NSS // --- 0; (Slave) SPI1->CR1 &= ~SPI_CR1_LSBFIRST;// --- Формат кадра // --- 0: MSB передается первым // --- 1: LSB передается первым SPI1->CR1 |= SPI_CR1_BR; // --- BR[2:0]: Выбор скорости передачи // 000: fPCLK/2 // 001: fPCLK/4 // 010: fPCLK/8 // 011: fPCLK/16 // 100: fPCLK/32 // 101: fPCLK/64 // 110: fPCLK/128 // 111: fPCLK/256 //#define SPI_CR1_BR_Pos (3U) //#define SPI_CR1_BR_Msk (0x7U << SPI_CR1_BR_Pos) /*!< 0x00000038 */ //#define SPI_CR1_BR SPI_CR1_BR_Msk /*!< BR[2:0] bits (Baud Rate Control) */ //#define SPI_CR1_BR_0 (0x1U << SPI_CR1_BR_Pos) /*!< 0x00000008 */ //#define SPI_CR1_BR_1 (0x2U << SPI_CR1_BR_Pos) /*!< 0x00000010 */ //#define SPI_CR1_BR_2 (0x4U << SPI_CR1_BR_Pos) /*!< 0x00000020 */ SPI1->CR1 |= SPI_CR1_MSTR; // --- Выбор режима работы SPI: Master/Slave // --- 0: Режим Slave (ведомый) // --- 1: Режим Master (ведущий) SPI1->CR1 &= ~SPI_CR1_CPOL; // --- Полярность тактового сигнала // --- 0: CK в 0 при простое // --- 1: CK в 1 при простое SPI1->CR1 &= ~SPI_CR1_CPHA; // --- Фаза тактового сигнала // --- 0: Первый переход тактового сигнала является краем захвата данных // --- 1: Второй переход тактового сигнала является краем захвата данных SPI1->CR2 &= ~SPI_CR2_TXEIE; // --- Прерывание опустошения буфера передачи данных Tx // --- 0: Прерывание TXE запрещено // --- 1: Прерывание TXE разрешено. Используется для генерации прерывания когда устанавливается флаг TXE SPI1->CR2 &= ~SPI_CR2_RXNEIE; // --- Прерывание не пустого буфера приема Rx // --- 0: Прерывание RXNE запрещено // --- 1: Прерывание RXNE разрешено. Используется для генерации прерывания когда устанавливается флаг RXNE. SPI1->CR2 &= ~SPI_CR2_ERRIE; // --- Прерывание при возникновении ошибок передачи. Этот бит контролирует генерацию прерывания при возникновении одной из ошибок интерфейса SPI (CRCERR, OVR, MODF). // --- 0: Прерывание при возникновении ошибок запрещено // --- 1: Прерывание при возникновении ошибок разрешено SPI1->CR2 |= SPI_CR2_SSOE; // --- Разрешить выход SS // --- 0: Выход SS отключен в режиме master (ведущий) и есть возможность работать в multimaster режиме // --- 1: Выход SS включен в режиме master (ведущий), при этом нет возможности работать в multimaster режиме SPI1->CR2 &= ~SPI_CR2_TXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага TXE // --- 0: Tx buffer DMA disabled // --- 1: Tx buffer DMA enabled SPI1->CR2 &= ~SPI_CR2_RXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага RXNE // --- 0: Rx buffer DMA disabled // --- 1: Rx buffer DMA enabled SPI1_Enable; NVIC_EnableIRQ(SPI1_IRQn); } void SPI1_STM32F1_write_8bit_irq(uint8_t *data, int32_t len_8bit) { if(len_8bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY)) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 &= ~SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_8_bit = 0; tx_len_8_bit = len_8bit; tx_data_8_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_STM32F1_write_16bit_irq(uint16_t *data, int32_t len_16bit) { if(len_16bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 |= SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_16_bit = 0; tx_len_16_bit = len_16bit; tx_data_16_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_IRQHandler(void) { if ((SPI1->CR1&SPI_CR1_DFF) == 0) { SPI1->DR = tx_data_8_bit[tx_index_8_bit]; //Записываем новое значение в DR tx_index_8_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_8_bit >= tx_len_8_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } else { SPI1->DR = tx_data_16_bit[tx_index_16_bit]; //Записываем новое значение в DR tx_index_16_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_16_bit >= tx_len_16_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } } ............. uint8_t data_8bit[3] = { 0xAA, 0xBB, 0xCC}; uint16_t data_16bit[3] = { 0xDDDD, 0xEEEE, 0xFFFF}; int main(void) { SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); }  
    • By COKPOWEHEU
      Решил разобраться с модулем компаса GY-271 - одним из немногих модулей, которые вообще сумел найти. Пол-интернета заполнены утверждениями что собран данный модуль на микросхеме HMC5883L, которая общается по I2C и отзывается на адрес 0x1E (соответственно, 0x3C/0x3D для записи и чтения). На практике же посылка этого адреса натыкалась на глухой таймаут, мол знать не знаем такого адреса, и вообще мы не оно. Целенаправленные, но больше случайные поиски по интернету дали наводку что данное чудо техники, возможно, отзовется на адрес 0x0D (0x1A/0x1B для записи и чтения) и действительно, по такому адресу удалось добиться ответа, правда не совсем того, что ожидалось. К примеру, без "шаманской" (опять же, советы из "Всезнающего") записи единицы по адресу 9, ответ был нулевым. Потом более-менее осмысленные данные появились, но не с адреса 0x03, как положено по даташиту, а вовсе даже с 0x00. Очередная случайная находка дала направление, что заботливые китайцы запаяли на плату не HMC5883L, а вовсе даже QMC5883L - совсем другую микросхему с другими регистрами. И вот она действительно похожа по настройкам и адресу.
      Стал бы я создавать тему, если бы все было так хорошо... Хотя ответ от микросхемы и есть, как-то он слабо похож на нормальные данные. Теоретически, в регистрах 1:0, 3:2, 5:4 должны быть проекции магнитного поля на оси X, Y, Z. То есть вдали от магнитов и массивных железяк, геометрическая сумма значений должны быть примерно 0.5 Гс, то есть ~32000 единиц модуля, причем пока модуль лежит на столе, сильно меняться значениям не с чего. Привожу лог снятых данных (во вложении исходный код прошивки: вся работа с периферией идет руками, без автоконфигураторов и тому подобного). За все время съема этого лога модель лежал на столе в одном положении, но данные по осям скачут достаточно произвольным образом.
      I2C test FB FF 0A 00 14 00 00 A8 F5 0D 00 01 01 00 Write 0F 00 05 00 F1 FF 04 99 F5 | 15 5 -15 2337 FB FF 00 00 05 00 00 9A F5 | -5 0 5 2338 0F 00 05 00 00 00 00 8F F5 | 15 5 0 2327 E2 FF 00 00 F6 FF 00 93 F5 | -30 0 -10 2331 28 00 F6 FF FB FF 00 90 F5 | 40 -10 -5 2328 05 00 FB FF FB FF 00 99 F5 | 5 -5 -5 2337 00 00 00 00 00 00 00 97 F5 | 0 0 0 2335 00 00 0F 00 D6 FF 00 99 F5 | 0 15 -42 2337 32 00 E2 FF 00 00 00 94 F5 | 50 -30 0 2332 E7 FF EC FF 00 00 00 97 F5 | -25 -20 0 2335 05 00 F6 FF 00 00 04 92 F5 | 5 -10 0 2330 Продублирую код чтения регистра (насколько я знаю, он довольно типичный, но мало ли...). Естественно, код писался в первую очередь под конкретную задачу - оптимизация будет потом, если оно вообще заработает.
      void I2C_Read(uint8_t device, uint8_t addr, uint8_t *buf, uint8_t count){ //start I2C2->CR1 |= I2C_CR1_START; while(!(I2C2->SR1 & I2C_SR1_SB)){} (void) I2C2->SR1; //device I2C2->DR = (device<<1) &~(1<<0); while(!(I2C2->SR1 & I2C_SR1_ADDR)){} (void) I2C2->SR1; (void) I2C2->SR2; //addr I2C2->DR = addr; while(!(I2C2->SR1 & I2C_SR1_TXE)){} I2C2->CR1 |= I2C_CR1_STOP; //restart I2C2->CR1 |= I2C_CR1_START; while(!(I2C2->SR1 & I2C_SR1_SB)){} //device I2C2->DR = (device<<1) | (1<<0); while(!(I2C2->SR1 & I2C_SR1_ADDR)){} (void) I2C2->SR1; (void) I2C2->SR2; //data for(uint8_t i=0; i<count-1; i++){ //I2C2->CR1 &=~ I2C_CR1_ACK; I2C2->CR1 |= I2C_CR1_ACK; while(!(I2C2->SR1 & I2C_SR1_RXNE)){} buf[i] = I2C2->DR; } I2C2->CR1 &=~I2C_CR1_ACK; while(!(I2C2->SR1 & I2C_SR1_RXNE)){} buf[count-1] = I2C2->DR; //stop I2C2->CR1 |= I2C_CR1_STOP; } #define QMC5883L 0x0D I2C_Read(QMC5883L, 0, data, 14); for(uint8_t i=0; i<14; i++){ UART_HEX(data[i]); UART_putc(USART, ' '); } data[0] = 0x80; I2C_Write(QMC5883L, 10, data, 1); data[0] = 0x01; I2C_Write(QMC5883L, 0x0B, data, 1); data[0] = (0b00<<6) | (0b00<<4) | (0b11<<2) | (0b01<<0); //oversampling = 512 //range = 2 G //ODR = 200 Hz //mode = continuous I2C_Write(QMC5883L, 9, data, 1); UART_puts(USART, "Write\x0d\n"); while(1){ I2C_Read(QMC5883L, 0, data, 9); for(uint8_t i=0; i<9; i++){ UART_HEX(data[i]); UART_putc(USART, ' '); } i16a x,y,z,t; x.u8val[0] = data[0]; x.u8val[1] = data[1]; y.u8val[0] = data[2]; y.u8val[1] = data[3]; z.u8val[0] = data[4]; z.u8val[1] = data[5]; t.u8val[0] = data[7]; t.u8val[1] = data[8]; t.ival += 3000+2000; sprintf(str,"| %i %i %i %i", x.ival, y.ival, z.ival, t.ival); UART_puts(USART, str); Собственно, вопрос: что я делаю не так и как сделать так, чтобы модуль отдавал правильные данные магнитного поля?
      compass.rar
    • By Dozator
      Всем добрый день. Вопрос скорее теоретического плана. Если взять 2 телефонных аппарата , соединить их 2-х проводной линией, подать питание, то можно  пользоваться связью. Связь в этом случае будет дуплексной.Можно говорить по очереди, одновременно, перебивая друг друга.А если сделать громкоговорящую связь,но не симплексную,а именно дуплексную,микрофон стоит в стороне,динамики тоже стоят отдельно. Не нужно что то переключать,чтобы выйти из режима передачи на прием и обратно. Эффект такой ,как вы разговариваете при общении 2-х людей при встрече. Это напоминает общение по Скайпу в интернете. Я сейчас опускаю вопросы усилителей приема и передачи. Просто интересно узнать,как  реализовать общение по двум проводам,чтобы не было микрофонного  эффекта,такого писка? Скорее всего в промышленности это уже есть,я просто не сталкивался с этим. Хочется сделать такую приставку к телефону,чтобы общаться и не быть привязанным к аппарату.
    • By Prominence
      Здравствуйте, в силу поставленных передо мной ограничений (на плате нет внешнего резонатора), я вынужден пытаться запустить STM32F103 от внутреннего тактирования, да ещё и под 72МГц.
      Правильный ли код?
          RCC_DeInit();  //Сброс
          RCC_HSEConfig(RCC_HSE_OFF); //Выключение внешнего тактирования (на всякий случай)
          RCC_PLLConfig( RCC_PLLSource_HSI_Div1, RCC_PLLMul_9); //использование множителя 9 для получения 72МГц, но компилятор ругается на делитель Div1
      Дескать, минимум можно использовать Div2, а совсем без делителя нельзя, как ещё можно выставить множитель?

          RCC_PLLCmd( ENABLE); //Включение PLL как такового
          RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); //Использование PLL в качестве основного источника тактирования
      Вышеперечисленная шняга будет вызываться в мэйне, но это совсем другая история, пока что с этим туплю.
×
×
  • Create New...