Jump to content

    

Артём__

Свой
  • Content Count

    2119
  • Joined

  • Last visited

Everything posted by Артём__


  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 прошивки посчитать всё равно желательно, а то вдруг там пусто.
  16. Можно отредактировать startup, который есть: всего-то несколько строк добавить. if ((FlashCrcOk()) && (StartType==START_APPLICATION)) { __disable_irq(); __set_MSP(*(uint32_t *)0x1008); ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x100C); goto *application_reset_handler; }
  17. В каком пункте мануала про HARDFAULTMASK написано? Получается достаточно - кроме NMI и Reset.
  18. Почему? __disable_irq() это : CPSID i ; Disable interrupts and configurable fault handlers (set PRIMASK) HardFault не запрещается после __disable_irq. HardFault запретится после CPSID f. Вроде так выходит... Обнуляется программой...Можно зарезервировать ячейку в ОЗУ и проверять её на старте и в зависимости от её значения решать что делать дальше - запускать программу, запускать бут или ещё что-то.
  19. Не там смотрите: нужно в описании Cortex-M3 или M4 смотреть.
  20. Почему чушь? Код вполне имеет смысл: __attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) { __ASM volatile ("cpsie f"); } /** \brief Disable FIQ This function disables FIQ interrupts by setting the F-bit in the CPSR. Can only be executed in Privileged modes. */ __attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) { __ASM volatile ("cpsid f"); }
  21. Как же нет? А это что: /** \brief Disable FIQ This function disables FIQ interrupts by setting the F-bit in the CPSR. Can only be executed in Privileged modes. */ #define __disable_fault_irq __disable_fiq ?
  22. Его и не надо под IAR запускать - для отладки лучше AVRStudio использовать, или AtmelStudio. Там ICE работает надёжно.
  23. Нет. Не должен таймер, но может. Задача может сама впасть в ожидание и переключить поток исполнения. Хотелось бы, но чему равно это время - вопрос. От схемы зависит и т.д. И прерывания могут длится не известно сколько... Если надо, то ставит, если не надо, то не ставит. PendSV переключает, если вызовут...
  24. Понятие из другой оперы вроде... Почему только 8? Периферийные прерывания тоже могут перекрыть SysTick_Handler.