• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
ART_ME

STM32 для чайника

1 203 сообщения в этой теме

MihaNN52    3

Как раз из колбэка все отправляет нормально. Но из других функций не отправляет.

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
GOR23    35

Странно... Так оно на CDC_Transmit_FS уходит в HardFault или просто пробегает её только безрезультатно?

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


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

возможно вот это как то поможет

https://habrahabr.ru/post/323674/

обратите внимание не код, который надо видимо вручную добавлять в usbd_cdc_if.c

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */ 
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */ 
  return result;
}

скорее всего функция отправки не принимает абы какой буфер из любого удобного места

по поводу описания. Судя по всему библиотека USBD является сторонней, как и FreeRTOS и доку на нее надо искать отдельно. В стандартный HAL она не входит. И функция отправки кстати не имеет префикса именования HAL_ а имеет префикс CDC_, что как раз и говорит о том, что она не родная

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


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

У меня функция отправки вот так выглядит, всё работает.

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */ 
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */ 
  return result;
}

Если на функции не повисает значит TxState не тот что нужно. Нужно разбираться почему так

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


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

Коллеги спасибо. Буду пробовать.

Потихоньку засасывает) деваться один фиг некуда))

В данный момент пытаюсь подружить ESP12 с STM32F103 по UART. Наконец таки получилось с проверкой на буквы и цифры, хотелось бы контрольную сумму считать но что то не понимаю как  сложить значения в чар строке, надо С++ подтянуть, его тянуть похоже можно бесконечно. Отладку вывожу в SW0. По сути то что в ардуино Ide я бы сделал за час полтора, делал неделю, не спал не ел)  вчера на работу проспал в первые в жизни на 4 часа))) Надеюсь не зря.

В общем то нашел для себя способ удобный, писать в кодеблок, потом переносить в кейл, там наглядней получается, это от недостатка опыта и С++.

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


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

Добавил код из статьи с habrahabr, вроде отправляет. Завтра еще посмотрю.

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


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 193
14 hours ago, MihaNN52 said:

По сути то что в ардуино Ide я бы сделал за час полтора

а потом, когда освоится, будет другая мысль - то что я сделал за час на STM я бы неделю ковырял на ардуино. Если бы вообще на ардуино такое получилось...

Изменено пользователем mail_robot

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


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

Начал меня мучить такой вопрос, куда правильно вести землю от нагрузочных конденсаторов кварцевого резонатора. Ясно, что можно кинуть её на общий земляной полигон, но правильно будет подвести к какой то ноге GND. В корпусе TQFP64_N их 4. Так вот, кто знает к какой? Или это уже у меня паранойя?) Да, контроллер серии STM32F103.

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


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 193
2 hours ago, GOR23 said:

можно кинуть её на общий земляной полигон

этого обычно более чем достаточно. Вы же не усилитель класса Hi-End строите.

Я уже много плат с кварцами развел и запустил. Проблем с точкой подключения конденсаторов не отметил. Да и заводские платы, при внимательном рассмотрении, не очень то и старательно разведены. Но работают вполне нормально.

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


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

Значит зря заморачиваюсь. А на счёт того, что правильно или не правильно, то у меня такие соображения. Есть схема к которой подключается кварц в контроллере, она предсатвляет собой отдельный блок. Этот блок подключается к общей земле контроллера. Скорей всего место этого подключения к какому то пину GND ближе, а к какому то дальше. Чем ближе к этому месту подключить землю с нагрузочных конденсаторов, тем будет лучше (по этой дорожке будет течь только один ток с этих нагрузочных конденсаторов, вплоть до самого МК). Думаю мысль ясна. Обычно тоже кидаю её на земляной полигон да и всё, сейчас же просто решил спросить, узнать мнение других...

Изменено пользователем GOR23

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


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

К Vssa присоединить можно.  Внутренние генераторы и PLL к ней же подключены. А оттуда уже к общему земляному полигону.

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


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

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

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


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

это не нагрузочные конденсаторы и ток от них будет микроскопическим. Мозги себе не грейте уважаемый. В цифровых цепях все ваши хитрые колдунства совершенно бесполезны

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


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

Подскажите, пожалуйста, почему вот этот код

HAL_ADC_Start(&hadc1);
adcResult = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

перед бесконечным циклом в adcResult возвращает 0, а в самом цикле работает как надо? :o

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


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

Попробуйте так:

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10); 
adcResult = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

 

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


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

потому что результат не успевает загрузиться в регистр данных за время выполнения одной команды. А в цикле вы просто не замечаете ложных значений и через несколько оборотов цикла начинаете получать корректные.

Функция HAL_ADC_PollForConversion(&hadc1,10); позволяет дождаться корректного значения после запуска АЦП. Она прерывает выполнение программы и опрашивает флаг готовности данных АЦП

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


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

Может есть у кого нибудь рабочий пример чтения и записи i2c HAL  или HAL_I2C_Master_Transmit()
HAL_I2C_Master_Receive() достаточно для работы?

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


Ссылка на сообщение
Поделиться на других сайтах
Darth_Vader    55
5 минут назад, MihaNN52 сказал:

хотелось бы альтернативного варианта работы.

Что за альтернативный вариант?

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


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

Ну там мнение на тему одного человека, есть же и другие мнения?

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    494
49 минут назад, MihaNN52 сказал:

хотелось бы альтернативного варианта

А чем этот вариант не устраивает ?

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


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

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

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

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

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

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

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

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

Загрузка...