Jump to content
Tokes

После перепрошивки невозможно подключиться к com порту

Recommended Posts

Здравствуйте.
CUBEMX + CUBEIDE + PUTTY + STLINK V2
Есть blue pill. Создал новый проект в CUBEMX. Включил там USB как COM порт. Завёл приём сообщений (модифицировал static CDC_Receive_FS функцию). Всё хорошо работает ровно до тех пор, пока в CUBEIDE не нажимаю F11 (build + flash + debug). После этого необходимо руками вытаскивать и засовывать кабель, чтобы можно было продолжать пользоваться терминалом. В то же время достаточно коснуться контакта "USB-" - и происходит тот самый желанный реконнект, после которого достаточно нажать restart session в терминале и всё продолжает работать нормально. 
Вопрос - как сделать программно, чтобы при старте устройство ("com port" или "usb com emulator") само себя "переподключало"?

Edited by Tokes

Share this post


Link to post
Share on other sites

USB устройство на шине обнаруживается по появлению подтяжки линии D+ на +3,3В.

Что бы после перезагрузки не нужно было вручную отключать/подключать устройство, тем самым имитируя включение/отключение подтяжки, нужно этой подтяжкой управлять програмно. Тоесть просто добавить транзистор. Устройство отключено - транзистор закрыт, подтяжки нет, ничего не опознается. Нужно подключится - открываем транзистор, линия D+ подключается к +3,3В через резистор. Сопротивление резистора - 1,5 к.

Edited by Вуйко

Share this post


Link to post
Share on other sites

Не нашёл решения изящнее, чем взять первый свободный пин, посадить его на D- и в коде написать следующее:
 

	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.Pin = GPIO_PIN_6;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	__disable_irq();
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	uint32_t i;
	for(i = 0; i < 10000; i++);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	__enable_irq();

Вообще хотел обойтись минимальной кровью, т.е. без задействования какого-либо пина и всё не мог понять, почему не работает управление пином, если инициализирован USB. В даташите потом почитал, что 
"As soon as the USB is enabled, these pins are connected to the USB internal transceiver automatically."
То есть чтобы это порешать надо было деинициализировать USB, потом заново.... 
В общем, если будет решение лучше - с удовольствием почитаю :)

@Вуйко , спасибо за участие )

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...

  • Сообщения

    • в ручном режиме. как сделано в р-250. не в том разделе создали тему.
    • Металлический шарик ....это ещё "кирпич". Микрокусочки металлической стружки там ....и в обильном колличестве судя по тому что обращаются за помощью.  ....трутся втулки, ленты об направляйки и это только начало"присмотреться" и не то увидите. Улыбает "политика". Со "стороны", на мой взгляд, она смотрится так: профилактики оборудования к чёрту...датчик стоит дешевле. Да и механик нафиг не нужен. Простите, конечно, но я вижу это так.  Вы решили "лечить", думаю, не с той стороны.  И на кой ляд там РАМКА ....да ещё 30см×10см?!  ....в такую тортик можно впихнуть не то что печенюху.  Вариантов хватает ведь ....сделать настраиваемый датчик по высоте....а можно его встроить прямо под ленту и никаких РАМОК не нужно. Начинать "искать клады и самородки", думаю, лучше начать с просейки муки Металлический шарик ....это ещё "кирпич". Микрокусочки металлической стружки там ....и в обильном колличестве судя по тому что обращаются за помощью.  ....трутся втулки, ленты об направляйки и это только начало"присмотреться" и не то увидите. Улыбает "политика" 
    • Не могу найти настройки, что бы получить уведомления на почту, прошу пишите в ЛС.
    • @Beliy_voron , ну вот зачем вы это рассказали? 
    • Мина противотанковая  (ТМ 62М) !! Хоть запрыгаяся на ней,   ноги не разлетятся. С уважением, Сергей
    • Особенно по слову "Подача". Племянник придумал делать фейковые логотипы из жестянок от старых батареек. Делает очень аккуратно, я даже не понял подвох. 
    • Я написал про это выше про тему про коллайдер.                                                                                                                                   Там разогнанные электроны полем могут врезаться в пластину, и застревая в ней, могут накапливаться и этим увеличивать в ней количество заряда. Разгон разностью потенциалов электрона в вакууме затруднительно в моём случае, потому что моя пластина в районе одного квадратного метра, а может в процессе наладки схемы быть и больше. И это будет кинескоп от телика на несколько метров из толстого стекла    Потребуется очень дорогой заказ со стекольного завода такого произведения , плюс многие квадратные метры для расположения этого. Вот я думаю, можно электроны разгонять высоким напряжением вырванным из атомов воздуха, или из нагретой до красна тены, или всё вместе. Например, есть такая схема.                                                                                                         В лампе между горячим катодом и сеткой её создаётся высокое напряжение. Электроны испаряемые горячим катодом сильно притягиваются этой высоко заряженной сеткой. Потом при подходе к ней их скорость доходит почти до скорости света. И они из-за этого не успевают на ней затормозить и пролетают сквозь неё на анод лампы. Этим анодом можно сделать одиночную пластину для накачивания этими электронами, то есть большим количеством заряда. То есть надо просто поставить в воздухе сетку заряженную высоки положительным потенциалом, например Вольт 100 000. А за ней расположить пластину. Может перед этой заряженной сеткой добавить нагретую спираль для подсоса с ней электронов. Часть электронов эта сетка буде брать из этой спирали нагретой а часть из воздуха. И эти разогнанные электроны сеткой, будут не успевать затормозить на ней и будут пролетать к пластине в которую будут врезаться и накапливаться там, повышая этим там количество заряда.               Но эта положительная сетка будет с этой отрицательной пластиной образовывать ведь конденсатор, опят двух сторонняя поляризация, а нужна односторонняя, одиночной пластины. Получается какой то замкнуты круг Может разгонять электроны магнитным полем. Оно не будет образовывать конденсатор, двух стороннюю поляризацию.     Но переменное магнитное поле электроны будет дёргать в обе стороны, что не разгонит их в одну. Тогда нужно прилагать постоянное магнитное поле. Но это какой большой постоянный ток, мощность МегоВатты..
  • Similar Content

    • By admin
      В видео поговорим об энергоэффективности микроконтроллеров. Сравним потребление в режима сна arduino, blue pill с STM32F103 и представителя новой линейки энергоэффективных микроконтроллеров от st — STM32L552.
      Подробную информацию об линейке L5 можно найти тут: https://www.compel.ru/lib/143383
      Пи тест часть 1: https://youtu.be/ozu1IUjH1_Q
      Пи тест часть 2: https://youtu.be/uLOWYE-JJpA
    • By Стальной
      Доброго времени суток!
      Неделю не могу запустить DCMI на STM32F407VET6. 
      Работаю через HAL, инициализация кубом. К МК подключена камера OV7670. Камера дает картинку 640х480, и такое изображение мне негде хранить. Поэтому через фичу CROP хочу вырезать картинку 160х128 из центра под имеющийся экран.
      Ниже примерный код, без настройки камеры. Камера тактируется от 16 МГц MCO. Сигналы поступают на выводы МК, посмотрел осциллографом. У камеры есть некоторые настройки, которые тут в коде не показал, так как они влияют только на представление данных, но не на алгоритм захвата данных.
      /* USER CODE BEGIN PV */ uint16_t DCMI_data[20480] = {0}; //128*160=20480 words uint32_t ptr; /* USER CODE END PV */ //тут еще код куба, пропущу его int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_DCMI_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); //снять ресет с матрицы ptr = (uint32_t)(&DCMI_data[0]); HAL_Delay( 500 ); //начать резать с 512 клока строки (256 пиксель), начать резать с 160 строки //захватить 256 клоков (128 пикселей), захватить 160 строк HAL_DCMI_ConfigCrop(&hdcmi, 512, 160, 256, 160); HAL_DCMI_EnableCrop(&hdcmi); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, ptr, 10240); //однократный захват, 10240 тетрад, 20480 слов, 160*128=40960 пикселей HAL_Delay(1500); } /* USER CODE END 3 */ } В результате в буфере ничего не появляется, DMA туда ничего не кладёт, проверил. Если не вызывать функцию EnableCrop, но какие-то данные появляются, но на экран их корректно отобразить не получается. Также пытался в камере обрезку включить, а не в МК - снова нет данных. Пробовал разные частоты тактирования матрицы давать - без разницы. Отладчиком увидел, что бит EN в регистре конфигурации потока  DMA не снимается, как будто DMA не получал запросов на транзакции. Помогите, пожалуйста, разобраться.
      Проект на яндексДиске
    • By Карен Григорян
      Здравствуйте, товарищи форумчане!
      У меня вот такая проблемка: есть такая схема:

      По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
      Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
        while (1)
        {
              HAL_ADC_Start_IT(&hadc1);
              HAL_Delay(10);
      }
      Код колбека прерывания:
      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
          if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
          {
            int adc = HAL_ADC_GetValue(&hadc1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
          }
              }
      На всякий случай вот настройка АЦП в stm32:

      Вот пример неправильного вычисления:

    • By Vladimir Rubtsov
      Здраствуйте) Подскажите мне балбесу что я делаю не так. Хочу сделать чтобы при нажатии кнопки (PB13) срабатывал светодиод (PE1), но не работает, я как понял что я не правильно инициализирую режим работы порта кнопки, должен быть режим Input mode, но я не пойму как это сделать. У меня просто горит светодиод, но при нажатии кнопки ничего не происходит. Плата у меня stm32h743zi. Подскажите пожалуйста что я делаю не так, все сайты прочекал, но так ничего и не нашел. p.s. Пробовал через HAL писать тоже самое, там естественно все работает, но я хочу понять как работать с кнопкой без HAL.
      #include "stm32h7xx.h" void GPIO_Init(void); int main(void) { GPIO_Init(); if((GPIOC->IDR & GPIO_IDR_ID13) != 0) { GPIOE->BSRR |= GPIO_BSRR_BR1; }else{ GPIOE->BSRR |= GPIO_BSRR_BS1; } } void GPIO_Init () { RCC->AHB4ENR |= RCC_AHB4ENR_GPIOEEN; RCC->AHB4ENR |= RCC_AHB4ENR_GPIOCEN; GPIOE->MODER = GPIO_MODER_MODE1_0; GPIOC->MODER &= ~GPIO_MODER_MODE13; }


    • By Денисов Никита
      Здравствуйте. Решил я таки попробовать перебраться с Arduino AVR на STM32 и для начала решил полностью скопировать Arduino проект, но появилась проблема. Код который на AVR занимал 7кбайт и свободно вмещался на Atmega8, на STM32 занимает 26кбайт. В проекте используется 2 канала ацп + прерывания по DMA, дисплей 1602 по i2c и 4 GPIO. Конечно это занимает только 42% памяти STM32F103C8T, но для такого проекта она избыточна и я хотел использовать STM32F030F4P, но там только 16 кб памяти и прошивка не влезает. Что я не так делаю? Может нужно какую-то оптимизацию включить или что-то подобное(выбран уровень оптимизации for size)? Или у меня просто код никчёмный? Но там так мало написано, что сомневаюсь что я мог где-то накосячить 
×
×
  • Create New...