[技术贴] 【M0】 MG32F02A 学习笔记 21 CRC校验

[复制链接]
131|1
 楼主 | 2018-11-29 10:36 | 显示全部楼层 |阅读模式
     上回我们说到了MG32F02A的IIC从机的使用。帖子详情:http://bbs.21ic.com/icview-2590026-1-1.html

      这次来讲一下我们MG32F02A特别好用的东西:硬件CRC校验
      CRC校验大家都知道,在欧洲的电器中必须使用CRC校验,而CRC校验的运算量很大,需要比较多的时间,而我们硬件逻辑处理器就有处理的能力,并且带有DMA功能,那就好呀,拿来直接用。

以下是携带了DMA功能的CRC校验功能代码:


  1. #include "MG32x02z_DRV.H"
  2. #include <stdio.h>


  3. typedef uint8_t u8;
  4. typedef uint16_t u16;
  5. typedef uint32_t u32;
  6. typedef uint64_t u64;

  7. #define URTX URT0

  8. #define GPL_InputDataEndian_LITTLE      GPL_CR0_BEND_EN_disable_w
  9. #define GPL_InputDataEndian_BIG         GPL_CR0_BEND_EN_mask_w

  10. #define IS_GPL_InputDataEndian_MODE(MODE)     (((MODE) == GPL_InputDataEndian_LITTLE) || \
  11.                                                ((MODE) == GPL_InputDataEndian_BIG))



  12. #define GPL_InputDataInverse_DISABLE    GPL_CR0_IN_INV_disable_w

  13. #define GPL_InputDataInverse_ENABLE     GPL_CR0_IN_INV_mask_w

  14. #define IS_GPL_InputDataInverse_MODE(MODE)    (((MODE) == GPL_InputDataInverse_ENABLE) || \
  15.                                                ((MODE) == GPL_InputDataInverse_DISABLE))


  16. #define GPL_InputDataReverse_NONE       GPL_CR0_BREV_MDS_disable_w
  17. #define GPL_InputDataReverse_BYTE       GPL_CR0_BREV_MDS_8bit_w
  18. #define GPL_InputDataReverse_HALFWORD   GPL_CR0_BREV_MDS_16bit_w
  19. #define GPL_InputDataReverse_WORD       GPL_CR0_BREV_MDS_32bit_w

  20. #define IS_GPL_InputDataReverse_MODE(MODE)    (((MODE) == GPL_InputDataReverse_NONE) || \
  21.                                                ((MODE) == GPL_InputDataReverse_BYTE) || \
  22.                                                ((MODE) == GPL_InputDataReverse_HALFWORD) || \
  23.                                                ((MODE) == GPL_InputDataReverse_WORD))



  24. #define GPL_OutputDataReverse_NONE      GPL_CR1_CRC_BREV_disable_w
  25. #define GPL_OutputDataReverse_BYTE      GPL_CR1_CRC_BREV_8bit_w
  26. #define GPL_OutputDataReverse_HALFWORD  GPL_CR1_CRC_BREV_16bit_w
  27. #define GPL_OutputDataReverse_WORD      GPL_CR1_CRC_BREV_32bit_w

  28. #define IS_GPL_OutputDataReverse_MODE(MODE)    (((MODE) == GPL_OutputDataReverse_NONE) || \
  29.                                                 ((MODE) == GPL_OutputDataReverse_BYTE) || \
  30.                                                 ((MODE) == GPL_OutputDataReverse_HALFWORD) || \
  31.                                                 ((MODE) == GPL_OutputDataReverse_WORD))



  32. #define GPL_CRC_Polynomial_0x1021       GPL_CR1_CRC_MDS_ccitt16_w
  33. #define GPL_CRC_Polynomial_0x07         GPL_CR1_CRC_MDS_crc8_w
  34. #define GPL_CRC_Polynomial_0x8005       GPL_CR1_CRC_MDS_crc16_w
  35. #define GPL_CRC_Polynomial_0x4C11DB7    GPL_CR1_CRC_MDS_crc32_w

  36. #define IS_GPL_CRC_Polynomial_MODE(MODE)    (((MODE) == GPL_CRC_Polynomial_0x1021) || \
  37.                                              ((MODE) == GPL_CRC_Polynomial_0x07) || \
  38.                                              ((MODE) == GPL_CRC_Polynomial_0x8005) || \
  39.                                              ((MODE) == GPL_CRC_Polynomial_0x4C11DB7))



  40. #define GPL_CRC_InputDataWidth_8bit     GPL_CR1_CRC_DSIZE_8bit_w
  41. #define GPL_CRC_InputDataWidth_16bi     GPL_CR1_CRC_DSIZE_16bit_w
  42. #define GPL_CRC_InputDataWidth_32bit    GPL_CR1_CRC_DSIZE_32bit_w

  43. #define IS_GPL_CRC_InputDataWidth_MODE(MODE)    (((MODE) == GPL_CRC_InputDataWidth_8bit) || \
  44.                                                  ((MODE) == GPL_CRC_InputDataWidth_16bi) || \
  45.                                                  ((MODE) == GPL_CRC_InputDataWidth_32bit))

  46. #define CRC_8                                                                                                         0
  47. #define CRC_8_ITU                                                                                         1
  48. #define CRC_8_ROHC                                                                                        2
  49. #define CRC16_BUYPASS                                                                         3
  50. #define CRC16_ARC                                                                                         4
  51. #define CRC16_MAXIM                                                                                 5
  52. #define CRC16_DDS110                                                                                 6
  53. #define CRC16_CMS                                                                                         7
  54. #define CRC16_USB                                                                                         8
  55. #define CRC16_MODBUS                                                                                 9
  56. #define CRC16_XMODEM                                                                                 10
  57. #define CRC16_GSM                                                                                         11
  58. #define CRC16_KERMIT                                                                                 12
  59. #define CRC16_AUG_CCITT                                                                 13
  60. #define CRC16_TMS37157                                                                         14
  61. #define CRC16_RIELLO                                                                                 15
  62. #define CRC16_A                                                                                                 16
  63. #define CRC16_CCITT_FALSE                                                         17
  64. #define CRC16_GENIBUS                                                                         18
  65. #define CRC16_MCRF4XX                                                                         19
  66. #define CRC16_X25                                                                                         20
  67. #define CRC32_POSIX                                                                                 21
  68. #define CRC32_MPEG2                                                                                 22
  69. #define CRC32                                                                                                         23
  70. #define CRC32_BZIP2                                                                                 24
  71. #define CRC32_JAMCRC                                                                                 25

  72. typedef struct{
  73.     uint32_t InputDataInverse;
  74.     uint32_t InputDataEndian;
  75.     uint32_t InputDataReverse;
  76.     uint32_t CRC_Polynomial;
  77.     uint32_t CRC_InputDataWidth;
  78.     uint32_t OutputDataReverse;
  79.     uint32_t CRC_InitialValue;
  80.                 uint32_t CRC_Type;
  81. }GPL_CRC_InitTypedef;



  82. void GPL_CRC_Config(GPL_CRC_InitTypedef * GPL_CRC)
  83. {
  84.     GPL->CR1.W = 0;
  85.     GPL->CR0.W = 0;
  86.     GPL->DIN.W = 0;
  87.     GPL->CR0.W = GPL_CRC->InputDataInverse |
  88.                  GPL_CRC->InputDataEndian |
  89.                  GPL_CRC->InputDataReverse;

  90.     GPL->CRCINIT.W = GPL_CRC->CRC_InitialValue;

  91.     GPL->CR1.W = GPL_CRC->CRC_Polynomial |
  92.                  GPL_CRC->CRC_InputDataWidth |
  93.                  GPL_CRC->OutputDataReverse;

  94.     GPL->CR1.B[0] |= GPL_CR1_CRC_EN_mask_b0;   
  95. }


  96. uint8_t DataPattern[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};//


  97. void CSC_Init (void)
  98. {
  99.         CSC_PLL_TyprDef CSC_PLL_CFG;
  100.    
  101.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  102.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  103.   ProtectModuleReg(MEMprotect);

  104.   UnProtectModuleReg(CSCprotect);
  105.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  106.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  107.        
  108.         /* CK_HS selection */
  109.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  110.         CSC_IHRCO_Cmd(ENABLE);
  111.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  112.         CSC_ClearFlag(CSC_IHRCOF);
  113.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  114.         /* PLL */
  115.         /**********************************************************/
  116.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  117.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  118.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  119.         CSC_PLL_Config(&CSC_PLL_CFG);
  120.         CSC_PLL_Cmd(ENABLE);
  121.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  122.         CSC_ClearFlag(CSC_PLLF);
  123.         /**********************************************************/

  124.        
  125.         /* CK_MAIN */
  126.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  127.         /* Configure ICKO function */
  128.                
  129.         /* Configure peripheral clock */
  130.         CSC_PeriphProcessClockSource_Config(CSC_I2C0_CKS, CK_APB);
  131.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  132.         CSC_PeriphOnModeClock_Config(CSC_ON_GPL,ENABLE);
  133.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
  134.         CSC_PeriphOnModeClock_Config(CSC_ON_DMA,ENABLE);
  135.         CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
  136.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);
  137.        
  138.        
  139.   ProtectModuleReg(CSCprotect);
  140.    
  141. }

  142. void Sample_URT0_Init(void)
  143. {
  144.     URT_BRG_TypeDef  URT_BRG;
  145.     URT_Data_TypeDef DataDef;
  146.             PIN_InitTypeDef PINX_InitStruct;
  147.     //==Set CSC init
  148.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  149.     //Select CK_HS source = CK_IHRCO
  150.     //Select IHRCO = 11.0592M
  151.     //Select CK_MAIN Source = CK_HS
  152.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  153.     //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
  154.     //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
  155.    
  156.     //==Set GPIO init
  157.     //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8/9
  158.     //GPIO port initial is 0xFFFF
  159.     //Pin8 mode is PPO/Pin9 mode is ODO
  160.     //Pin8/9 pull-up resister Enable
  161.     //Pin8/9 function URT0_TX/RX
  162.   PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
  163.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  164.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  165.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  166.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  167.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
  168.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_TX
  169.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD at PB8

  170.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
  171.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_RX
  172.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD at PB9  
  173.        
  174.        
  175.    
  176.     //=====Set Clock=====//
  177.     //---Set BaudRate---//
  178.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
  179.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
  180.     URT_BRG.URT_PrescalerCounterReload = 0;                        //Set PSR
  181.     URT_BRG.URT_BaudRateCounterReload = 3;                        //Set RLR
  182.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                    //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
  183.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                    //Enable BaudRateGenerator
  184.     //---TX/RX Clock---//
  185.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);        //URT_TX use BaudRateGenerator
  186.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);        //URT_RX use BaudRateGenerator
  187.     URT_TXOverSamplingSampleNumber_Select(URTX, 25);                //Set TX OS_NUM
  188.     URT_RXOverSamplingSampleNumber_Select(URTX, 25);                //Set RX OS_NUM
  189.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
  190.     URT_TX_Cmd(URTX, ENABLE);                                    //Enable TX
  191.     URT_RX_Cmd(URTX, ENABLE);                                    //Enable RX
  192.    
  193.    

  194.     //=====Set Mode=====//
  195.     //---Set Data character config---//
  196.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
  197.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
  198.     DataDef.URT_TX_DataOrder   = URT_DataTyped_LSB;
  199.     DataDef.URT_RX_DataOrder   = URT_DataTyped_LSB;
  200.     DataDef.URT_TX_Parity      = URT_Parity_No;
  201.     DataDef.URT_RX_Parity      = URT_Parity_No;
  202.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
  203.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
  204.     DataDef.URT_TX_DataInverse = DISABLE;
  205.     DataDef.URT_RX_DataInverse = DISABLE;
  206.     URT_DataCharacter_Config(URTX, &DataDef);
  207.     //---Set Mode Select---//
  208.     URT_Mode_Select(URTX, URT_URT_mode);
  209.     //---Set DataLine Select---//
  210.     URT_DataLine_Select(URTX, URT_DataLine_2);
  211.    
  212.     //=====Set Error Control=====//
  213.     // to do...
  214.    
  215.     //=====Set Bus Status Detect Control=====//
  216.     // to do...
  217.    
  218.     //=====Set Data Control=====//
  219.     URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
  220.     URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
  221.     URT_TXGaudTime_Select(URTX, 0);
  222.    
  223.     //=====Enable URT Interrupt=====//
  224.     URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
  225.     URT_ITEA_Cmd(URTX, ENABLE);
  226.     NVIC_EnableIRQ(URT0_IRQn);

  227.     //=====Enable URT=====//
  228.     URT_Cmd(URTX, ENABLE);
  229.                
  230.         //==See MG32x02z_URT0_IRQ.c when interrupt in
  231. }

  232. int fputc(int ch,FILE *f)
  233. {
  234.        
  235.         URT_SetTXData(URTX,1,ch);
  236.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  237.         URT_ClearITFlag(URTX,URT_IT_TC);
  238.        
  239.         return ch;
  240. }

  241. void UartSendByte(int ch)
  242. {
  243.        
  244.         URT_SetTXData(URTX,1,ch);
  245.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  246.         URT_ClearITFlag(URTX,URT_IT_TC);
  247.        
  248. }

  249. void DMA_Init(void)
  250. {
  251.          DMA_BaseInitTypeDef DMATestPattern;

  252.     // ------------------------------------------------------------------------
  253.     // 1.Enable DMA
  254.     DMA_Cmd(ENABLE);
  255.    
  256.     // ------------------------------------------------------------------------
  257.     // 2.Enable Channel0
  258.     DMA_Channel_Cmd(DMAChannel0, ENABLE);
  259.    
  260.     // ------------------------------------------------------------------------
  261.     DMA_BaseInitStructure_Init(&DMATestPattern);
  262.    
  263.     // 3.initial & modify parameter
  264.       
  265.         // DMA channel select
  266.         DMATestPattern.DMAChx = DMAChannel0;
  267.         
  268.         // channel x source/destination auto increase address
  269.         DMATestPattern.SrcSINCSel = ENABLE;
  270.         DMATestPattern.DestDINCSel = DISABLE;
  271.         
  272.         // DMA source peripheral config
  273.         DMATestPattern.SrcSymSel = DMA_MEM_Read;
  274.         
  275.         // DMA destination peripheral config
  276.         DMATestPattern.DestSymSel = DMA_GPL_Write;
  277.         
  278.         // DMA Burst size config
  279.         DMATestPattern.BurstDataSize = DMA_BurstSize_1Byte;
  280.         
  281.         // DMA transfer data count initial number
  282.         DMATestPattern.DMATransferNUM = 9;
  283.    
  284.         // source/destination config
  285.         DMATestPattern.DMASourceAddr = &DataPattern;
  286. //                                DMATestPattern.DMADestinationAddr = &GPL->DIN;
  287.                                
  288.                                 DMA_Channel_Cmd(DMAChannel0, ENABLE);
  289.                                 DMA_Base_Init(&DMATestPattern);
  290. }

  291. void GPL_CRC_Check(void)
  292. {
  293.                 GPL_CRC_InitTypedef lGPL_CRC;
  294.        
  295.                 lGPL_CRC.CRC_Type = CRC32_POSIX; //Select type of CRC you want.
  296.        
  297.                 switch(lGPL_CRC.CRC_Type)
  298.                 {
  299.                         case CRC_8:// width=8 poly=0x07 init=0x00 refin=false refout=false xorout=0x00 check=0xf4 residue=0x00 name="CRC-8"
  300.                                                         lGPL_CRC.InputDataInverse = GPL_InputDataInverse_DISABLE;
  301.                                                         lGPL_CRC.InputDataEndian = GPL_InputDataEndian_LITTLE;
  302.                                                         lGPL_CRC.InputDataReverse = GPL_InputDataReverse_NONE;
  303.                                                         lGPL_CRC.CRC_InitialValue = 0UL;
  304.                                                         lGPL_CRC.CRC_InputDataWidth = GPL_CRC_InputDataWidth_8bit;
  305.                                                         lGPL_CRC.CRC_Polynomial = GPL_CRC_Polynomial_0x07;
  306.                                                         lGPL_CRC.OutputDataReverse = GPL_OutputDataReverse_NONE;
  307.                                                         GPL_CRC_Config(&lGPL_CRC);

  308. /*                                                        lCount = 0;
  309.                                                         do{
  310.                                                                         GPL->DIN.B[0] = DataPattern[lCount];
  311.                                                         }while(++ lCount < 9);
  312. */
  313.                                                        
  314.                                                         GPL_DMAN_Cmd(ENABLE);
  315.                                                   while (DMA_GetSingleFlagStatus(DMA, DMA_FLAG_CH0_TCF) == DRV_UnHappened);
  316.                                                         DMA_ClearFlag(DMA, DMA_FLAG_CH0_TCF);

  317.                                                         if(GPL->DOUT.B[0] != 0xF4)
  318.                                                                         printf("Error CRC8 0x07 not equal is 0xF4, Now is 0x%2X Fail.\n\r", GPL->DOUT.B[0]);
  319.                                                         else
  320.                                                                         printf("Error CRC8 0x07 Check OK\n\r");
  321.                                                         break;
  322.                                                        
  323.                         case CRC_8_ITU:// width=8 poly=0x07 init=0x00 refin=false refout=false xorout=0x55 check=0xa1 residue=0xac name="CRC-8/ITU"
  324.                                                         lGPL_CRC.InputDataInverse = GPL_InputDataInverse_DISABLE;
  325.                                                         lGPL_CRC.InputDataEndian = GPL_InputDataEndian_LITTLE;
  326.                                                         lGPL_CRC.InputDataReverse = GPL_InputDataReverse_NONE;
  327.                                                         lGPL_CRC.CRC_InitialValue = 0UL;
  328.                                                         lGPL_CRC.CRC_InputDataWidth = GPL_CRC_InputDataWidth_8bit;
  329.                                                         lGPL_CRC.CRC_Polynomial = GPL_CRC_Polynomial_0x07;
  330.                                                         lGPL_CRC.OutputDataReverse = GPL_OutputDataReverse_NONE;
  331.                                                         GPL_CRC_Config(&lGPL_CRC);

  332. /*                                                        lCount = 0;
  333.                                                         do{
  334.                                                                         GPL->DIN.B[0] = DataPattern[lCount];
  335.                                                         }while(++ lCount < 9);
  336. */
  337.                                                         GPL_DMAN_Cmd(ENABLE);
  338.                                                   while (DMA_GetSingleFlagStatus(DMA, DMA_FLAG_CH0_TCF) == DRV_UnHappened);
  339.                                                         DMA_ClearFlag(DMA, DMA_FLAG_CH0_TCF);
  340.                                                        
  341.                                                         if((GPL->DOUT.B[0] ^ 0x55) != 0xA1)
  342.                                                                         printf("Error CRC8 0x07 ITU not equal is 0xA1, Now is 0x%2X Fail.\n\r", (GPL->DOUT.B[0] ^ 0x55));  
  343.                                                         else
  344.                                                                         printf("Error CRC8 0x07 ITU Check OK\n\r");
  345.                                                         break;

  346.                         case CRC32_JAMCRC:// width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0x00000000 check=0x340bc6d9 residue=0x00000000 name="JAMCRC"
  347.                                                         lGPL_CRC.InputDataInverse = GPL_InputDataInverse_DISABLE;
  348.                                                         lGPL_CRC.InputDataEndian = GPL_InputDataEndian_LITTLE;
  349.                                                         lGPL_CRC.CRC_InputDataWidth = GPL_CRC_InputDataWidth_8bit;
  350.                                                         lGPL_CRC.CRC_Polynomial = GPL_CRC_Polynomial_0x4C11DB7;
  351.                                                         lGPL_CRC.CRC_InitialValue = 0xFFFFFFFFUL;
  352.                                                         lGPL_CRC.InputDataReverse = GPL_InputDataReverse_BYTE;
  353.                                                         lGPL_CRC.OutputDataReverse = GPL_OutputDataReverse_WORD;
  354.                                                         GPL_CRC_Config(&lGPL_CRC);

  355.                                         /*    lCount = 0;
  356.                                                         do{
  357.                                                                         GPL->DIN.B[0] = DataPattern[lCount];
  358.                                                         }while(++ lCount < 9);
  359.                                         */
  360.                                                                
  361.                                                         GPL_DMAN_Cmd(ENABLE);
  362.                                                   while (DMA_GetSingleFlagStatus(DMA, DMA_FLAG_CH0_TCF) == DRV_UnHappened);
  363.                                                         DMA_ClearFlag(DMA, DMA_FLAG_CH0_TCF);
  364.                                                                
  365.                                                         if((GPL->DOUT.W ^ 0x00000000) != 0x340BC6D9UL)
  366.                                                                         printf("Error CRC32 0x04c11db7 JAMCRC not equal 0x340BC6D9, Now is 0x%8X Fail.\n\r", (GPL->DOUT.W ^ 0x00000000));                               
  367.                                                         else
  368.                                                                         printf("Error CRC32 0x04c11db7 JAMCRC Check OK\n\r");       
  369.                                                         break;                                                                                               
  370.                 }

  371. }


  372. int main()
  373. {

  374.         PIN_InitTypeDef PINX_InitStruct;
  375.         CSC_Init();
  376.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;          // Pin select digital input mode
  377.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;  // Enable pull up resistor
  378.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  379.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;         // Pin output driver full strength.
  380.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
  381.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;         // Pin input data not inverse
  382.         PINX_InitStruct.PINX_Alternate_Function = 0;                                                 // Pin AFS = 0
  383.         GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                          // D6 setup at PE15
  384.         Sample_URT0_Init();
  385.         printf("hello\n");
  386.         DMA_Init();
  387.         DMA_ClearFlag(DMA, DMA_FLAG_CH0_TCF);
  388.         DMA_StartRequest(DMAChannel0);
  389.         GPL_CRC_Check();
  390.         while(1);
  391. }

复制代码
        受帖子篇幅影响,我只贴出了几种CRC校验方案。
 楼主 | 2018-11-29 10:36 | 显示全部楼层
另外,我发现CRC的DMA驱动代码有误,需要进行以下修改才能使用DMA:
  1. void GPL_DMA_Cmd(FunctionalState State)
  2. {
  3.     if(State == ENABLE)
  4.        GPL->CR0.W |= GPL_DMA_ENABLE;// GPL->CR0.B[0] |= GPL_DMA_MASK;
  5.     else
  6.         GPL->CR0.W &= (~GPL_DMA_ENABLE);
  7. }
复制代码


然后GPL_DMA_ENABLE的定义应该是GPL_CR0_DMA_EN_mask_w 而不是GPL_CR0_DMA_EN_mask_b3
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表