• ×   Вставлено в виде отформатированного текста.   Восстановить форматирование

      Разрешено не более 75 смайлов.

    ×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

    ×   Ваш предыдущий контент был восстановлен.   Очистить редактор

    ×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Похожие публикации

    • Автор: DmitryDDDD
      Здравствуйте, имеется задача передачи данных от stm32 на ПК и от ПК в stm по UART. Имеется stm32f411e-disco, созданная программа на пк в Qt creator. UART передатчик - CH340. Программа для stm - Keil, настройка в cubeMX.
      Основные выдержки из кода Qt (mainwindow.cpp):
       
      C++ (Qt)Выделить код
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
      // Настройка UART      serial = new QSerialPort(this);      serial->setPortName("com4");      serial->setBaudRate(QSerialPort::Baud115200);      serial->setDataBits(QSerialPort::Data8);      serial->setParity(QSerialPort::NoParity);      serial->setStopBits(QSerialPort::OneStop);      serial->setFlowControl(QSerialPort::NoFlowControl);      serial->open(QIODevice::ReadWrite);      /*serial->write("ok*");  */                                                          connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));   // Запись принятых даннх в текстовое окно void MainWindow::serialReceived() {     QByteArray ba;     ba=serial->readAll();     ui->label->setText(ba);     qDebug()<<ba; }   // Отправка "1" и "2" в зависимости от нажатой кнопки void MainWindow::on_pushButton_clicked() {   serial->write("1"); }   void MainWindow::on_pushButton_2_clicked() {   serial->write("2"); }
      Настроен UART на прием и передачу. При нажатии какой-либо кнопки по UART передаётся 1 или 2ка. Так же принятая информация отображается в текстовом окне label. При замыкании RX и TX у CH340 отправленная 1 или 2 тут же принимаются программой.

      Программный код для stm создан в CubeMX. Там подключено два UART, один на приём, другой на передачу (можно настроить один для работы в 2 направления).
      Основные выдержки из кода Keil (main.c):
      //Настройка UART
      serial = new QSerialPort(this);
      serial->setPortName("com4");
      serial->setBaudRate(QSerialPort::Baud115200);
      serial->setDataBits(QSerialPort::Data8);
      serial->setParity(QSerialPort::NoParity);
      serial->setStopBits(QSerialPort::OneStop);
      serial->setFlowControl(QSerialPort::NoFlowControl);
      serial->open(QIODevice::ReadWrite);
      /* serial->write("ok*"); */ // Transmiting "ок" to COM Port
      connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));
       
      // Отображение принятых данных в текстовом меню label
      void MainWindow::serialReceived()
      {
      QByteArray ba;
      ba=serial->readAll();
      ui->label->setText(ba);
      qDebug()<<ba;
      }
       
      // Отправка 1 или 2 в зависимости от нажатой кнопки
      void MainWindow::on_pushButton_clicked()
      {
      serial->write("1");
      }
       
      void MainWindow::on_pushButton_2_clicked()
      {
      serial->write("2");
      }
       
      Выдержки из кода в Keil (main.c):
       
      // Настройка UART
      static void MX_USART1_UART_Init(void)
      {
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 115200;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits = UART_STOPBITS_1;
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        if (HAL_UART_Init(&huart1) != HAL_OK)
        {
          _Error_Handler(__FILE__, __LINE__);
        }
      }
      // 2 массива для принятия и отправки данных
        uint8_t strTX[1];
          uint8_t strRX[1];
      // Попытка сделать что-то адекватное
              int strTX = 1;
      while(1) {        
              HAL_UART_Transmit_IT(&huart2, (uint8_t*) strTX, 1);
            HAL_UART_Receive_IT(&huart2, (uint8_t*) strTX, 1);
      Код в keil явно кривой, в Qt вроде всё работает. Получается передать из stm в Qt, но из Qt в stm нет. 
      Нужно получить следующее: нажимаем в Qt одну из двух кнопок, отправляется в stm либо 1, либо 2 в зависимости от выбранной кнопки. Stm принимает, обрабатывает, если 1, то загорается один светодиод, если 2, то другой. Дальше stm отправляет обратно в Qt информацию о том, какой светодиод загорелся. 

      P.S: довольно далек от программирования, но стараюсь разобраться. Буду благодарен любой помощти, некоторые скриншоты прилагаю.



    • Автор: LiVit
      Приветствую, коллеги!
      Ситуация такая: есть серия устройств на STM32F030R8, на некоторых время от времени начинает греться микроконтроллер. 
      Вся логика работает, всё вроде в порядке, кроме потребления в 250мА. И перегретого корпуса микроконтроллера.
      В прошивке изначально отсутствовала инициализация неиспользуемых ног, кроме того, проц сначала старается завести внешний кварц, и только потом переходит на внутренний генератор.
      Нога BOOT0 притянута к земле напрямую, без резистора.
      На проце который уже начал перегреваться, я сделал инициализацию всех ног на вход, с подтяжкой ног к земле. Сразу завожу внутренний тактовый генератор.
      К сожалению, ему уже ничего не помогает, - даже будучи стертым, он жрет 200 мА. Как я понимаю, тут мои полномочия всё.
      Хотелось бы услышать от коллег, что именно могло вызвать такую странную неисправность проца? Может кто сталкивался? В Errata ничего подобного не нашел.
    • Гость Andrey-Docent
      Автор: Гость Andrey-Docent
      Всем привет! Планируется сделать на базе arduino устройство, ведущее обмен данными с переферийным устройством по интерфейсу rs-232 и также необходимо контролировать работу arduino с помощью компьютера тоже посредством интерфейса rs-232. Но у arduino только один такой порт. Первая мысль в связи с этим - сделать ещё один порт и вывести линии RX и TX на другие (например цифровые) ножки порта. Можно ли как-то это сделать? Нет ли готовых библиотек для этого (на данный момент не нашёл таковых в интернете)? Может есть ещё какой-нибудь обходной путь? Заранее спасибо.
    • Гость Максим
      Автор: Гость Максим
      Всем светлым и умным головам привет!

      Никак не могу найти информацию о данном прерывании TIM1_BRK_UP_TRG_COM.
      Вопрос 1: Что это за стек или система прерываний? 
      Вопрос 2: Когда будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler, если также есть обработчик прерывания TIM1_CC_IRQHandler?
      Вопрос 3: период переполнения таймера равен 100 мкс. Сколько раз будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler до обработчика прерывания TIM1_CC_IRQHandler? По логике вещей, предполагаю, что 100 раз?
      Заранее благодарен!

      Всем радости))
    • Автор: User_1
      Доброго времени суток!
      Вкратце: нужно после того, как я записал байт данных в SPI1->DR, отменить передачу этого байта и вместо него отправить 0х00
      Подробно: Смысл вот в чём: некий контроллер, с которым я пытаюсь наладить общение по SPI, запрашивает произвольный участок массива байт и считывает их сплошным потоком. Ну примерно как считывается микросхема EEPROM: задаёшь начальный адрес, а потом просто шлёшь сплошные 0xFF, а она сама инкрементирует адрес и прямо непрерывным потоком байт выдаёт содержимое памяти. Только тут в роли этой микросхемы мой stm32f030 и мне нужно следующий байт отправлять в SPI1->DR сразу после отправки предыдущего. Но когда поток заканчивается (а он каждый раз разной длины и длина эта заранее неизвестна), один байт остаётся не переданным и отправится первым при следующем запросе. А мне нужно, чтобы первым байтом всегда отправлялся 0х00
      Пином (ну то есть битом) NSS управляю программно, его выставление в единичку и снова в ноль, очевидно, не помогает вообще никак. Пока решил проблему так: деинициализирую модуль SPI и выключаю его тактирование, затем включаю тактирование и снова инициализирую. Работает, скорости хватает. Но должно же быть менее костыльное решение?)
      Может кто сталкивался с такой проблемой?
      Курение даташита, reference manual и результатов поиска в гугле, не особо помогло.