VisualNT

В чём смысл программатора ST-Link V2?

13 сообщений в этой теме

VisualNT    0

Доброго времени суток!

Может кто-нибудь объяснить, в чём смысл и преимущества использования специализированных программаторов для STM32 типа ST-Link и клонов, работающих по интерфейсам SWD/JTAG, если записать флеш можно прямо по UART/ISP или быстрее по USB (при его наличии)?

Я так понимаю, что программаторы, кроме записи в память, ещё умеют выполнять отладку - и это их единственное отличие.

А если отладка не нужна? Вернее, часто ли она используется при написании каких-нибудь маленьких прикладных программ типа реле времени? Я собираюсь развести свою печатную плату для STM32F107, а потом хочется поэкспериментировать с STM32F407ZGT - в них в обоих есть USB интерфейс, они оба есть в списке поддерживаемых USB DFU (согласно AN 3156). Но на форуме я прочитал, что пока все сидят на дискавери, в основном из-за того, что в ней есть встроенный программатор ST-LINK прямо на плате, но почему его наличие так важно и не заменяется возможностью программирования по UART/ISP или по USB? Есть ли какое-либо отличие кроме возможности отладки? Может быть, как и в случае со фьюзами у AVR, у STM32 есть какие-то функции/настройки, которые можно использовать/изменять только программатором ST-LINK?

И да, разве скорость программирования по USB будет существенно ниже, чем по тому же JTAG или SWD?

Заранее спасибо за ответы! Заранее предупрежу, чот с микроконтроллерами я раньше работал, но вот от ST что-то более-менее делал только на STM32F030...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alexeyslav    637

А сам загрузчик чем прошивать? Программатор хорош тем что работать будет даже если загрузчик запортишь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
VisualNT    0
17 минут назад, Alexeyslav сказал:

А сам загрузчик чем прошивать? Программатор хорош тем что работать будет даже если загрузчик запортишь.

Так вроде ведь загрузчик, который по UART связывается с ПК - заранее прошит в МК - я так понял, что это как раз одна из фишек ST, в том, что загрузчик, который вызывается по состоянию пинов BOOT0 и/или BOOT1 как раз уже предустановлен и затереть его нельзя, если с памятью напрямую не играться. По крайней мере, конкретно c теми STM32F030 и STM32F107VGT6 у меня Flash Loader Demonstrator связаться смог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alexeyslav    637

Флеш память по своей природе ненадёжна, да и ключевое слово "если с памятью напрямую не играться".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
VisualNT    0
19 минут назад, Alexeyslav сказал:

Флеш память по своей природе ненадёжна, да и ключевое слово "если с памятью напрямую не играться".

Ну, здесь я имел в виду, что DMA я пока использовать напрямую в коде не планирую. Да и к слову о ненадёжности FLASH-памяти - есть у меня AVR'ки, которые как минимум за 5 лет непрерывной работы в разных климатических условиях (от -25 до +30) до сих пор и загрузчик а-ля-ардуино при рестарте запускают без проблем, да и программу свою стабильно исполняют, но это немножко оффтоп.

А так, я понимаю, что кроме отладки и возможности писать в память даже при повреждённом bootloader'e особо отличий от той же прошивки USB DFU и не будет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 017

Вот-вот, Flash Loader Demonstrator у меня тоже связывался с МК, но программа полноценно запустилась только после прошивки ST-Link-ом. Во всех остальных случаях - кирпич.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
VisualNT    0
1 минуту назад, Геннадий сказал:

Вот-вот, Flash Loader Demonstrator у меня тоже связывался с МК, но программа полноценно запустилась только после прошивки ST-Link-ом. Во всех остальных случаях - кирпич.

Нет, ну я на STM32F107 смог прошить простое мигание светодиодом (просто на большее не хватило проводков, фоторезистом тогда не владел - распаял на LQFP-макетке), а вот к STM32F030F4P6 подключал и I2C LCD и LM75 (вроде он, датчик температуры), и светодиоды и кнопки - все программы шил только через UART, всё нормально работало, так что тут проблем не вижу...

Я-то думал, что ST-LINK чего-то ещё может такого, что по USB/UART не сделать, кроме отладки. Ну, видимо, на первое время для экспериментов хватит и USB/UART.

Огорчает, что теперь не доступен сайт coocox'a со всем, касающимся ColinkkEx'a - его бы собрал наверное..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 017

А вот мне не повезло. Собрал RLC-метр (измеритель всего...), а прошить через загрузчик не получилось. Пришлось собрать ST-Link V2. Через него проблема решилась. Прибор работает полноценно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
elki    91
2 часа назад, Alexeyslav сказал:

Флеш память по своей природе ненадёжна, да и ключевое слово "если с памятью напрямую не играться".

Загрузчик у стм зашит мертво его не возможно стереть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alexeyslav    637

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
__alexander    10

Родной загрузчик у СТМ только на UART1. Но есть еще область (пустая), куда можно впихнуть свой, например, как вы говорите USB. 

Неудобство такого загрузчика заключается в установке перемычек до нажатия ресет. Комбинациями на ногах BOOT0 и BOOT1 выбираем откуда стартуем. 

Одним словом, вам для работы с загрузчиком по UART на плату надо поставить две кнопочки (на ресет и бут0) и чтобы прошится надо нажимать ресет при зажатой бут0, после прошивки снова ресет с отжатой бут0. В зависимости от программы, особенно если пишется с нуля, можно охренеть клацать кнопки. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

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

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

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

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

Загрузка...

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

    • Автор: michaelukolov
      Доброго времени суток.
      Сразу скажу: я не прошу писать за меня код, просто натолкните, как правильнее это реализовать.
      Имеется STM32F103C8T6, необходимо на ней построить одноканальный генератор сигнала, желательно разной формы (синус/меандр) с регулировкой частоты и скважности от переменного резистора. Регулировки частоты хватило бы в пределах 1Гц - 20кГц (отсюда еще вопрос, годится ли для этого F103C8T6?). Хотелось бы еще иметь разные уровни (5В/12В), но это и сам сообразить могу.
      Если использовать HAL таймер, то когда он уже будет запущен, можно будет менять частоту/скважность?
      Как реализовать переключение синус/меандр?
    • Автор: artos5
      Всем привет! Столкнулся с проблемой которую не удается решить.
      прописал в файле Drive.h так:
      typedef struct { uint8_t FlgL; uint8_t FlgR; uint16_t Speed; uint16_t PulseL1; uint16_t PulseL2; uint16_t PulseR1; uint16_t PulseR2; } Motor_; typedef struct { uint8_t Status; } Button_; extern struct Motor_ Motor; extern struct Button_ Button; а в с файле:
      #include "Drive.h" Motor.Pulse = 3; // зададим значение переменной в структуре Motor в итоге 2 ошибки редефайн....
       
      как правильно с ними работать? За вчера и за сегодня уже наверное 1000 вариантов попробовал.
    • Автор: artos5
      Всем доброго времени суток!
      Необходима стабилизация частоты вращения двигателей по энкодерам. Энкодеры состоят из одного датчика холла на валу двигателя.
      Эту задачу на АВР я решил при помощи INT0 и аппаратного таймера , попробовал перенести код на STM32 . Попробовал через EXTI , результат не понравился .. Решил через таймер .
       
      void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint8_t InpCaptIndexL=0, InpCaptIndexR=0; if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value if(InpCaptIndexR==0) { Motor.TimerOldR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=1; } else { Motor.TimerNewR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); InpCaptIndexR=0; } if (Motor.TimerOldR > Motor.TimerNewR) { Motor.MotorRData = (Motor.TimerOldR - Motor.TimerNewR); } else { Motor.MotorRData = (Motor.TimerNewR - Motor.TimerOldR); } // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value if(InpCaptIndexL==0) { Motor.TimerOldL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=1; } else { Motor.TimerNewL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); InpCaptIndexL=0; } if (Motor.TimerOldL > Motor.TimerNewL) { Motor.MotorLData = (Motor.TimerOldL - Motor.TimerNewL); } else { Motor.MotorLData = (Motor.TimerNewL - Motor.TimerOldL); } // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed1(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } в интернете подсмотрел применение захвата но получается какая то каша . Осциллографом четко вижу меандр одинаковой частоты , а в юарт сыпет постоянно разные значения ...
      (имею ввиду переменную Motor.MotorLData и Motor.MotorRData)
      Тактирование 64МГц
      настройки таймера такие:
      TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 6400; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } что то я или недопонимаю , или что то не так приготавливаю..
       
      Пробовал и так:
      void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) // =RISING= EDGE DETECTED { // Get =RISING= EDGE Capture value Motor.TimerR = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // Reset Counter After Input Capture Interrupt Occurs __HAL_TIM_SET_COUNTER(&htim1,0x00); } if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // =FALLING= EDGE DETECTED { // Get =FALLING= EDGE Capture value Motor.TimerL = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // Reset Counter After Input Capture Interrupt Occurs } StabMotorSpeed(); __HAL_TIM_SET_COUNTER(&htim2, 0x00); } Результат тоже хуже чем на АВР , и в юарт сыпет каша (имею ввиду переменную Motor.TimerL и Motor.TimerR)
      Помогите пожалуйста разобраться в чем дело.
    • Автор: Grampus
      Добрый день!
      ПОМОГИТЕ ПОЖАЛУЙСТА!
      в описании для одного дисплея нашел код для STM на СИ
      там есть строчка которая мне не понятна, точнее смысл ее понятен но нет объявления аргументов функции
      помогите пожалуйста. В общем ситуация такая 
       
      spi_write ( DTA, 0x00 )                                     spi_write ( CMD, 0x01) 
      вот эта функция
      DTA - выполняет установку пина в 1 ,    CMD -  выполняет установку пина в 0 
      0x00 , 0x01, .........0xFF     это либо данные либо команда. 
       и все бы ничего но все это нужно передать по HAL_SPI_Transmit 
      помогите написать эту функцию с описанием аргументов и всех действий.
    • Автор: Mars36
      Добрый день. Имею желание вкатиться в разработку на stm32. Не много погуглив обнаружил копеечный программатор(tt-link), но отладочной платы как у какой нибудь avr'ки не нашел(аля вставил камень, прошил, впаял в плату). Существует множество всяких discovery  и им подобных, для проверки работы штука удобная, но для использовании в конечном устройстве нерациональная. Поэтому хотелось бы знать, существуют ли какие либо платы, переходники и т.д.? И если подобных промышленных вариантов нету, то единственный вариант это развести такую самостоятельно и вкорячивать переходники c LQFPхх и т.д.?
      P.S. Когда то видел вариант у аврки c tqfp корпусом, когда к подобной домашней плате аврку цепляли с помощью прищепки.