Jump to content

Recommended Posts

ДА все стерто, и все пишется, вопрос в том что правильно принять бинарный файл по UART собрать правильно его его в слова по 32бита, и правильно переписать во флэш, так как у меня это все работает, только значения не те что в бинарникею

40 минут назад, Eddy_Em сказал:

Нет же! Флеш только стирается страницами. А писать его можно блоками (которые, скажем, у STM32 — 4 байта).

Так я так и пишу.

Share this post


Link to post
Share on other sites
Posted (edited)

Вот оригинал бинарникаScreenshot_9.jpg.ec4b3cf766baa4536771816694514358.jpg

А вот то что во флэше получаетсяScreenshot_14.jpg.975fbb5641659976e01cef378ad5ac6d.jpg

То есть должно быть 60 04 00 20 в одном слове, а у меня получается первое слово 60606060, второе слово 60606060, третье слово 60606060, четвертое слово 60606060, пятое слово 04040404, шестое слово 04040404, седьмое слово 04040404, восьмое слово 04040404, девятое слово 00000000 десятое слово 00000000, одинацатое слово 00000000, двенадцатое слово 00000000, тринадцатое слово 20202020. То есть все что нужно но не в одном слове а растянуто на несколько слов.

 

 

Edited by Электронщик

Share this post


Link to post
Share on other sites

Странности какие-то... Вы пишите по 4 раза одно и тоже.
Посто сделайте массив байтов, который заполняется из Уарта. И этот массив записывайте во флеш, по конкретному адресу.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Инновационные технологии Analog Devices в области управления питанием» (11.08.2021)

В программе вебинара технология Silent Switcher® - сочетание высокого КПД и сверхмалого уровня ЭМИ, технология uModule® - высокоинтегрированные решения для источников питания, микро- и нанопотребляющие DC/DC-преобразователи, решения для резервного питания, цифровое управление системой питания (PSM), безоптронные изолированные обратноходовые преобразователи. В практической части вебинара будут продемонстрированы примеры работы с инструментами Analog Devices для проектирования источников питания.
Подробнее

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

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

Share this post


Link to post
Share on other sites

Концевые микропереключатели KLS – простая и надежная коммутация по оптимальной цене

На складе Компэл широко представлены нажимные переключатели от KLS в стандартных и миниатюрных корпусах с различными типами актуаторов. Микропереключатели серий KLS7-KW10 и KLS7-KW4-3Z соответствуют строгим стандартам электрической безопасности и эффективности, что гарантирует надежную коммутацию цепей управления.

Подробнее

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

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

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

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

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

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

Edited by ruhi

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

Share this post


Link to post
Share on other sites

Датчики STMicroelectronics – новые возможности систем умного дома ST

Согласно прогнозам аналитиков, в ближайшие пару лет будет наблюдаться заметный рост рынка датчиков движения и положения для умного дома. Компания STMicroelectronics предлагает одну из самых широких линеек MEMS-датчиков, включая акселерометры, гироскопы, цифровые компасы, модули IMU, микрофоны и датчики параметров окружающей среды. Рассмотрим применение датчиков и тенденции их развития.
Подробнее

В той конструкции нет скобок, она рассматривается как

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

то бишь как while(0)

 

Share this post


Link to post
Share on other sites
3 часа назад, ruhi сказал:

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

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

Share this post


Link to post
Share on other sites

Добрый день.

Помогите, пожалуйста, с кодом. Это не разработка, просто интересно поковыряться. Код генерил 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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
48 минут назад, snn_krs сказал:

////////////////////

Спасибо большое. Помогло

Edited by Falconist
Оверквотинг

Share this post


Link to post
Share on other sites
Posted (edited)
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

 

Edited by LiVit

Share this post


Link to post
Share on other sites

Я не стесняюсь использовать кучу скобок, т.к. не знаю эту таблицу приоритетов. А если бы и знал, все равно бы скобки использовал :)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Ну, обычно, КС идёт в комплекте с посылкой. А так - пофиг, как удобно ..

Share this post


Link to post
Share on other sites
Posted (edited)
22 часа назад, Электронщик сказал:

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

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

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

Edited by LiVit

Share this post


Link to post
Share on other sites
4 часа назад, LiVit сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
5 часов назад, Электронщик сказал:

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

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

Share this post


Link to post
Share on other sites
22 hours ago, Электронщик said:

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
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]);
}
}

 

Edited by Электронщик

Share this post


Link to post
Share on other sites
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;
}

 

Share this post


Link to post
Share on other sites
4 часа назад, Электронщик сказал:

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



while(!USART1->SR & USART_SR_RXNE);

 

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

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

Да никак!

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
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 для каких-то вещей (в октаве-то по умолчанию даблы, а если даже какую-то переменную явно ограничить интом, то она все равно так и норовит чуть что ее в дабл перевести). Пишу проверочный кусочек кода на С (с худшими вариантами, а то и вовсе с перебором), собираю, смотрю выхлоп.

Edited by Eddy_Em

Share this post


Link to post
Share on other sites

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

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

slide-60.jpg.53ae0fbe46634501cbbe530e087e6e04.jpg

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By Maxim Frantskevich
      Возникла проблема, не знаем как прошить STM8S003F3P6. Уже как только не пытались, кучи различных программ ставили, различными способами пытались подкопаться, всё равно выдаёт либо что не видит, либо просто некую ошибку. По поводу этих ошибок тоже сколько не копались, всё равно ничего. ST-Link рабочий, подключение хорошее. Нужно залить код для управления маленьким движком, чтобы выдавало либо +5В, либо -5В.
      Такое ощущение, что этот контроллер уже просто не поддерживается многими программами.
      Может кто-нибудь из вас знает что можно сделать, или как правильно прошить этот аппарат? Потому что уже кучу роликов на ютубе пересмотрели, форумов перечитали, никак не выходит. Получилось только сделать, чтобы программа увидела STM-ку.
      Благодарю за помощь)
    • By leonid1908
      Проявление неисправности: полное молчание, никакой реакции... Нигде ничего об этом пульте нет, хотя... на али экспрессе есть такой пульт, ну и цена тоже есть....



    • By Михаил Карнаухов
      В общем, во встроенных библиотеках Proteus нет МК PIC12F635. И мне нужна какая-нибудь сторонняя библиотека, что бы там был этот МК
    • By Sergey Krugov
      Доброго времени суток дня и ночи!!! Я конечно понимаю, что за это время уже успел надоесть вам, но прошу откликнуться к просьбе о помощи. 
      Проблема заключается в следующем:

      В данной схеме используется Atmega8
      Фьюзы:

      При симуляции схемы происходит следующее:


      А дальше ничего не происходит. 
      Возникает также проблема такого рода: 

      Почему-то Протеус ругается на это,  но при удалении этой строки из кода в Протеусе, схема начинает вроде бы работать, но дальше setup на ЖКИ ничего не появлется. Очень прошу помочь понять, что не так. Мб на железе это всё бы и работало. Как разрешить эту проблему в программе?
      Я буду очень благодарен всем, кто откликнется на мою проблему. Надеюсь вы не оставите это без внимания. Очень надеюсь...
×
×
  • Create New...