123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /******************************* (C) LiteMesh **********************************
- * @module crc
- * @file crc.c
- * @version 1.0.0
- * @date XX.XX.XXXX
- * $brief crc
- *******************************************************************************
- * @history Version Author Comment
- * XX.XX.XXXX 1.0.0 kim First release.
- *******************************************************************************
- */
-
- #include "stm32f4xx.h"
- #include "crc.h"
- #include "common_config.h"
- #include <stddef.h>
- #include <stdint.h>
- /**
- * @brief
- * @retval
- */
- void CRC_Init(void)
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
- CRC->CR |= CRC_CR_RESET;
- }
- /**
- * @brief
- * @retval
- */
- void CRC_DeInit(void)
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, DISABLE);
- }
- /**
- * @brief Читаем crc из последних 4х байт записанной прошивки
- * @retval
- */
- uint32_t CRC_Read(void) {
- uint32_t* ptr = (uint32_t*)USER_FLASH_CRC_ADDRESS;
- return *ptr;
- }
- /**
- * @brief Считаем crc для записанной прошивки
- * @retval
- */
- uint32_t CRC_Calculate(void (* periodic_handler)(uint8_t)) {
- uint32_t res;
- static uint32_t last_progress = 0;
- /* Reset CRC */
- CRC->CR = ((uint8_t)0x01);
- for (uint32_t* ptr = (uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS; ptr != (uint32_t*)USER_FLASH_CRC_ADDRESS; ptr++) {
- CRC->DR = *ptr; // добавляем всю прошивку в CRC
- if (periodic_handler != NULL) {
- uint32_t progress = ((uint32_t)ptr - USER_FLASH_FIRST_PAGE_ADDRESS) * 100 /
- (USER_FLASH_CRC_ADDRESS - USER_FLASH_FIRST_PAGE_ADDRESS);
- if (progress > last_progress) {
- last_progress = progress;
- periodic_handler(progress);
- }
- }
- }
- res = CRC->DR;
- return res;
- }
- /******************************* (C) SWITRON *********************************/
|