Jump to content

    

pvo125

Участник
  • Content Count

    37
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pvo125

  • Rank
    Участник
  • Birthday 06/30/1980

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Черногорск Хакасия
  1. STM32f429 Stop режим c under-drive

    Здравия Всем! Хочу отправить данный МК в Stop режим с меньшим потреблением. Делаю следующее: КодPWR->CR |=PWR_CR_LPDS;    //В Stop-mode работает low-power regulator PWR->CR |=PWR_CR_FPDS;         //Flash в power-down в Stop режиме PWR->CR |=PWR_CR_LPUDS;      // low-power regulator в режим under-drive; PWR->CR |=PWR_CR_UDEN;    //  Включаю собственно сам режим under-drive while(!(PWR->CSR & PWR_CSR_UDSWRDY)) {} Программа зависает на ожидании флага PWR_CSR_UDSWRDY который должен выставиться если режим активируется но этого не происходит. Сами биты UDEN устанавливаются. Ток потребления должен снизиться больше чем в 2 раза. Если просто Stop-mode когда флеш не выключена, регулятор выбран основной и режим under-drive не активирован --- 400 мка. И когда флэш в power down, выбран low-power регулятор и еще активирован режим under-drive ---120 мка. Получается ни по току ни по флагу режим не активируется. Подскажите кто разобрался с этим!
  2. STM32F091 CAN filters init

    ЦитатаCAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; Не знаю в какой режим Вы пытаетесь настроить фильтры но строчка выше говорит что в режиме Id Mask. Т е пропускать все сообщения если они по маске проходят а нужно в режиме списка идентификаторов ID List.В SPL есть такой параметр CAN_FilterMode_IdList может быть надо так писать CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; Не уверен на SPL инициализацию не делал. Главное отладчиком посмотрите чтобы в регистре CAN1_FB1M были установлены биты FBM0 FBM1 которые и показывают что банки 0 и 1 в режиме списка идентификаторов.
  3. STM32F091 CAN filters init

    Выбираете 11 битный идентификатор. Далее в режиме ID List чтоб только полное совпадение ID пропускалось фильтром. Далее 16 битный режим фильтров. Получится на один банк например первый настроить 4 фильтра ( для сообщений 0x434 0x3b3 0x171 0x42f) для пятого ID нужно будет задействовать второй банк. Далее пример с записью в регистры CAN. Если на SPL будете делать все равно отладчиком надо сравнить значения самих фильтров со значением ниже. Как мапятся показано ниже STDID[10:3] STDID[2:0] RTR IDE EXID[17:15] КодCAN1->FM1R |= CAN_FM1R_FBM1;           //Filters bank 1  mode ID List CAN1->FS1R&=~CAN_FS1R_FSC1          // Filters bank 1  scale 16 bits     CAN1->FFA1R|=CAN_FFA1R_FFA1;         // Filters bank 1   FIFO1             4        3         4        RTR    IDE    EXTID 1 0 0 | 0 0 1 1 | 0 1 0 0 |   0   |   0   |   000      1 0 0  0 | 01 1   0|1 0 0     0|       0      000        =       0x 8680                          3            b       3        RTR   IDE   EXTID 0 1 1 |1  0 1 1 | 0  0 1 1 |   0  |   0   |  000     0 1 1  1| 0 1 1   0 |0 1 1     0  |   0       000       =          0x7660           CAN1->sFilterRegister[1].FR1=0x76608680; //Filters bank 1 fmi=00 ID=0x434 IDE=0 RTR=0   data_frame ( 11 bit ID  )                                              //Filters bank 1 fmi=01 ID=0x3b3 IDE=0 RTR=0     data_frame    1            7         1       RTR     IDE     EXTID 0 0 1| 0  1 1 1 | 0  0  0 1 |   0   |   0   | 000      0 0 1  0 |1 1 1   0 |0  0 1      0  |   0      000            =       0x 2E20     4             2        f      RTR    IDE   EXTID 1 0 0| 0  0 1 0 | 1  1 1 1 |   0  |   0   |  000     1 0 0  0 |0 1 0   1| 1 1 1      0 |   0       000      =    0x85E0 CAN1->sFilterRegister[1].FR2=0x85E0 2E20;    //Filters bank 1 fmi=02 ID=0x171 IDE=0 RTR=0    data_frame                                                     //Filters bank 1 fmi=03 ID=0x42f  IDE=0 RTR=0   data_frame
  4. Обновление прошивки через CAN

    ЦитатаА Вы вообще проверили запись по 8 байт? Что-то мне подсказывает, что это возможно не будет работать. Да проверял. я же писал выше что вся прошивка записывается и даже crc32 всего массива по окончанию записи совпадает. Меня интересовал вопрос в вычислении CRC дополнительно т е программно при принятии каждого пакета(8 байт). В stm можно писать от 1 - до 4 байт за раз( можно еще 8 но там вроде нужен внешний источник). (В stm32f10 вроде минимум 4 байта двумя посылками по 2 байта может и наврал пока до них не дошел).
  5. Обновление прошивки через CAN

    ЦитатаУж не запись ли с ожиданием завершения сделали внутри ISR? wacko.gif Да так и сделал Специально не считал но думал что запись 2 слов по 4 байта за раз во флэш не займет много времени. Тем более что в это время все равно останавливается выполнение инструкций из основной (рабочей ) части флэш. В stm32f429 можно флэш разбить на 2 части с выполнинием кода из одной из записи стирания другой. Но так не сделал потому что в сети есть stm32f10x контроллер и у них такой фичи нет потому решил делать общий алгоритм чтобы на оба типа можно было перенести. А в таком общем виде вторая половина и первая физически одно целое и выполниние инструкций останавливается.(последнюю фразу хочу уточнить у участников форума).
  6. Обновление прошивки через CAN

    Цитатавсё так, но от потери сообщения это не спасет Поясните пожалуйста. Как я понял в кан сети сообщение не может потеряться. Ведь если никто не принял сообщение передатчик также будет перепосылать последнее сообщение. Или Вы имеете ввиду случай когда кабель физически поврежден?
  7. Обновление прошивки через CAN

    Принимаю прошивку во вторую половину флэш. После принятия ресет контроллера и запуск бутлоадера который перепишет со второй половины в первую (рабочую) и затем снова ресет и запуск обновленного приложения (из первой половины). Может это конечно и лишнее переписывать с одного в другое но вторая часть все равно не используется прошивки меньше половины. Пишу по 8 байт так как сама функция записи находится в обработчике прерывания для CAN и считаю 8 байт быстро записываются. И действительно если при записи выполнение останавливается то оно останавливается "не на долго". Можно конечно и буфер в озу сделать и писать во флэш например по сектору 1-16 кб но решил делать так. Не знаю время покажет может быть и переделаю. Кстати нашел подтверждения для своего заключения в первом посте. На сайте https://www.can-cia.org/can-knowledge/can/crc/ нашел описание этого механизма. ЦитатаThe receivers use the same polynomial to calculate the check sum from the bits as seen on the bus-lines. The self-calculated check sum is compared with the received on. If it matches, the frame is regarded as correctly received and the receiving node transmits a dominant state in the ACK slot bit, overwriting the recessive state of the transmitter. In case of a mismatch, the receiving node sends an Error Frame after the ACK delimiter. Если правильно перевел то сообщение сохраняется в FIFO и генерируется прерывание если crc аппаратно проверенное совпадает. Если нет то приемный узел начинает передавать Eror Frame и передатчик перепосылает сообщение. Все это без участия ядра контроллера и значит считать программно CRC каждого принятого пакет не стоит он уже проверен и можно писать во flash.
  8. Обновление прошивки через CAN

    ЦитатаНа принимающей стороне исходный пакет собирается и анализируется, в том числе производится проверка CRC исходного пакета. Про это я и спрашивал. Понятно что можно каждое сообщение проверять на CRC и если не совпадает то заново просить переотправить. Но хотел использовать аппаратную функцию модуля CAN если он действительно работает как я думаю и описал выше тогда мне просто надо писать во флэш принятое сообщение так как оно уже прошло фильтрацию и проверку CRC. А если не прошло то ведущий повторит автоматически. Сейчас у меня все работает "на столе" и обновление происходит и CRC32 всей новой прошивки по окончанию всей передачи совпадает. Но для меня надо понять это происходит просто пока на столе или потому что модули CAN сами отбрасывают и переотправляют сообщения и в итоге во флэш получается корректная CRC. Т.е сейчас алгоритм такой пишу во флэш все что приходит когда я попадаю в прерывание от CAN и в конце CRC32 всего массива если не совпало то заново процесс обновления. Но так не очень правильно потому что нужно опять стирать флэш. Лучше уж сначала проверить пришедший пакет и потом записать.
  9. Доброго Всем! Делаю обновление прошивки по CAN. Один контроллер посылает другому пакеты по 8 байт с данными (оба STM). На принимающей стороне настроен фильтр и все работает. Но появились сомнения по поводу достоверного принятия каждого пакета по 8 байт. В CAN есть CRC16 которая приписывается к каждой посылки те для каждых 8 байт в моем случае . Вопрос в том примет ли принимающий контроллер те пропустит через фильтр сообщение если данные придут "кривые". Надо ли мне каждую посылку из 8 байт проверять на CRC после того как она прошла через фильтр и попала в майлбокс и сработало прерывание. Или все это делается аппаратно и если я попал в обработчик по этому фильтру значит эти 8 байт можно смело писать во флэш и отправлять запрос на след. посылку. И еще такой момент если я правильно понимаю и все аппаратно отбрасывается или принимается то при принятии кривых данных на принимающем контроллере я не попаду в обработчик и сам принимающий контроллер не выставит подтверждение в ACK слоте и значит отправляющий контроллер автоматически перепошлет это сообщение. Поделитесь мыслями кто делал обновление и считали ли дополнительно контрольную сумму каждой посылки или все это было аппаратно.
  10. Кейл. Вставить crc бинарник.

    Точно!!! Спасибо Вам большое долго парился c "-max". Даже нашел альтернативу сдвинуть все на 4 и записать crc в первые 4 байта. Кодsrec_cat test.bin -BIN -offset 0x4 -crc32-l-e 0x0  -o test.bin -BIN Только в конце строчки Кодsrec_cat input.bin -bin --crc32-l-e -max-addr input.bin -bin -o output.bin -output надо -bin а не -output Кодsrec_cat input.bin -bin --crc32-l-e -max-addr input.bin -bin -o output.bin -bin Эта строчка Кодsrec_cat input.bin -bin -crop 0 0x1c -c-n-l-e 0x1C 4 4 input.bin -bin -exclude 0 0x20 -o output.bin -binделает ровно то с чего я начал топик(файл ElfDWT) со смещением 0x1C вставляет 0xBFFC824A. Мне кажется удобнее когда или в начала crc или в конце. Мнение мое поменялось. Буду пользоваться первыми двумя. Спасибо Всем!
  11. Кейл. Вставить crc бинарник.

    Run #1 $K\ARM\ARMCC\BIN\fromelf.exe --bin -o output\test.bin !L делаю бинарник Run #2 D:\Keil\ARM\BIN\srec_cat test.bin -BIN --crc32-l-e 0x34В90 -o test_1.bin -BIN считается crc32 для test.bin и записывается в файл test1.bin по адресу 0x34D90. Этот адрес посмотрел вручную редактором. Подскажите пожалуйста как писать crc в конец файла данной утилитой когда не известно предварительно размер файла test.bin. или как можно записать crc по адресу со смещением 0x1C как писал выше.
  12. Кейл. Вставить crc бинарник.

    ЦитатаЭто не CRC, а контрольная сумма, и не всего бинарника, а только векторов. Специфичная для LPC вещь, описание можно найти в документации на процессор. Да действительно пример был для NXP. Похоже что это вовсе не то чего я хотел(не правильно перевел да и слово checksum похоже вовсе не CRC). Отрицательный результат тоже результат. Думал автоматизировать процесс. А вообще так можно делать считать CRC бинарника и вручную вписывать это значение по адресам со смещением 0x1C. Я понял что эти 4 байта (адрес) для cortex-m зарезервированы? Так можно делать?
  13. Кейл. Вставить crc бинарник.

    Файл test.bin открыт в редакторе hex. Видно что crc записана в нужное место но только эта crc (0xbffc824a) не совпадает если например в этом редакторе выделить весь бинарник целиком и отобразить контрольную сумму. Пробовал вместо CRC вписывать 0x00000000 типа как бы бинарник в котором по умолчанию по этому адресу нули. Все равно crc не та. Просто мне затем надо писать функцию на мк(stm32) которая бы считывала эту crc из файла и сравнивала его с crc самого бинарника. Но не могу понять как этот crc вычисляется в самой IDE (keil.)
  14. Здравствуйте Все! Пытаюсь сделать следующее: хочу после компиляции и сборки чтобы кейл вычислял crc и записывал эту сумму в сам файл bin. Нашел инструкцию в которой написано что нужно добавить options for target->user->Run user programs after Build/Rebuild сначала команду Run#1 $K\ARM\BIN\ElfDwT.exe output\test.axf BASEADDRESS(0x08000000) которая вычислит crc кода и запишет в место в стартапе по адресу 0x0800 000+0x1c(для BASEADDRESS=0x08000000 ). Далее Run#2 $K\ARM\ARMCC\BIN\fromelf.exe --bin -o test.bin !L делаем из axf бинарник уже со встроенной crc. Все получается открываю бинарник там вместо вектора в стартапе (где обычно зарезервировано 0 со смещением 0x1С) находится crc 0xBFFC824A. Все вроде хорошо но только эта сумма не совпадает и не понятно как кейл ее считает. Проверяю так: Просто делаю бинарник в кейл с помошью такой же вкладки но только использую одну fromelf без предварительно вставленной crc. Затем открываю в редакторе hex (Hex Editor ) и смотрю crc не совпадает. Пробовал онлайн калькулятор crc для файлов результат аналогичный. Причем hex редактор совпадает с онлайн суммой а вот кейлом нет. Разъясните кто знает! Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.
  15. STM32F476 USB CDC. Device. Как отследить отключение / подключение

    Как понять недокументированы? Как раз 31-21 биты документированы и написано что зарезервированы и должны сохранять reset value. А reset value 0x0001 0000. Т е 31-21 должны быть нулевые. Откуда может взяться 1 в 29 бите в этом регистре. Или я что то не дочитал?