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

STM32 для чайника


ART_ME

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

Подскажите, пожалуйста, как проверить работоспособность китайского программатора ST-Link v2? До этого всегда им прошивал, но вчера Keil начал ругаться "No Cortex-M SW Device Found". Попробовал на китайской отладочной плате, аналогично. Хотелось бы понять, этому виной программатор или прошиваемый микроконтроллер. Светодиод горит, питание 3В также с него идет, контроллер программатора не горячий (как обычно бывает когда пробиваешь).

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

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

st-link utility обнови. Проблема в драйвере скорее всего. Или скорость на SWD понизить можно попробовать

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

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

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

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

@mail_robot дык все работало. Получилось так, ковырялся я с платой, перепрошивал нормально, а потом вдруг перестало. Есть подозрение, что что-то закоротил.

ST-LINK Utility обновил до версии v4.2.0 - ничего не дало, даже специально систему на компьютере переустановил. Через ST-Link Upgrade обновил прошивку до V2.J29.S7 (V2.J29.S7 STM32+STM8 Debugger), после чего Keil начал выдавать ST-LINK USB communication error. Аналогично и в ST-LINK Utility при попытке что-нибудь изменить в настройках, вот так получается:

1.gif.d5931a34ef92e786b4465f29f8bf7e30.gif 2.gif.3ff84b35fd122393ce6a5aec3c9c5e8a.gif

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

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

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

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

  • 1 месяц спустя...

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Имеется массив  const uint8_t moimassiv[ ]  из которого необходимо получить  с указанного адреса 32 битное значение, конкретно с первого элемента moimassiv[1]. 

С контроллером  STM32F103 пишу так: x = __REV(*(__IO uint32_t *)((uint32_t)&(moimassiv[0]) + 1));   все работает как надо и без проблем.

Но стоило то же самое повторить с STM32F042, программа улетает  HardFault_Handler.

Заметил, если началом указываю  [0], [4], [8] ...... и.т.д. элементы массива, то есть кратные 32 битам, то все работает без проблем!  А мне надо начать с [1], кто ни будь подскажет  как решить эту  проблему? 

 

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

Сергей.

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

а если разделить выражение и посмотреть на каком именно этапе происходит срыв в ошибку?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Только указываю началом первый элемент и все! Пробовал даже указывать явный адрес, массив начинается с 0x080000C0, если указываю его все работает,  если  0x080000C1 то полетела в HardFault_Handler.

  Пока вышел из положения так, но думаю должно быть решение покрасивее!

  x =  moimassiv[1] <<8;
  x =  x + moimassiv[2] <<8;
  x =  x + moimassiv[3] <<8;
  x =  x + moimassiv[4];

Сергей.

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

7 часов назад, Yurkin2015 сказал:

А так не прокатит?

нет не прокатит.

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

спасёт только побайтовое копирование.

Думаю этот вариант особо не отличается от этого

8 часов назад, optima сказал:

  x =  moimassiv[1] <<8;
  x =  x + moimassiv[2] <<8;
  x =  x + moimassiv[3] <<8;
  x =  x + moimassiv[4]

 

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

memcpy нужно использовать.

Спасибо, сейчас поищу эту функцию, интересно глянуть как она реализована.

Сергей.

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

У Cortex-M0  доступ к данным без выравнивания запрещен. Отсюда и ошибки все.

То есть для одного байта адрес должен быть кратным одному байту, для  двух - двум, для четырех - четырем. Считать напрямую uint32_t с адреса 0x080000C1 невозможно, так как адрес не кратен четырем.

Как заметили выше, можно использовать функцию memcpy, или вручную скопировать все побайтно. Эффект будет тот же. Разве что memcpy может оказаться чуть быстрее.

Cortex-m3, насколько я помню, может работать с данным без выравнивания, потому там код и работает без ошибок.

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

4 часа назад, Вуйко сказал:

Cortex-M0  доступ к данным без выравнивания запрещен

Что то подобное и предполагал!    с  memcpy вроде разобрался, но на счет быстрее как проверить? результать с memcpy такой 0xB4030201 а нужен такой 0x010203B4, как минимум данные надо еще перевернуть зеркально, а это еще плюс время!

 

Сергей.

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

memcpy копирует данные последовательно, порядок данных эта функция не меняет.

Поменять порядок байт (конвертировать переменную из формата Little-Endian в  Big-Endian, или наоборот) можно функцией __REV(), или __REV16(). Первая для четырехбайтных переменных, вторая для двухбайтных . Функции подключаются через заголовочный файл core_cm0.h.

Ну или можно конвертировать вручную, но это будет дольше.
 

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

23 минуты назад, Вуйко сказал:

memcpy копирует данные последовательно, порядок данных эта функция не меняет.

А результат говорит об обратном!

24 минуты назад, Вуйко сказал:

можно функцией __REV()

Да эта функция справилась на 100% спасибо!

Осталось только определить время выполнения, как это можно проверить?

 

Есть в stm счетчик команд? как получить его данные?

 

Сергей.

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

Хотелось бы проверить первый или второй вариант пошустрее!

 

test.jpg

Вроде нашел, если это правильно то глядел по регистру PC. На первый вариант ушло 20 команд, на второй 30. Вывод, memcpy+_REV() пошустрее, если конечно смотрел нужный регистр!

 

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

Сергей.

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

memcpy этого делать не может в принципе. Там такой функционал вообще не предусмотрен.

Тут скорее какая-то путаница в восприятии информации. Каким образом просматриваете содержимое массива до чтения, и каким - значение переменной? 

Что я имею ввиду. Если есть массив { 0x01, 0x02, 0x03, 0x04 } , то в отладчике последовательность байт массива будет та же: 0x01, 0x02, 0x03, 0x04.

Если потом эти 4 байта скопировать в переменную (пускай будет uint32_t ) посредством функции memcpy, то значение переменной будет равно 0x04030201, при этом в памяти она будет записана как 0x01, 0x02, 0x03, 0x04. То есть порядок байт не поменяется. 

Вот кажется мне что здесь эта ситуация. 

Проверить быстродействие можно с помощью любого таймера. Настраиваете его на частоту отсчетов скажем 1 МГц. Запускаете таймер, выполняете участок кода скорость работы которого нужно определить. По окончанию выполнения отключаете таймер и смотрите содержимое регистра CNT, которое будет прямо содержать время выполнения кода в микросекундах. 

Будут некоторые накладные расходы на запуск и остановку таймера, но их можно нивелировать просто выполнив код не один раз, а скажем 100 или 1000. Чем выше это число, тем точнее измерение. Главное счетчик таймера не переполнить.  А то будут неправильные показания.

Ну и оптимизацию советую включить. Она запросто может скорость выполнения в несколько раз поднять, в некоторых случаях.

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

Оптимизация включена на максимум. Вот на фото как выглядит начало массива, читаю с 1 ого элемента 4 байта. И второе фото на переменных видно в каком виде переносятся данные, _REV() конечно пока отключил.

 

тест1.jpg

тест2.jpg

Сергей.

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

Так все правильно работает.

В массиве 0х01, 0x02, 0x03, 0xB4, в переменной "х" те же 0х01, 0x02, 0x03, 0xB4. Если посмотреть содержимое памяти по адресу 0х20000080, то там как раз и будет эта последовательность. Микроконтроллер работает в Little-Endian кодировке, а естественный для человека порядок - Big-Endian. Отладчик значения переменных выводит именно в последней кодировке, хотя хранятся они в первой. Отсюда и путаница.

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

Да нет никакой путаницы! Вот поглядите пример в отладчике, непосредственно в железе, создал две переменные registr_1,  registr_2  пусть это будут целевые регистры допустим идентификатор CAN шины. Вот туда то мне и нужно положить полученный результат, в первом случае с memcpy, во втором тот вариант что я описал выше. В первом случае без функции _REV() результат не верный. Во втором все как надо, вот и напрашивается вывод что в первом случае без переворачивания данных не обойтись. И все равно в каком режиме работает контроллер, главное нужен правильный результат.

 

тест3.jpg

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

Сергей.

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

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

нужен правильный результат

Эта фраза, в Вашем случае (и во всех подобных), относительная. Т.к. идёт нестандартное преобразование.
Откуда уверенность, что в самом массиве данные лежат "правильно" ?

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

Ещё как вариант :

2018-09-08_13-51-56.thumb.png.293be995d268254f0b6f7949f693752b.png

Будет выполняться быстрее, чем memcpy. Т.к. все манипуляции будут происходить с помощью команд процессора.
Для примера, на PIC32 (MIPS32) - 3 команды.
2018-09-08_13-57-41.png.9735416b5ac103f4353131dd2d276c9e.png

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

52 минуты назад, Alex сказал:

Откуда уверенность, что в самом массиве данные лежат "правильно" ?

Массив создан  мной, потому и уверенность что там все лежит как надо.

За вариант спасибо, попробую вникнуть 

Сергей.

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

5 минут назад, optima сказал:

потому и уверенность что там все лежит как надо

Ха... Создайте по-другому его, и будет лежать по-другому, как надо :)

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

9 минут назад, Alex сказал:

Ха... Создайте по-другому

Не вижу смысла! библиотека должна быть одна, не важно какой кристалл используешь. Она из рабочего проекта на 103 процессоре, не буду же я  под каждый процессор создавать новый массив. Тем более он не маленький и постоянно пополняется, не редактировать же после каждого изменения  кучу массивов.

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

Сергей.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...