该代码是轮询模式,你将中断开启,在中断中处理相关操作就可以。
/******************************************************************************* * Function Name : main * Description : Main program * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endif
RCC_Configuration(); // System Clocks Configuration NVIC_Configuration(); // NVIC Configuration GPIO_Configuration(); // GPIO ports pins Configuration
TestRx = CAN_Polling(); // CAN transmit at 100Kb/s and receive by polling in loopback mode
if (TestRx == FAILED) { GPIO_SetBits(GPIOC, GPIO_Pin_4); // Turn on led connected to PC.08 pin (LD3) } else { GPIO_SetBits(GPIOC, GPIO_Pin_6); // Turn on led connected to PC.06 pin (LD1) }
while (1) { } }
/******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { RCC_DeInit(); /* RCC system reset(for debug purpose) */ RCC_HSEConfig(RCC_HSE_ON); /* Enable HSE */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Wait till HSE is ready */ if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Enable Prefetch Buffer */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); /* Select HSE as system clock source */ while(RCC_GetSYSCLKSource() != 0x04) { // Wait till HSE is used as system clock source } } RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); /* GPIOA and GPIOC clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); /* CAN Periph clock enable */ }
/******************************************************************************* * Function Name : GPIO_Configuration * Description : Configures the different GPIO ports. * Input : None * Output : None * Return : None *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull */
/* Enable the USART2 Pins Software Remapping */ GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Configure CAN pin: TX */ }
/******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures the NVIC and Vector Table base address. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /* Set the Vector Table base location at 0x20000000 */ #else /* VECT_TAB_FLASH */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Set the Vector Table base location at 0x08000000 */ #endif
/* enabling interrupt */ NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
/******************************************************************************* * Function Name : CAN_Polling * Description : Configures the CAN and transmit and receive by polling * Input : None * Output : None * Return : PASSED if the reception is well done, FAILED in other case *******************************************************************************/ TestStatus CAN_Polling(void) { u8 Error;
CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; u32 i = 0; u8 TransmitMailbox;
/* CAN register init */ CAN_DeInit(); CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; // CAN_Mode_LoopBack CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 5; Error = CAN_Init(&CAN_InitStructure); if (Error == 0) return FAILED;
/* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; //0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
/* transmit */ TxMessage.StdId = 0x18; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = 0x40; TxMessage.Data[1] = 0x40; TxMessage.Data[2] = 0x45; TxMessage.Data[3] = 0x51; TxMessage.Data[4] = 0x52; TxMessage.Data[5] = 0x65; TxMessage.Data[6] = 0x61; TxMessage.Data[7] = 0x64; // @@EQRead
TransmitMailbox = CAN_Transmit(&TxMessage);
i = 0; while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; }
return PASSED; // Test Passed }
|