Перейти к содержанию

Stm32 и пара глупых вопросов


Рекомендуемые сообщения

Начинаю изучать stm32. Осваиваю mxcube и keil5. С языками программирования как свинья в апельсинах, что-то понимаю, а во что-то не врублюсь никак. Из того что было под рукой, собрал stlink. Настроил keil для него и всё работает замечательно. Далее есть подопытный stm32f103ve на плате с обвязкой от какой-то сигналки. Прошивается, светодиодиками моргает, работает нормально. Задумал адаптер канхакер замутить. Да вот только засада, много примеров встречал, но под 105-ый камень. А у меня 103-ий. И соответственно кан и юсб в одном камне не уживаются. Не беда, можно кан посылки по usart слать и переходником в usb уже тыкать. С начальными настройками я разобрался в кубе и кейле, и имею проект со всеми файлами и прочим. По отдельности usart & can понимаю, но как их связать вместе и чтоб работало под программой канхакер v2.00.02 для меня тёмный лес. Ну а теперь, что мне непонятно: прога хакера делает запрос версии, и кое как я научился ей отвечать, после чего адаптер становится видным и его версия. То есть получается нужно делать что-то типа блока для общения stm32 и канхакером. И блока для общения can и usart. Файл проекта великоват, поэтому только main.c. Я там немного писал на приём и передачу данных по usart.  Подскажите каким образом осуществить общение по usart и связать посылки can на usart. То есть грубо через какие функции. Тяжело писать то, в чём особо не разбираешься. Надеюсь на понимание. Камень 105-ый я заказал, пока жду учусь на 103-ем.

main.c

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Добрый день!

Нужно знать, какой требуется формат пакетов при отправке данных по USART.

К примеру, первый байт - ID CAN сообщения, далее, собственно, байты данных CAN сообщения.

Зная этот формат, затем данные CAN фрейма упаковываются в массив, который передается по USART.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ещё один вопрос. Правильно ли я понимаю, что для того, чтобы написать программу для микроконтроллера, нужно шаг за шагом описать действия для него? То есть если я хочу общаться по uart, по я должен знать какие данные посылает прога канхакер и просто отвечать на них? Просто пока не очень понимаю всё от избытка информации в интернете. Что значит формат пакетов при отправке по usart.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну вроде того, надо знать, что она присылает и, приняв это, ответить так, как она ожидает ) Либо программа может не присылать запроса, а только принимать входящие данные. Опять же определенного вида.

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

Снова накопились вопросы. Извиняйте если неправильно задаю вопросы, я только учусь. Делаю проект в кейле 5 после куба. Как принимать\передавать через usart вроде понятно. Не понятно как из буфера усарт работать с данными. К примеру я создаю uint8_t rxd [8]={0}; затем в while принимаю 8 бит HAL_UART_Receive_IT(&huart1, rxd, 8); после заполнения буфера вызываю прерывание RxCpltCallback и дальше затык. То есть мне нужно из принятых битов взять нужные, затем сделать ответ и отправить. А если приходят не нужные, то просто выйти из прерывания и снова HAL_UART_Receive_IT. Чую, что надо switch задействовать, но как это сделать пока не понимаю. Для switch надо переменную создать, но как связать её с буфером rxd непонимаю. Буду признателен, если кто подскажет. 

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

RxCpltCallback не нужно вызывать руками, она вызывается автоматически по окончанию приема. Вот такая последовательность:

  • HAL_UART_Receive_IT(&huart1, rxd, 8);
  • По окончанию приема 8-ми байт вызывается RxCpltCallback()
  • В rxd находятся принятые данные, с ними можно работать

При такой схеме в коде прерывания ничего менять/добавлять не надо.

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

6 часов назад, Aveal сказал:

В rxd находятся принятые данные, с ними можно работать

Можно поподробнее? я не совсем понимаю именно этот момент.

  /* USER CODE BEGIN 2 */
uint8_t rxd [2]={0};// вот здесь, насколько я понимаю, буфер rxd
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)// здесь начало цикла
  {
        HAL_UART_Receive_IT(&huart1, rxd, 2); //здесь постоянно идет приём в буфер rxd

//а дальше как? пробовал switch (rxd) кейл ругается

}

 

Изменено пользователем GuesTT
Ссылка на комментарий
Поделиться на другие сайты

43 minutes ago, GuesTT said:

HAL_UART_Receive_IT(&huart1, rxd, 2); //здесь постоянно идет приём в буфер rxd

Эта функция настраивает UART на приём 2 байтов и разрешает прерывания, сама по себе она ничего не принимает. После того, как прерывания от UART разрешены, другая функция  USART1_IRQHandler() принимает байты и складывает их в буфер rxd.

После того, как принято нужное число байтов, в данной сдучае их 2, вызывается третья функция  HAL_UART_RxCpltCallback(), которая ничего не делает. Вот в эту функция надо добавить переменную, например, flag = 1. В бесконечном цикле while(1) в процедуре main() надо проверять этот флаг

 

int flag = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
	flag = 1
}

int main(void)
{
	......  
	HAL_UART_Receive_IT(&huart1, rxd, 2); 
    while(1)
    {
      if(flag == 1)
      {
        пользуем байты в rxd
      }
    }
}

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

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

uint8_t rxd [2]={0};
  while (1)
  {
  HAL_UART_Receive_IT(&huart1, rxd, 2);
}
...

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{//здесь по прерыванию отправляем строку
    HAL_UART_Transmit_IT(&huart1, (uint8_t*)"01111\r", 7);
//как сделать, чтоб здесь был switch?
// непонятно как здесь добавить данные из буфера
//то есть при приёме A отправлять один ответ
//а при приёме В отправлять другой ответ
//по умолчанию выходить отсюда

}

Данные будут в виде букв. Значит, по идее создать переменную char?
Тогда где её объявлять, в каком месте?
И получается, из адреса rxd брать данные и запихивать в char (A);
Каким образом это делается?
Я хочу чётко понимать что я делаю в коде, а не просто бездумно копировать куски и пытаться понять, почему не работает или работает криво. На одних светодиодиках нервов потратил, чтоб чётко понимать как это работает.Из-за кривизны cubemx или keil5 непонятно вела отладочная плата, не хотел работать простой код светодиодов. Выяснил, что не работал HAL_Delay по причине того, что в option bytes убиралась галочка с WDG_SW самопроизвольно, хотя в кубе я её не трогал, по умолчанию она снята. Хотя до этого всё работало. Извините за флуд. Ответьте на мои вопросы, пожалуйста.

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

8 минут назад, snn_krs сказал:

rxd[ 0 ] - первый принятый символ,  rxd[ 0 ] - второй и так далее

Вот оно что, спасибо, пойду пробовать, как оно работает.

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

Не работает оно как ожидалось. Попутно кейл выносит мозг: вчера ещё код работал корректно,а сегодня выдаёт белиберду в ком порт. Не первый раз замечаю, что после перезагрузки ноута код не работает. При этом компиляция без ошибок и код загружается в микроконтроллер. Чуть позже отпишу по коду со свитчем.

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

11.06.2020 в 20:56, Yurkin2015 сказал:

значит все байты получены и можно их пользовать.

Учим русский язык.

Пользовать - приносить пользу объекту пользования. У вас - приносить пользу байтам. :crazy:

Использовать - получать пользу от объекта использования.

戦う前に相手のベルトの色に注目

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

Уже выяснено, что все книги отменены а знания дают только соц сети форумы и ютуб.

Если вы осмысленно прочитали хоть одну книгу, не флудили бы тут

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

3 часа назад, Yurkin2015 сказал:

Скоро выяснится, что слово "Вас" надо писать с большой буквы. :crazy:

При обращении к одному человеку можно писать и со строчной и с прописной. Зависит от формы общения. При обращении ко множеству собеседников писать с прописной недопустимо.

Но ошибки подобного типа еще как то не переворачивают смысл сказанного.

Когда пишут всякую галиматью, пользуясь словами, смысла которых не понимают...., убил бы нахер... :diablo:

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

戦う前に相手のベルトの色に注目

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

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...