Jump to content

    

Артём__

Свой
  • Content Count

    2119
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Артём__

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

Контакты

  • Сайт
    Array
  • ICQ
    Array

Recent Profile Visitors

4284 profile views
  1. xmega64a3u CRC-32

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

    Может быть, скобки никогда не помешают. Но как же тогда результат получается правильным (пробовал на IAR и GCC)?
  3. xmega64a3u CRC-32

    Так и есть - они эквивалентны.
  4. xmega64a3u CRC-32

    Код такой же как у меня за исключением того что в 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

    Проверил на xmega256A3U - hard, soft и dma дают одинаковый результат. На двух? Тенденция , однако...Выложите проект, а вдруг и правда в 64х ошибка.
  6. xmega64a3u CRC-32

    То он выдаёт. Ну да,случайность... У меня при входных данных из комментария к функции результат получался всеми тремя способами одинаковый - 0xCBF43926. Случайно... Проверял в симуляторе - плату лень искать. На PC не проверял - не нашёл реализацию. Описан он в мануале как-то криво. Но работает. У меня проверялось в atxmega256A3U Вот проект для GCC: crc32_02.rar
  7. xmega64a3u CRC-32

    Тогда лучше использовать подсчёт CRC через команду NVM-контроллера Flash range CRC - оно само подсчитает.
  8. По вашему коду этого не скажешь. А в EM0/EM1 прерывания от LETIMER-а происходят? Они вообще разрешены?
  9. Смотря какого таймера. LETIMER используете или RTC? Другие вывести не смогут. Как же не написано? При входе в EM2 выключается кварц (если был включен). На выходе МК работает от внутреннего RC.
  10. xmega64a3u CRC-32

    Возможно они инициализируют 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

    Рассказывать-то и нечего: есть стандартная функция расчёта 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. Я драйвер подробно не рассматривал, смотрел пример который шёл вместе со AtmelStudio. И в примере результат неправильный получается. Да в общем-то тут и драйвер-то не нужен - там весь модуль 3 регистра. Самому проще написать.
  12. xmega64a3u CRC-32

    Драйвер неправильный (или может его исправили?). Попробуйте такой код, он вроде работал: 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

    Что-то странно вы пишите - запись 0 по адресу 0. Может так: uint32_t* pLockBlock = (uint32_t *)0x1FFF7A00; *pLockBlock = 0; uint32_t* pData = (uint32_t *)0x1FFF7800; *pData = 0xAA55AA55;
  14. Согласен - не дело это. Хотя и каких-то нежелательных эффектов тоже сразу не видно. Хотя наверное можно придумать. Согласен, так и лучше и проще.
  15. Ну так стартап состоит из двух частей - таблицы векторов и Reset_Handler-а. Таблица у каждого МК своя и её менять не надо. Маловероятно... К тому же CRC прошивки посчитать всё равно желательно, а то вдруг там пусто.