crc.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /******************************* (C) LiteMesh **********************************
  2. * @module crc
  3. * @file crc.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief crc
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 kim First release.
  10. *******************************************************************************
  11. */
  12. #include "stm32f4xx.h"
  13. #include "crc.h"
  14. #include "common_config.h"
  15. #include <stddef.h>
  16. #include <stdint.h>
  17. /**
  18. * @brief
  19. * @retval
  20. */
  21. void CRC_Init(void)
  22. {
  23. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  24. CRC->CR |= CRC_CR_RESET;
  25. }
  26. /**
  27. * @brief
  28. * @retval
  29. */
  30. void CRC_DeInit(void)
  31. {
  32. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, DISABLE);
  33. }
  34. /**
  35. * @brief Читаем crc из последних 4х байт записанной прошивки
  36. * @retval
  37. */
  38. uint32_t CRC_Read(void) {
  39. uint32_t* ptr = (uint32_t*)USER_FLASH_CRC_ADDRESS;
  40. return *ptr;
  41. }
  42. /**
  43. * @brief Считаем crc для записанной прошивки
  44. * @retval
  45. */
  46. uint32_t CRC_Calculate(void (* periodic_handler)(uint8_t)) {
  47. uint32_t res;
  48. static uint32_t last_progress = 0;
  49. /* Reset CRC */
  50. CRC->CR = ((uint8_t)0x01);
  51. for (uint32_t* ptr = (uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS; ptr != (uint32_t*)USER_FLASH_CRC_ADDRESS; ptr++) {
  52. CRC->DR = *ptr; // добавляем всю прошивку в CRC
  53. if (periodic_handler != NULL) {
  54. uint32_t progress = ((uint32_t)ptr - USER_FLASH_FIRST_PAGE_ADDRESS) * 100 /
  55. (USER_FLASH_CRC_ADDRESS - USER_FLASH_FIRST_PAGE_ADDRESS);
  56. if (progress > last_progress) {
  57. last_progress = progress;
  58. periodic_handler(progress);
  59. }
  60. }
  61. }
  62. res = CRC->DR;
  63. return res;
  64. }
  65. /******************************* (C) SWITRON *********************************/