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

Вопросы от начинающих по МК


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

Использовать эмуляцию EEPROM во FLASH довольно-таки популярно на МК, у которых EEPROM отсутствует. Я себе тоже набросал вариант. Только, в отличие от большинства, у меня поиск следующей свободной области выполняется бинарным поиском, это значительно сокращает время (особенно если структура небольшая, а свободного флеша много; я даже логи во флеш писал на одной железяке: первый свободный килобайт после прошивки был отдан на сохранение настроек, а все остальное — больше 100кБ — для хранения логов; но там чуть хитрей нужна конструкция в линкер-скрипте).

Кстати, про STM32 я наврал: там блоки размером по 16 бит, а не 32.

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

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

3 часа назад, Электронщик сказал:

а у меня получается первое слово 60606060,

возможно это проблема с чтением из уарта, в этом коде

  while(!USART1->SR & USART_SR_RXNE);
   data35[y]=USART1->DR;

Как будто у вас флаг принятого байта не сбрасывается! (он вроде как должен чтением сбрасываться, СКОРЕЕ ВСЕГО вы не тот флаг здесь проверяете!) Поэтому один и тот же байт записывается пока не придет новый байт!

Это просто версия которую надо проверить.

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

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

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

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

Это просто версия которую надо проверить.

Все тут в порядке, пользуюсь этим 100 лет. Удалось все принять по UART как нужно, и вывести в UART данные из флэш, все как нужно(проблема была в правильности записи в RAM, теперь нужно сделать проверку контрольной суммы, а так же понять почему файл размером ровно 1024 байта, что в свойствах, что в открытии через hexeditor, но принимать нужно 1057байт, почему так пока не пойму.

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Добрый день.

Помогите, пожалуйста, с кодом. Это не разработка, просто интересно поковыряться. Код генерил Cube, писал в Atolic

Код компилируется, но в процессе отладки не настраивается режим работы вывода порта

key0.setPinTime(GPIOE, GPIO_PIN_4, GPIO_MODE_INPUT, GPIO_PULLUP, timeBut); 

В отладчике видно, при обработке метода класса,  происходит переход в функцию HAL_GPIO_Init(_GPIOx, &GPIO_InitStruct);

и, вроде, структура GPIO_InitStruct получает свои значения, но настройка не осуществляется.

 

 

 

atol_pr4_cpp.7z

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

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

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

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

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

Перенесите свой код из секции  /* USER CODE BEGIN Init */ в секцию /* USER CODE BEGIN 2 */.

Сейчас вы пытаетесь работать с выключенным тактированием порта. Тактирование включается в функции MX_GPIO_Init();

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

20 часов назад, Электронщик сказал:

Все тут в порядке, пользуюсь этим 100 лет. 

Уважаемый, а вы можете объяснить как работает эта ваша конструкция:

while(!USART1->SR & USART_SR_RXNE);

Вы логически отрицаете то, что находится в регистре статуса  USART1->SR, а потом делаете побитовое  сложение с константой.
я конечно понимаю, что это может как-то работать. (а вернее - никак, об этом вам Eddy_Em написал) Но сдается мне, вы хотели написать это:

while(!(USART1->SR & USART_SR_RXNE));

Такая запись сначала выделяет бит RXNE в регистре статуса, а уж потом инвертирует его логическое состояние. Т.е, если бит установлен у вас будет false, если бит сброшен - true.

Чтобы не было таких ошибок, нужно либо держать перед собой таблицу приоритетов операций в языке Си, либо активнее пользоваться скобками и не стесняться этого, либо вообще так писать:

while(0 == (USART1->SR & USART_SR_RXNE));

Скрытый текст

image.png.87371944f8c53da9b64bdb45261ec2e1.png

 

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

Может кто подскажет, отправляю посылку прошивки с компа на STM32, посылки по 256байт, контрольная сумма CRC16, вопрос такой, контрольную сумму в 4байта отправлять в этой посылке? То есть 252байта данные, и 4 байта контрольная сумма и посылка получится 256байт, или же 256байт данных, а потом отдельно четыре байта сумма? Хотя как я понимаю правильный вариант 252байта данных+ 4 байта контрольная сумма, ведь это же сумма этой посылки, а так сумма в отдельной посылке может потеряться.

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

22 часа назад, Электронщик сказал:

... посылки по 256байт, контрольная сумма CRC16...

контрольную сумму в 4байта отправлять в этой посылке?

я правильно понял, вы хотите посчитать CRC блока данных в 256 байт, потом отправить 252 байта и последние 4 байта заменить контрольной суммой?
Я ничего не упустил?
Т.е., приняв этот блок в 256 байт, принимающая сторона посчитает CRC16 для этих 256 байт?
И какая CRC получится?
Почему нельзя послать 260 байт?

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

4 часа назад, LiVit сказал:

Почему нельзя послать 260 байт?

Потому как буфер COM-порта компьютера  имеет максимальный размер 256байт. Потому либо слать 252 данные+ 4 байта контрольная сумма, либо 256байта данных и за ним посылка на 4 байта сумма.

4 часа назад, LiVit сказал:

Я ничего не упустил?

Все правильно.

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

5 часов назад, Электронщик сказал:

Потому как буфер COM-порта компьютера  имеет максимальный размер 256байт.

Да ну ? Что-то не верится ... Откуда информация такая ? :rolleyes:

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

21.03.2021 в 15:23, Eddy_Em сказал:

Чушь какая! Размер буфера — 4кБ!!!

Ну почему-то на C# если больше 256 байт принять из банарника и отправить в COM, ошибка при компиляции. ДА и в нете читал многие по 256 байт отправляют.

Может кто подскажет. Раньше писал напрямую в RAM STM32F103, и проблем не было, теперь начал использовать двухмерный массив, так как нужно CRC рассчитать, после каждых принятых 256 байт, и появилась проблема, принимаю сейчас 1024байта, то есть 4 посылки по 256 байт, но почему-то получаю по 8 одинаковых байт.

//прием 1024 байта по ЮАРТ
static uint8_t data135[257][5];
while (gha<4)
   {
	for (uint16_t hds=0; hds<256; hds++)
	   {
while(!USART1->SR & USART_SR_RXNE);
data135[hds][gha]=USART1->DR;
       }
gha++;
   }

//Вывод первых 256 байт в ЮАРТ
uint8_t data21[5];
for(uint32_t gh=0; gh<=256; gh+=4){
data20=data135[3+gh][0]<<24|data135[2+gh][0]<<16|data135[1+gh][0]<<8|data135[0+gh][0];
  data21[3]=data20>>24;
  data21[2]=data20>>16;
  data21[1]=data20>>8;
  data21[0]=data20;
  for(uint8_t y=0;y<=3;y++){
send_to_uart(data21[y]);
}
}

 

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

14 minutes ago, Электронщик said:

Ну почему-то на C# если больше 256 байт принять из банарника и отправить в COM, ошибка при компиляции.

А зачем вы вместо ЯП пользуетесь всякой кустарщиной? И да, реализация зависит от конкретного ядра. У меня, например, размер буфера — 4кБ. А кто-то может в настройках ядра сделать и больше. С другой стороны, в какой-нибудь игровой прошивке может быть и не 4кБ, а меньше — зачем геймерам большой буфер на последовательное устройство?

Да, а еще есть кастомные USB<>UART преобразователи, и в их модулях может быть своя буферизация с совершенно другим размером буфера.

В общем, при записи надо контролировать, сколько байт уже записано. Например, вот так:

ssize_t write_tty(int comfd, const char *buff, size_t length){
  size_t L = length;
  do{
    ssize_t w = write(comfd, buff, length);  
    if(w < 1){ /* error, warning etc */ return -1;}
    L -= w;
  }while(L);
  return length;
}

 

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

4 часа назад, Электронщик сказал:

 но почему-то получаю по 8 одинаковых байт.



while(!USART1->SR & USART_SR_RXNE);

 

Потому что вы не читаете то, что вам пишут.

Еще раз - объясните, как работает эта ваша странная конструкция?

Да никак!

Этот while не отрабатывается.

Вы хоть дебаггером гляньте.

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

38 minutes ago, Электронщик said:

все в интернете пользуются без скобок.

triple facepalm! Вот пример:

cat 1.c 
#include <stdio.h>
int main(){
        int a = 1, b = 2;
        printf("without braces: %d - %d\n", !a & 1, !b & 1);
        printf("with braces: %d - %d\n", !(a & 1), !(b & 1));
        return 0;
}
  
gcc 1.c && ./a.out
without braces: 0 - 0
with braces: 0 - 1

Разница видна?

И вообще, крайне советую спорные моменты отрабатывать сначала в консольке. Я многие алгоритмы для МК сначала моделирую в octave, но сразу их не переношу, если сомневаюсь, хватит ли мне, скажем, uint16_t для каких-то вещей (в октаве-то по умолчанию даблы, а если даже какую-то переменную явно ограничить интом, то она все равно так и норовит чуть что ее в дабл перевести). Пишу проверочный кусочек кода на С (с худшими вариантами, а то и вовсе с перебором), собираю, смотрю выхлоп.

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

@Электронщик , у операции "!" приоритет выше, чем у "&".
Вам однозначно нужно ставить скобки в своём выражении.
И если с ними не работает, значит проблема не в этом.

Таблица приоритетов :

slide-60.jpg.53ae0fbe46634501cbbe530e087e6e04.jpg

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

Появилась новая проблема, а именно нужно вычислять CRC16, на компе у меня программа на C# и использую этот код

 static readonly ushort[] crc16Table = new ushort[]
            {
        0x0000, 0xC1C0, 0x81C1, 0x4001, 0x01C3, 0xC003, 0x8002, 0x41C2,
        0x01C6, 0xC006, 0x8007, 0x41C7, 0x0005, 0xC1C5, 0x81C4, 0x4004,
        0x01CC, 0xC00C, 0x800D, 0x41CD, 0x000F, 0xC1CF, 0x81CE, 0x400E,
        0x000A, 0xC1CA, 0x81CB, 0x400B, 0x01C9, 0xC009, 0x8008, 0x41C8,
        0x01D8, 0xC018, 0x8019, 0x41D9, 0x001B, 0xC1DB, 0x81DA, 0x401A,
        0x001E, 0xC1DE, 0x81DF, 0x401F, 0x01DD, 0xC01D, 0x801C, 0x41DC,
        0x0014, 0xC1D4, 0x81D5, 0x4015, 0x01D7, 0xC017, 0x8016, 0x41D6,
        0x01D2, 0xC012, 0x8013, 0x41D3, 0x0011, 0xC1D1, 0x81D0, 0x4010,
        0x01F0, 0xC030, 0x8031, 0x41F1, 0x0033, 0xC1F3, 0x81F2, 0x4032,
        0x0036, 0xC1F6, 0x81F7, 0x4037, 0x01F5, 0xC035, 0x8034, 0x41F4,
        0x003C, 0xC1FC, 0x81FD, 0x403D, 0x01FF, 0xC03F, 0x803E, 0x41FE,
        0x01FA, 0xC03A, 0x803B, 0x41FB, 0x0039, 0xC1F9, 0x81F8, 0x4038,
        0x0028, 0xC1E8, 0x81E9, 0x4029, 0x01EB, 0xC02B, 0x802A, 0x41EA,
        0x01EE, 0xC02E, 0x802F, 0x41EF, 0x002D, 0xC1ED, 0x81EC, 0x402C,
        0x01E4, 0xC024, 0x8025, 0x41E5, 0x0027, 0xC1E7, 0x81E6, 0x4026,
        0x0022, 0xC1E2, 0x81E3, 0x4023, 0x01E1, 0xC021, 0x8020, 0x41E0,
        0x01A0, 0xC060, 0x8061, 0x41A1, 0x0063, 0xC1A3, 0x81A2, 0x4062,
        0x0066, 0xC1A6, 0x81A7, 0x4067, 0x01A5, 0xC065, 0x8064, 0x41A4,
        0x006C, 0xC1AC, 0x81AD, 0x406D, 0x01AF, 0xC06F, 0x806E, 0x41AE,
        0x01AA, 0xC06A, 0x806B, 0x41AB, 0x0069, 0xC1A9, 0x81A8, 0x4068,
        0x0078, 0xC1B8, 0x81B9, 0x4079, 0x01BB, 0xC07B, 0x807A, 0x41BA,
        0x01BE, 0xC07E, 0x807F, 0x41BF, 0x007D, 0xC1BD, 0x81BC, 0x407C,
        0x01B4, 0xC074, 0x8075, 0x41B5, 0x0077, 0xC1B7, 0x81B6, 0x4076,
        0x0072, 0xC1B2, 0x81B3, 0x4073, 0x01B1, 0xC071, 0x8070, 0x41B0,
        0x0050, 0xC190, 0x8191, 0x4051, 0x0193, 0xC053, 0x8052, 0x4192,
        0x0196, 0xC056, 0x8057, 0x4197, 0x0055, 0xC195, 0x8194, 0x4054,
        0x019C, 0xC05C, 0x805D, 0x419D, 0x005F, 0xC19F, 0x819E, 0x405E,
        0x005A, 0xC19A, 0x819B, 0x405B, 0x0199, 0xC059, 0x8058, 0x4198,
        0x0188, 0xC048, 0x8049, 0x4189, 0x004B, 0xC18B, 0x818A, 0x404A,
        0x004E, 0xC18E, 0x818F, 0x404F, 0x018D, 0xC04D, 0x804C, 0x418C,
        0x0044, 0xC184, 0x8185, 0x4045, 0x0187, 0xC047, 0x8046, 0x4186,
        0x0182, 0xC042, 0x8043, 0x4183, 0x0041, 0xC181, 0x8180, 0x4040
            };

            public static ushort CRC16(byte[] bytes, int len)
            {
                ushort crc = 0xFFFF;
                for (var i = 0; i < len; i++)
                    crc = (ushort)((crc << 8) ^ crc16Table[(crc >> 8) ^ bytes[i]]);
                return crc;
            }
        }

На МК С и использую это

const unsigned short Crc16Table[256] ={
     0x0000, 0xC1C0, 0x81C1, 0x4001, 0x01C3, 0xC003, 0x8002, 0x41C2,
     0x01C6, 0xC006, 0x8007, 0x41C7, 0x0005, 0xC1C5, 0x81C4, 0x4004,
     0x01CC, 0xC00C, 0x800D, 0x41CD, 0x000F, 0xC1CF, 0x81CE, 0x400E,
     0x000A, 0xC1CA, 0x81CB, 0x400B, 0x01C9, 0xC009, 0x8008, 0x41C8,
     0x01D8, 0xC018, 0x8019, 0x41D9, 0x001B, 0xC1DB, 0x81DA, 0x401A,
     0x001E, 0xC1DE, 0x81DF, 0x401F, 0x01DD, 0xC01D, 0x801C, 0x41DC,
     0x0014, 0xC1D4, 0x81D5, 0x4015, 0x01D7, 0xC017, 0x8016, 0x41D6,
     0x01D2, 0xC012, 0x8013, 0x41D3, 0x0011, 0xC1D1, 0x81D0, 0x4010,
     0x01F0, 0xC030, 0x8031, 0x41F1, 0x0033, 0xC1F3, 0x81F2, 0x4032,
     0x0036, 0xC1F6, 0x81F7, 0x4037, 0x01F5, 0xC035, 0x8034, 0x41F4,
     0x003C, 0xC1FC, 0x81FD, 0x403D, 0x01FF, 0xC03F, 0x803E, 0x41FE,
     0x01FA, 0xC03A, 0x803B, 0x41FB, 0x0039, 0xC1F9, 0x81F8, 0x4038,
     0x0028, 0xC1E8, 0x81E9, 0x4029, 0x01EB, 0xC02B, 0x802A, 0x41EA,
     0x01EE, 0xC02E, 0x802F, 0x41EF, 0x002D, 0xC1ED, 0x81EC, 0x402C,
     0x01E4, 0xC024, 0x8025, 0x41E5, 0x0027, 0xC1E7, 0x81E6, 0x4026,
     0x0022, 0xC1E2, 0x81E3, 0x4023, 0x01E1, 0xC021, 0x8020, 0x41E0,
     0x01A0, 0xC060, 0x8061, 0x41A1, 0x0063, 0xC1A3, 0x81A2, 0x4062,
     0x0066, 0xC1A6, 0x81A7, 0x4067, 0x01A5, 0xC065, 0x8064, 0x41A4,
     0x006C, 0xC1AC, 0x81AD, 0x406D, 0x01AF, 0xC06F, 0x806E, 0x41AE,
     0x01AA, 0xC06A, 0x806B, 0x41AB, 0x0069, 0xC1A9, 0x81A8, 0x4068,
     0x0078, 0xC1B8, 0x81B9, 0x4079, 0x01BB, 0xC07B, 0x807A, 0x41BA,
     0x01BE, 0xC07E, 0x807F, 0x41BF, 0x007D, 0xC1BD, 0x81BC, 0x407C,
     0x01B4, 0xC074, 0x8075, 0x41B5, 0x0077, 0xC1B7, 0x81B6, 0x4076,
     0x0072, 0xC1B2, 0x81B3, 0x4073, 0x01B1, 0xC071, 0x8070, 0x41B0,
     0x0050, 0xC190, 0x8191, 0x4051, 0x0193, 0xC053, 0x8052, 0x4192,
     0x0196, 0xC056, 0x8057, 0x4197, 0x0055, 0xC195, 0x8194, 0x4054,
     0x019C, 0xC05C, 0x805D, 0x419D, 0x005F, 0xC19F, 0x819E, 0x405E,
     0x005A, 0xC19A, 0x819B, 0x405B, 0x0199, 0xC059, 0x8058, 0x4198,
     0x0188, 0xC048, 0x8049, 0x4189, 0x004B, 0xC18B, 0x818A, 0x404A,
     0x004E, 0xC18E, 0x818F, 0x404F, 0x018D, 0xC04D, 0x804C, 0x418C,
     0x0044, 0xC184, 0x8185, 0x4045, 0x0187, 0xC047, 0x8046, 0x4186,
     0x0182, 0xC042, 0x8043, 0x4183, 0x0041, 0xC181, 0x8180, 0x4040
 };

unsigned short Crc16(unsigned char * pcBlock, unsigned short len)
{
    unsigned short crc = 0xFFFF;

    while (len--)
        crc = (crc << 8) ^ Crc16Table[(crc >> 8) ^ *pcBlock++];
    return crc;
}

И получаю разные суммы, хотя посылки по байтово просмотрел все как нужно. Смущает только что на С длина декрементируется , а на C# инкрементируется

Взял отсюда https://ru.wikibooks.org/wiki/Реализации_алгоритмов/Циклический_избыточный_код

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

5 minutes ago, Электронщик said:

на С длина декрементируется , а на C# инкрементируется

ну да, ну да…

А внимательно почитать - не? Абсолютно же одно и то же (если я правильно рассуждаю о логике до-диеза).

А почему бы с компьютерной стороны не написать на том же С или хотя бы С++? Зачем эту мелкомягкую отрыжку использовать?

И еще вопрос: зачем такой сложный табличный способ использовать для расчета КС, если можно просто

 uint16_t CRC = 0; for(int i = 0; i < len; ++i) CRC ^= mesg[i]; 

?

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

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

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

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

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

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

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

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

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

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

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

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