Гость Гость Опубликовано 8 июля, 2018 Поделиться Опубликовано 8 июля, 2018 Подскажите, пожалуйста, как проверить работоспособность китайского программатора ST-Link v2? До этого всегда им прошивал, но вчера Keil начал ругаться "No Cortex-M SW Device Found". Попробовал на китайской отладочной плате, аналогично. Хотелось бы понять, этому виной программатор или прошиваемый микроконтроллер. Светодиод горит, питание 3В также с него идет, контроллер программатора не горячий (как обычно бывает когда пробиваешь). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 8 июля, 2018 Поделиться Опубликовано 8 июля, 2018 (изменено) st-link utility обнови. Проблема в драйвере скорее всего. Или скорость на SWD понизить можно попробовать Изменено 8 июля, 2018 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Гость Гость Опубликовано 9 июля, 2018 Поделиться Опубликовано 9 июля, 2018 @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 при попытке что-нибудь изменить в настройках, вот так получается: 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
snn_krs Опубликовано 9 июля, 2018 Поделиться Опубликовано 9 июля, 2018 Была аналогичная проблема. После того как установил IAR для STM8 перестал видеть и STM8 и STM32. Полностью удалил IAR заработало. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
optima Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 (изменено) Имеется массив 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], кто ни будь подскажет как решить эту проблему? Изменено 5 сентября, 2018 пользователем optima 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 а если разделить выражение и посмотреть на каком именно этапе происходит срыв в ошибку? 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 Только указываю началом первый элемент и все! Пробовал даже указывать явный адрес, массив начинается с 0x080000C0, если указываю его все работает, если 0x080000C1 то полетела в HardFault_Handler. Пока вышел из положения так, но думаю должно быть решение покрасивее! x = moimassiv[1] <<8; x = x + moimassiv[2] <<8; x = x + moimassiv[3] <<8; x = x + moimassiv[4]; 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 Если гружусь с симулятора, то на этой строчке такая ошибка 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 (изменено) @optima А так не прокатит? uint32_t x = *(uint32_t *)&moimassiv[1] Изменено 5 сентября, 2018 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 5 сентября, 2018 Поделиться Опубликовано 5 сентября, 2018 memcpy нужно использовать. Либо писать самому нечто подобное. Т.е. спасёт только побайтовое копирование. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 6 сентября, 2018 Поделиться Опубликовано 6 сентября, 2018 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 нужно использовать. Спасибо, сейчас поищу эту функцию, интересно глянуть как она реализована. 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 У Cortex-M0 доступ к данным без выравнивания запрещен. Отсюда и ошибки все. То есть для одного байта адрес должен быть кратным одному байту, для двух - двум, для четырех - четырем. Считать напрямую uint32_t с адреса 0x080000C1 невозможно, так как адрес не кратен четырем. Как заметили выше, можно использовать функцию memcpy, или вручную скопировать все побайтно. Эффект будет тот же. Разве что memcpy может оказаться чуть быстрее. Cortex-m3, насколько я помню, может работать с данным без выравнивания, потому там код и работает без ошибок. 5 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 4 часа назад, Вуйко сказал: Cortex-M0 доступ к данным без выравнивания запрещен Что то подобное и предполагал! с memcpy вроде разобрался, но на счет быстрее как проверить? результать с memcpy такой 0xB4030201 а нужен такой 0x010203B4, как минимум данные надо еще перевернуть зеркально, а это еще плюс время! 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 memcpy копирует данные последовательно, порядок данных эта функция не меняет. Поменять порядок байт (конвертировать переменную из формата Little-Endian в Big-Endian, или наоборот) можно функцией __REV(), или __REV16(). Первая для четырехбайтных переменных, вторая для двухбайтных . Функции подключаются через заголовочный файл core_cm0.h. Ну или можно конвертировать вручную, но это будет дольше. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 23 минуты назад, Вуйко сказал: memcpy копирует данные последовательно, порядок данных эта функция не меняет. А результат говорит об обратном! 24 минуты назад, Вуйко сказал: можно функцией __REV() Да эта функция справилась на 100% спасибо! Осталось только определить время выполнения, как это можно проверить? Есть в stm счетчик команд? как получить его данные? 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 (изменено) Хотелось бы проверить первый или второй вариант пошустрее! Вроде нашел, если это правильно то глядел по регистру PC. На первый вариант ушло 20 команд, на второй 30. Вывод, memcpy+_REV() пошустрее, если конечно смотрел нужный регистр! Изменено 7 сентября, 2018 пользователем optima 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 memcpy этого делать не может в принципе. Там такой функционал вообще не предусмотрен. Тут скорее какая-то путаница в восприятии информации. Каким образом просматриваете содержимое массива до чтения, и каким - значение переменной? Что я имею ввиду. Если есть массив { 0x01, 0x02, 0x03, 0x04 } , то в отладчике последовательность байт массива будет та же: 0x01, 0x02, 0x03, 0x04. Если потом эти 4 байта скопировать в переменную (пускай будет uint32_t ) посредством функции memcpy, то значение переменной будет равно 0x04030201, при этом в памяти она будет записана как 0x01, 0x02, 0x03, 0x04. То есть порядок байт не поменяется. Вот кажется мне что здесь эта ситуация. Проверить быстродействие можно с помощью любого таймера. Настраиваете его на частоту отсчетов скажем 1 МГц. Запускаете таймер, выполняете участок кода скорость работы которого нужно определить. По окончанию выполнения отключаете таймер и смотрите содержимое регистра CNT, которое будет прямо содержать время выполнения кода в микросекундах. Будут некоторые накладные расходы на запуск и остановку таймера, но их можно нивелировать просто выполнив код не один раз, а скажем 100 или 1000. Чем выше это число, тем точнее измерение. Главное счетчик таймера не переполнить. А то будут неправильные показания. Ну и оптимизацию советую включить. Она запросто может скорость выполнения в несколько раз поднять, в некоторых случаях. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 Оптимизация включена на максимум. Вот на фото как выглядит начало массива, читаю с 1 ого элемента 4 байта. И второе фото на переменных видно в каком виде переносятся данные, _REV() конечно пока отключил. 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 7 сентября, 2018 Поделиться Опубликовано 7 сентября, 2018 Так все правильно работает. В массиве 0х01, 0x02, 0x03, 0xB4, в переменной "х" те же 0х01, 0x02, 0x03, 0xB4. Если посмотреть содержимое памяти по адресу 0х20000080, то там как раз и будет эта последовательность. Микроконтроллер работает в Little-Endian кодировке, а естественный для человека порядок - Big-Endian. Отладчик значения переменных выводит именно в последней кодировке, хотя хранятся они в первой. Отсюда и путаница. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 (изменено) Да нет никакой путаницы! Вот поглядите пример в отладчике, непосредственно в железе, создал две переменные registr_1, registr_2 пусть это будут целевые регистры допустим идентификатор CAN шины. Вот туда то мне и нужно положить полученный результат, в первом случае с memcpy, во втором тот вариант что я описал выше. В первом случае без функции _REV() результат не верный. Во втором все как надо, вот и напрашивается вывод что в первом случае без переворачивания данных не обойтись. И все равно в каком режиме работает контроллер, главное нужен правильный результат. Изменено 8 сентября, 2018 пользователем optima 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 6 часов назад, optima сказал: нужен правильный результат Эта фраза, в Вашем случае (и во всех подобных), относительная. Т.к. идёт нестандартное преобразование. Откуда уверенность, что в самом массиве данные лежат "правильно" ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 Ещё как вариант : Будет выполняться быстрее, чем memcpy. Т.к. все манипуляции будут происходить с помощью команд процессора. Для примера, на PIC32 (MIPS32) - 3 команды. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 52 минуты назад, Alex сказал: Откуда уверенность, что в самом массиве данные лежат "правильно" ? Массив создан мной, потому и уверенность что там все лежит как надо. За вариант спасибо, попробую вникнуть 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 5 минут назад, optima сказал: потому и уверенность что там все лежит как надо Ха... Создайте по-другому его, и будет лежать по-другому, как надо 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 8 сентября, 2018 Поделиться Опубликовано 8 сентября, 2018 (изменено) 9 минут назад, Alex сказал: Ха... Создайте по-другому Не вижу смысла! библиотека должна быть одна, не важно какой кристалл используешь. Она из рабочего проекта на 103 процессоре, не буду же я под каждый процессор создавать новый массив. Тем более он не маленький и постоянно пополняется, не редактировать же после каждого изменения кучу массивов. Изменено 8 сентября, 2018 пользователем optima 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.