/**
|
******************************************************************************
|
* @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); /*!<CRCУÑé¶àÏîʽλ¿íÑ¡Ôñ*/
|
CRC_CR_OPWD_Set(para->OPWD); /*!<WORD²Ù×÷ʹÄÜ*/
|
CRC_CR_PARA_Set(para->PARA); /*!<CRC¿ìËÙ¼ÆËãʹÄÜ*/
|
CRC_CR_RFLTIN_Set(para->RFLTIN); /*!<CRCÊäÈ뷴ת¿ØÖÆ*/
|
CRC_CR_RFLTO_Set(para->RFLTO); /*!<CRCÊä³ö·´×ª¿ØÖÆ*/
|
CRC_CR_XOR_Setable(para->XOR); /*!<Êä³öÒì»òʹÄÜ*/
|
CRC_XOR_Write(para->CRC_XOR); /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/
|
CRC_POLY_Write(para->CRCPOLY); /*!<CRC¶àÏîʽ¼Ä´æÆ÷*/
|
}
|
|
/******END OF FILE****/
|