/** ****************************************************************************** * @file fm33a0xxev_crc.c * @author FM33A0XXEV Application Team * @version V1.0.0 * @date 16-April-2020 * @brief This file provides firmware functions to manage the following * functionalities of....: * */ /* Includes ------------------------------------------------------------------*/ #include "fm33a0xxev_crc.h" /** @addtogroup fm33a0xxev_StdPeriph_Driver * @{ */ /** @defgroup CRC * @brief CRC driver modules * @{ */ /* CRCDRÓÃÓÚ×÷ΪÊý¾ÝÊäÈë¼Ä´æÆ÷£¬²¢ÇÒÔÚÔËËã½áÊøºó±£´æCRC¼ÆËã½á¹û¡£(CRC Data Register) ×÷ΪÊäÈëʱ£ºÈôword²Ù×÷ʹÄÜ£¬Ôò¶ÔCRCDR[31:0]½øÐмÆË㣬¹²4´ÎbyteÔËË㣨Óɵ͵½¸ß£©£»·ñÔò¶ÔCRCDR[7:0]½øÐмÆË㣬¹²1´ÎbyteÔËËã¡£ ±£´æ½á¹ûʱ£ºÈôΪ7λ¶àÏîʽ½á¹û±£´æÔÚCRCDR[6:0]£¬ÈôΪ8λ¶àÏîʽ½á¹û±£´æÔÚCRCDR[7:0]£¬ÈôΪ16λ¶àÏîʽ½á¹û±£´æÔÚCRCDR[15:0]£¬ÈôΪ32λ¶àÏîʽ½á¹û±£´æÔÚCRCDR[31:0]¡£ Ïà¹Øº¯Êý */ void CRC_DR_Write(uint32_t SetValue) { CRC->DR = (SetValue); } uint32_t CRC_DR_Read(void) { return (CRC->DR); } /* WORD²Ù×÷ʹÄÜ (Operation by Word) 0£º×Ö½Ú²Ù×÷£¬CRC¼ÆËã½öÕë¶ÔCRCDR×îµÍ×Ö½Ú½øÐÐ 1£º×Ö²Ù×÷£¬CRC¼ÆËãÕë¶ÔCRCDRÈ«²¿4×Ö½Ú½øÐÐ Ïà¹Øº¯Êý */ void CRC_CR_OPWD_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = CRC->CR; tmpreg &= ~(CRC_CR_OPWD_Msk); tmpreg |= (SetValue & CRC_CR_OPWD_Msk); CRC->CR = tmpreg; } uint32_t CRC_CR_OPWD_Get(void) { return (CRC->CR & CRC_CR_OPWD_Msk); } /* CRC¿ìËÙ¼ÆËãʹÄÜ (Parallel Calculation) 0£º´®ÐÐÔËË㣬¼ÆËã1¸ö×Ö½ÚÐèÒª8¸öʱÖÓÖÜÆÚ 1£º²¢ÐмÆË㣬¼ÆËã1¸ö×Ö½ÚÐèÒª1¸öʱÖÓÖÜÆÚ Ïà¹Øº¯Êý */ void CRC_CR_PARA_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = CRC->CR; tmpreg &= ~(CRC_CR_PARA_Msk); tmpreg |= (SetValue & CRC_CR_PARA_Msk); CRC->CR = tmpreg; } uint32_t CRC_CR_PARA_Get(void) { return (CRC->CR & CRC_CR_PARA_Msk); } /* CRCÊäÈ뷴ת¿ØÖÆ (Reflected Input) 00£ºÊäÈë²»·´×ª 01£ºÊäÈë°´×Ö½Ú·´×ª 10£ºÊäÈë°´°ë×Ö·´×ª 11£ºÊäÈë°´×Ö·´×ª ÀýÈ磺¼ÆËãÊý¾ÝΪ0x11223344£¬ Èç¹ûRFLTIN==01£¬Ôò½«Êý¾Ý±äΪ0x8844CC22£¬ÔÙ½øÐмÆËã Èç¹ûRFLTIN==10£¬Ôò½«Êý¾Ý±äΪ0x448822CC£¬ÔÙ½øÐмÆËã Èç¹ûRFLTIN==11£¬Ôò½«Êý¾Ý±äΪ0x22CC4488£¬ÔÙ½øÐмÆËã Ïà¹Øº¯Êý */ void CRC_CR_RFLTIN_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = CRC->CR; tmpreg &= ~(CRC_CR_RFLTIN_Msk); tmpreg |= (SetValue & CRC_CR_RFLTIN_Msk); CRC->CR = tmpreg; } uint32_t CRC_CR_RFLTIN_Get(void) { return (CRC->CR & CRC_CR_RFLTIN_Msk); } /* CRCÊä³ö·´×ª¿ØÖÆ (Reflected Output) 0£ºÊäÈë²»·´×ª 1£ºÊäÈë°´×Ö½Ú·´×ª ÀýÈ磺 Èç¹ûRFLTO==1£¬Èôµ±Ç°¼ÆËãµÄCRC½á¹ûΪ0x1234£¬ÔòÊä³öµÄ½á¹ûΪ0x2C48 Èç¹û RFLTO==0£¬ÔòÖ±½ÓÊä³ö0x1234 ×¢Ò⣺´Ë½á¹û²»Ò»¶¨Îª×îÖÕÊä³ö½á¹û£¬»¹ÐèÒª¿´XORÊÇ·ñΪ1£¬Ïê¼û±¾¼Ä´æÆ÷bit2˵Ã÷ Ïà¹Øº¯Êý */ void CRC_CR_RFLTO_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = CRC->CR; tmpreg &= ~(CRC_CR_RFLTO_Msk); tmpreg |= (SetValue & CRC_CR_RFLTO_Msk); CRC->CR = tmpreg; } uint32_t CRC_CR_RFLTO_Get(void) { return (CRC->CR & CRC_CR_RFLTO_Msk); } /* CRC½á¹û±ê־λ£¬Ö»¶Á (Result Flag) 0£ºCRC½á¹ûΪ0 1£ºCRC½á¹û·ÇÈ«0 Ïà¹Øº¯Êý */ FlagStatus CRC_CR_RES_Chk(void) { if (CRC->CR & CRC_CR_RES_Msk) { return SET; } else { return RESET; } } /* CRCÔËËã±ê־λ£¬Ö»¶Á (Busy) 0£ºCRCÔËËã½áÊø 1£ºCRCÔËËã½øÐÐÖÐ Ïà¹Øº¯Êý */ FlagStatus CRC_CR_BUSY_Chk(void) { if (CRC->CR & CRC_CR_BUSY_Msk) { return SET; } else { return RESET; } } /* Êä³öÒì»òʹÄÜ (Output XORed with CRC_XOR register enable) 0£ºÊä³ö²»Òì»òCRC_XOR¼Ä´æÆ÷ 1£ºÊä³öÒì»òCRC_XOR¼Ä´æÆ÷ Ïà¹Øº¯Êý */ void CRC_CR_XOR_Setable(FunState NewState) { if (NewState == ENABLE) { CRC->CR |= (CRC_CR_XOR_Msk); } else { CRC->CR &= ~(CRC_CR_XOR_Msk); } } FunState CRC_CR_XOR_Getable(void) { if (CRC->CR & (CRC_CR_XOR_Msk)) { return ENABLE; } else { return DISABLE; } } /* CRC¶àÏîʽλ¿íÑ¡Ôñ (Polynomial width Selection) 00£º32λ 01£º16λ 10£º8λ 11£º7λ Ïà¹Øº¯Êý */ void CRC_CR_SEL_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = CRC->CR; tmpreg &= ~(CRC_CR_SEL_Msk); tmpreg |= (SetValue & CRC_CR_SEL_Msk); CRC->CR = tmpreg; } uint32_t CRC_CR_SEL_Get(void) { return (CRC->CR & CRC_CR_SEL_Msk); } /* CRCÏßÐÔ·´À¡ÒÆÎ»¼Ä´æÆ÷ (Linear Feedback Shift Register) ÔËË㿪ʼǰ¿ÉÒÔÓÉÈí¼þдÈëCRC³õʼֵ Ïà¹Øº¯Êý */ void CRC_LFSR_Write(uint32_t SetValue) { CRC->LFSR = (SetValue); } uint32_t CRC_LFSR_Read(void) { return (CRC->LFSR); } /* CRCÔËËã½á¹ûÒì»ò¼Ä´æÆ÷ (eXclusive OR) µ±CRC_CR.XORΪ1ʱ£¬CRC½á¹ûÊä³öǰ½«Òì»ò´Ë¼Ä´æÆ÷µÄÊý¾Ý¡£ Ïà¹Øº¯Êý */ void CRC_XOR_Write(uint32_t SetValue) { CRC->XOR = (SetValue); } uint32_t CRC_XOR_Read(void) { return (CRC->XOR); } /* CRCÔËËã¶àÏîʽϵÊý (CRC Polynominals) Ïà¹Øº¯Êý */ void CRC_POLY_Write(uint32_t SetValue) { CRC->POLY = (SetValue); } uint32_t CRC_POLY_Read(void) { return (CRC->POLY); } void CRC_Deinit(void) { //CRC->DR = 0xFFFFFFFF; //CRC->CR = 0x00000002; //CRC->LFSR = 0xFFFFFFFF; //CRC->XOR = 0x00000000; //CRC->POLY = 0x00000000; } //Code_End /* CRC³õʼ»¯ÅäÖú¯Êý*/ void CRC_Init(CRC_InitTypeDef* para) { CRC_LFSR_Write(para->LFSR); /*!<³õÖµ¼Ä´æÆ÷*/ CRC_CR_SEL_Set(para->CRCSEL); /*!OPWD); /*!PARA); /*!RFLTIN); /*!RFLTO); /*!XOR); /*!<Êä³öÒì»òʹÄÜ*/ CRC_XOR_Write(para->CRC_XOR); /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/ CRC_POLY_Write(para->CRCPOLY); /*!