MM32SPIN2x 늙C����MCU������ɫ����CRCӋ���Ԫ
��һ�¹�(ji��)���ѽ�(j��ng)�̴�����ʹ��MM32SPIN2x��UARTBit9ģʽ�����¹�(ji��)���c���һ��ʹ��CRCģ�K�M�Д�(sh��)��(j��)У����ڔ�(sh��)��(j��)��ݔ�^�������oՓ��ݔϵ�y(t��ng)���O(sh��)Ӌ����ô���������e�����������@�N���e���ܕ���(d��o)�����·�ς�ݔ?sh��)�һ�����߶��������Ɖ�(���F(xi��n)���ز��e��0׃?y��u)?������1׃?y��u)?)���Ķ����ܷ����յ��e�`�Ĕ�(sh��)��(j��)����M����߽��ܷ��յ���(sh��)��(j��)�����_�ʣ��ڽ��ܷ����Ք�(sh��)��(j��)֮ǰ��Ҫ����(sh��)��(j��)�M�в��e�z�y�����҃H���z�y�ĽY(ji��)�������_�r���շ�����������(sh��)��(j��)���z�y�ķ�ʽ�ж�N����Ҋ������żУ������ؾW(w��ng)У��ѭ�h(hu��n)����У�ȡ�
����ѭ�h(hu��n)����УCRC��ԭ�팍�H�Ͼ�����һ��pλ���M�Ɣ�(sh��)��(j��)����֮��һ��rλ���M�ƙz�a(����)���Ķ���(g��u)��һ�����L��n��p��rλ�Ķ��M�������������ڔ�(sh��)��(j��)����֮����@���z�a�c��(sh��)��(j��)���еă�(n��i)��֮�g������ij�N�ض����P(gu��n)ϵ�������ɔ_��ԭ��ʹ��(sh��)��(j��)�����е�ijһλ��ijЩλ�l(f��)���e�`���@�N�ض��P(gu��n)ϵ�͕����Ɖ�����ˣ�ͨ�^�z���@һ�P(gu��n)ϵ���Ϳ��Ԍ��F(xi��n)����(sh��)��(j��)���_�Եęz���ֻҪ��(j��ng)�^��������x����ʹ��λ��(sh��)����ij���(sh��) P����ô���F(xi��n)�z�y�����IJ��e�ĸ��ʾͺ�С��С��CRC��һ�N���õęz�e�a���o���z�y���e�`����������˲����������ԄӼm�e��һ��������ǁG�����յĔ�(sh��)��(j��)��
������ij����D���҂����l(f��)�F(xi��n)�����ʽ�ă��Խ�ߣ�У�Ч��Խ�����������M�ĕr�gҲԽ�L����˳��ò������?q��)��õ�Ӳ��CRCģ�K�����Ч����
���в�����������ȸ���(j��)�ض���У���ʽ�����1�ֹ�(ji��)��(sh��)��(j��)����������(y��ng)��256������(sh��)������������������̌�������惦���в�ԃ�������ھ��\�������Ƿdz�ͨ�õ��������������CRC16У����惦����Ҫռ512�ֹ�(ji��)��CRC32�t��Ҫ1 KB�����������Ć�Ƭ�CROM�YԴ���f��ռ������С������ֻ�����b�˴˱����Ͳ��ò�������Ƭ�C����̖��
��SPIN2xϵ��MCU����������һ��CRCӋ���Ԫ��ʹ��1��32λ��(sh��)��(j��)�Ĵ�������ݔ���ݔ�����ڈ�(zh��)�Ќ������rݔ��CRCӋ�����(sh��)��(j��)���ڈ�(zh��)���x�����r������һ��CRCӋ��ĽY(ji��)����ÿһ�Ό��딵(sh��)��(j��)�Ĵ���������������32λ���M��CRCӋ�������������ֹ�(ji��)��Ӌ�����Ķ���(ji��)ʡ�����ĕr�g��
• ʹ��CRC-32(��̫�W(w��ng))���ʽ�� 0x4C11DB7
• ÿ��CRCӋ����Ҫ4��AHB�r�����
• �� CRC Ӌ�����g����ͣ����������˿��Ԍ��Ĵ��� CRC_DR �M�б�������������B�m(x��)�،�-�x������
• ����ͨ�^�O(sh��)�üĴ���CRC_CTRL��RESETλ�����üĴ��� CRC_DR �� 0xFFFFFFFF��ԓ������Ӱ�8λ������(sh��)��(j��)�Ĵ���CRC_IDR��(n��i)�Ĕ�(sh��)��(j��)��
�D2 CRCӋ���Ԫ��D
�����҂�����һ���ڳ�����ܛ��CRC�cӲ��CRC��������
CRCģ�K�����ò��E���£�
CRCģ�K�r�ʹ��
CRC_CR�ĵ�һλRESETλ��(f��)λ�����x��
����(sh��)��(j��)����CRC_DR�Ĵ���
��CRC_DR�Ĵ������x��Ӌ��Y(ji��)��
�������������£�
uint32_t Hardware_CRC(u32*addr, int num)
{
CRC->CR|=1; //��(f��)λ
for (; num > 0; num--)
CRC->DR = (*addr++);
return CRC->DR;
}
�҂�����ʹ��ܛ���㷨��z�Ӌ��Y(ji��)�������ȃɷN��ʽ���M�ĕr�g��
ܛ���㷨���£�
u32 Software_CRC (u32 *ptr,u32 len)
{
u32 xbit;
u32 data;
u32 CRC32 = 0xFFFFFFFF;
u32 bits;
const u32 dwPolynomial =0x04C11DB7 ;
u32 i;
for(i = 0;i < len;i++)
{
xbit = (unsigned)1 <<31;
data = ptr[i];
for (bits = 0; bits < 32;bits++)
{
if (CRC32 & 0x80000000)
{
CRC32 <<= 1;
CRC32 ^= dwPolynomial;
}
else
CRC32 <<= 1;
if (data & xbit)
CRC32 ^= dwPolynomial;
xbit >>= 1;
}
}
return CRC32;
}
�����҂��Ãɂ����εĔ�(sh��)�M��һ����(sh��)�M��0x00�f����0x7F����һ����(sh��)�M��0x7F�f�p��0x00���քeʹ��Ӳ��CRC��ܛ��CRCӋ����ͬ�rʹ��TIM1�M��Ӌ�r�����ͨ�^UARTݔ���õ���У�a�ͻ��M�ĕr�g��
Ӌ���ݔ������
void CRCTest()
{
unsigned int i;
u32 CRCtime,CRCresault;
u32 crc1[128];
for(i=0;i<128;i++)
crc1[i] = i;
printf("CRC_test\r\n");
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);//ʹ��CRC�r�
CRC->CR|=1; //��(f��)λ
printf("\r\nCRC_DR=%x\t\r\n",CRC->DR);//ݔ����(f��)λֵ
TIM1->CNT &= 0;
CRCresault=Hardware_CRC(crc1,128);
CRCtime =TIM1->CNT;
printf("Hardware_CRC1:resault=%08x\ttime=%d\r\n",CRCresault,CRCtime);
TIM1->CNT &= 0;
CRCresault=Software_CRC(crc1,128);
CRCtime =TIM1->CNT;
printf("Software_CRC1:resault=%08x\ttime=%d\r\n",CRCresault,CRCtime);
for(i=0;i<256;i++)
crc1[i] = 0xFF-i;
TIM1->CNT &= 0;
CRCresault=Hardware_CRC(crc1,128);
CRCtime =TIM1->CNT;
printf("Hardware_CRC2:resault=%08x\ttime=%d\r\n",CRCresault,CRCtime);
TIM1->CNT &= 0;
CRCresault=Software_CRC(crc1,128);
CRCtime =TIM1->CNT;
printf("Software_CRC2:resault=%08x\ttime=%d\r\n",CRCresault,CRCtime);
}
���r������
void Tim1_UPCount_test(u16Prescaler,u16 Period)
{
TIM_TimeBaseInitTypeDefTIM_StructInit;
/*ʹ��TIM1�r�,Ĭ�J�r�Դ��PCLK2(PCLK2δ���l�r�����l,��t��PCLK2���lݔ��),���x�����r�Դ*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_StructInit.TIM_Period=Period; //ARR�Ĵ���ֵ
TIM_StructInit.TIM_Prescaler=Prescaler; //�A(y��)���lֵ
/*��(sh��)�֞V�����ɘ��l��,��Ӱ푶��r���r�*/
TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1; //�ɘӷ��lֵ
TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up; //Ӌ��(sh��)ģʽ
TIM_StructInit.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_StructInit);
TIM_Cmd(TIM1, ENABLE);
/*���¶��r���r���a(ch��n)�����r�g,�����־λ*/
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
}
Main����(sh��)��
int main(void)
{
Tim1_UPCount_test(48-1,0xffff); //APB2�r犞�48M��48���l��TIM1�r犞�1MHz
delay_init();
uart_initwBaudRate(9600); //��ʼ��UART
CRCTest();
while(1) { }
}
�D3 ܛ��CRC�cӲ��CRCӋ��Y(ji��)��
�ĽY(ji��)�������҂����Կ����������@�ɂ���(sh��)�M��Ӳ��CRC�cܛ��CRC���õ��ĽY(ji��)��һ��������Ӳ��CRCÿ����(sh��)�Mֻ���M��52us���hС��ܛ��CRC��2.5ms���ɴ˿�Ҋ�����M�д�����(sh��)��(j��)̎���ĕr����ʹ��Ӳ��CRCģ�K���Թ�(ji��)ʡ�����ĕr�g��ͬ�r���C��Ӌ��Y(ji��)�������_��

����admin ����ĕr�g��2019-06-15