Jump to content

    

Артём__

Свой
  • Content Count

    2119
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Артём__

  • Rank
    Гуру
  • Birthday 03/13/1977

Контакты

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

Recent Profile Visitors

4230 profile views
  1. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 9 2014, 22:54) кстати, а каким эмулятором контроллера пользуетесь? Сейчас пользуюсь или AVR Dragon (худший из всех аппаратных отладчиков) или просто симулятором AtmelStudio (CRC или AES/DES считает правильно, но очень медленно). Раньше пользовался JTAG ICE - JTAG ICE 2 (самый лучший из всех) - JTAG ICE 3. У Atmel-а сейчас какие-то новые отладчики появились (дешёвые совсем), но ими не пользовался - про них ничего сказать не могу.
  2. xmega64a3u CRC-32

    Цитата(Genadi Zawidowski @ Dec 9 2014, 00:51) Как я помню, в языке "C" у тернарной операции (? приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в Может быть, скобки никогда не помешают. Но как же тогда результат получается правильным (пробовал на IAR и GCC)?
  3. xmega64a3u CRC-32

    Цитата(Duhas @ Dec 8 2014, 18:28) 1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий. Так и есть - они эквивалентны.
  4. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 8 2014, 13:12) Проект для CVAVR 3.1 . Скомпилированные ROM и HEX в Debug. Код такой же как у меня за исключением того что в STATUS.BUSY 1 пишется после вычисления, но это может и не важно. Попробуйте написать проще (вдруг это CV глючит): Кодuint32_t Crc32(uint8_t * data, uint16_t data_size) {     CRC.CTRL=0         | CRC_RESET_RESET1_gc         | 1<<CRC_CRC32_bp         | CRC_SOURCE_IO_gc ;     CRC.CTRL=0         | CRC_RESET_NO_gc         | 1<<CRC_CRC32_bp         | CRC_SOURCE_IO_gc ;     CRC.STATUS=1<<CRC_BUSY_bp;     for (uint16_t i=0; i<data_size; i++)         CRC.DATAIN=*data++;     uint32_t crc=*(volatile uint32_t *)&CRC.CHECKSUM0;     crc^=0xFFFFFFFFUL;     return crc; } P.S. Загрузил ваш проект в xm256 - получилось что у вас блок CRC инициализирует CRC не единицами, а нулями. То есть CV почему-то не понимает такое выражение: Код     CRC.CTRL=0         | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)         | 1<<CRC_CRC32_bp         | CRC_SOURCE_IO_gc ; Вместо 0xE1 в CRC.CTRL пишется 0x80.
  5. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 5 2014, 12:46) результаты разные для hard и soft в обоих случаях. Очень странно. Проверил на xmega256A3U - hard, soft и dma дают одинаковый результат. Цитата(ffs2001 @ Dec 5 2014, 12:46) Проверил на двух 64ых На двух? Тенденция , однако...Выложите проект, а вдруг и правда в 64х ошибка.
  6. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 4 2014, 19:58) Так будет использоваться тот же самый хардварный генератор. А он выдаёт не то. То он выдаёт. Цитата(ffs2001 @ Dec 4 2014, 19:58) Совпадение калькулятора и генератора, похоже, было случайным. Совпадают только значения, генерируемые из массива [32] = {0xFF} Ну да,случайность... У меня при входных данных из комментария к функции Цитата/* Name : CRC-32 Poly : 0x04C11DB7 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 Init : 0xFFFFFFFF Revert: true XorOut: 0xFFFFFFFF Check : 0xCBF43926 ("123456789") MaxLen: 268 435 455 байт (2 147 483 647 бит) - обнаружение одинарных, двойных, пакетных и всех нечетных ошибок */ результат получался всеми тремя способами одинаковый - 0xCBF43926. Случайно... Проверял в симуляторе - плату лень искать. На PC не проверял - не нашёл реализацию. Цитата(ffs2001 @ Dec 4 2014, 19:58) Делаю вывод, что хардварный генератор нерабочий. Странно, что этого нет в эррате. Описан он в мануале как-то криво. Но работает. Цитата(ffs2001 @ Dec 4 2014, 19:58) При возможности проверю на другом контроллере, отпишусь. У меня проверялось в atxmega256A3U Цитата(ffs2001 @ Dec 4 2014, 19:58) Компилятор для Атмеги (работаю в CVAVR) на эту строку не ругнулся. Но если не привести код к тому же виду, результат получается РАЗНЫЙ. Вот проект для GCC: [attachment=88529:crc32_02.rar]
  7. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 4 2014, 18:24) Хочу использовать hardware генератор, т.к. нужно считать CRC app-table из бутлодера. Тогда лучше использовать подсчёт CRC через команду NVM-контроллера Flash range CRC - оно само подсчитает.
  8. Спящий режим.

    Цитата(Jenya7 @ Dec 4 2014, 18:02) У меня прерывания от LETIMER. По вашему коду этого не скажешь. Цитата(Jenya7 @ Dec 4 2014, 18:02) Да но в ЕМ2 низкочастотный кварц работает а у меня LETIMER подключен к внешнему часовому кварцу. А в EM0/EM1 прерывания от LETIMER-а происходят? Они вообще разрешены?
  9. Спящий режим.

    Цитата(Jenya7 @ Dec 4 2014, 10:54) Если я в конце вхожу в спящий режим то программа перестает правильно работать хотя прерывания от таймера должны выводить из спящего режима. Смотря какого таймера. LETIMER используете или RTC? Другие вывести не смогут. Цитата(Jenya7 @ Dec 4 2014, 16:14) ничего такого в тех документации не написано. Как же не написано? При входе в EM2 выключается кварц (если был включен). На выходе МК работает от внутреннего RC.
  10. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 4 2014, 16:53) Полином везде один и тот же. Возможно они инициализируют crc перед началом подсчёта нулями, а вы единицами. Или наоборот. Попробуйте посчитать CRC по функции из сообщения 6. Код    uint8_t Test10[10]={1,2,3,4,5,6,7,8,9,10};     volatile uint32_t soft_crc[2];     soft_crc[0]=Crc32Soft(Test, sizeof(Test), 0xFFFFFFFFUL);     soft_crc[1]=Crc32Soft(Test, sizeof(Test), 0);
  11. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 4 2014, 15:32) Мда, печально. Расскажите подробнее, если не затруднит. Рассказывать-то и нечего: есть стандартная функция расчёта CRC Код/*   Name  : CRC-32   Poly  : 0x04C11DB7    x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11                        + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1   Init  : 0xFFFFFFFF   Revert: true   XorOut: 0xFFFFFFFF   Check : 0xCBF43926 ("123456789")   MaxLen: 268 435 455 байт (2 147 483 647 бит) - обнаружение    одинарных, двойных, пакетных и всех нечетных ошибок */ uint_least32_t Crc32Soft(uint8_t *buf, size_t len, uint32_t init_value) {     uint_least32_t crc_table[256];     uint_least32_t crc; int i, j;     for (i = 0; i < 256; i++)     {         crc = i;         for (j = 0; j < 8; j++)             crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1;         crc_table[i] = crc;     };     crc = init_value;     while (len--)         crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8);     return crc ^ 0xFFFFFFFFUL; } Результат CRC32 который выдаёт модуль xmega не совпадает с ним для CRC32. Цитата(ffs2001 @ Dec 4 2014, 15:32) это единственная ошибка в драйвере? Я драйвер подробно не рассматривал, смотрел пример который шёл вместе со AtmelStudio. И в примере результат неправильный получается. Цитата(ffs2001 @ Dec 4 2014, 15:32) драйвере? Да в общем-то тут и драйвер-то не нужен - там весь модуль 3 регистра. Самому проще написать.
  12. xmega64a3u CRC-32

    Цитата(ffs2001 @ Dec 4 2014, 14:55) Да, в атмелевском драйвере это есть. Драйвер неправильный (или может его исправили?). Попробуйте такой код, он вроде работал: Кодuint32_t Crc32(uint8_t * data, uint16_t data_size, bool init_zero, uint32_t xor_value) {     CRC.CTRL=0         | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)         | 1<<CRC_CRC32_bp         | CRC_SOURCE_IO_gc     ;     CRC.CTRL=0         | CRC_RESET_NO_gc         | 1<<CRC_CRC32_bp         | CRC_SOURCE_IO_gc     ;     CRC.STATUS=1<<CRC_BUSY_bp;         uint8_t byte_counter=0;     for (uint8_t i=0; i<data_size; i++)         CRC.DATAIN=*data++;     uint32_t crc=*(volatile uint32_t *)&CRC.CHECKSUM0;     crc^=xor_value;     return crc; } typedef dma_channel<'0'> Dma0; uint32_t CrcDma(uint8_t * data, bool init_zeros, uint16_t length) {     CRC.CTRL=0         | init_zeros ? CRC_RESET_RESET1_gc : CRC_RESET_RESET0_gc         | 1<<CRC_CRC32_bp         | CRC_SOURCE_DMAC0_gc     ;     CRC.CTRL=0         | CRC_RESET_NO_gc         | 1<<CRC_CRC32_bp         | CRC_SOURCE_DMAC0_gc     ;     Dma0::ResetChannel();     Dma0::SetSrcAddress((uint16_t)data);     Dma0::SetDestAddress((uint16_t)data);     Dma0::SetAddressControl(DMA_CH_SRCRELOAD_NONE_gc, DMA_CH_SRCDIR_INC_gc, DMA_CH_DESTRELOAD_NONE_gc, DMA_CH_DESTDIR_INC_gc);     Dma0::SetTransferSize(length);     Dma0::SetTriggerSource(DMA_CH_TRIGSRC_OFF_gc);     Dma0::StartRamToRamTransfer(DMA_CH_BURSTLEN_8BYTE_gc);     while (Dma0::TransferComplete()==false);     uint32_t crc = *(uint32_t *)&CRC.CHECKSUM0;     return crc; } В драйвере не было вроде такой строки (функция Crc32): КодCRC.STATUS=1<<CRC_BUSY_bp; С ДМА как ни странно работало без проблем.
  13. STM32 flash

    Цитата(Haamu @ Jun 20 2014, 15:17) Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. Кодuint32_t* pLockBlock = (uint8_t)0x1FFF7A00; *pLockBlock = 0; Что-то странно вы пишите - запись 0 по адресу 0. Может так: Кодuint32_t* pLockBlock = (uint32_t *)0x1FFF7A00; *pLockBlock = 0; Цитата(Haamu @ Jun 20 2014, 15:17) После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы). Кодuint32_t* pData = (uint32_t)0x1FFF7800; *pData = 0xAA55AA55; Кодuint32_t* pData = (uint32_t *)0x1FFF7800; *pData = 0xAA55AA55;
  14. Цитата(A. Fig Lee @ May 21 2014, 19:39) Ну.. Если так программировать.. Программирование должно быть детерминистик как возможно. Согласен - не дело это. Хотя и каких-то нежелательных эффектов тоже сразу не видно. Хотя наверное можно придумать. Цитата(A. Fig Lee @ May 21 2014, 19:39) В общем, с ресетом больше граблей, дольше и выгоды не вижу. Проще прыгнуть сразу, без всяких вероятностей Согласен, так и лучше и проще.
  15. Цитата(A. Fig Lee @ May 21 2014, 18:53) Это не стартап, это ресет хэндлер. Ну так стартап состоит из двух частей - таблицы векторов и Reset_Handler-а. Таблица у каждого МК своя и её менять не надо. Цитата(A. Fig Lee @ May 21 2014, 18:53) В любом случае, как обслуживать ситуацию, когда в данной ячейке при холодном старте флаг случайно совпал с тем, который выставляется для прыгания в главную программу? Маловероятно... Цитата(A. Fig Lee @ May 21 2014, 18:53) Может еще один флаг добавим? Может, CRC считать начнем? К тому же CRC прошивки посчитать всё равно желательно, а то вдруг там пусто.