#include #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_can.h" #include "misc.h" //Declaration of the Variables CanRxMsg RxMsg; CanTxMsg TxMsg; CanTxMsg TxMsg2; uint32_t counter1 = 0; // counter for message 1 uint32_t counter2 = 0; // counter for message 2 //counter1 = 0; //counter2 = 0; void NVIC_Config (void) //configuration of the Interrupt { NVIC_InitTypeDef NVIC_structure; NVIC_structure.NVIC_IRQChannel = CAN1_RX0_IRQn; NVIC_structure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_structure.NVIC_IRQChannelSubPriority = 1; NVIC_structure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_structure); } void NVIC_Config2 (void) { NVIC_InitTypeDef NVIC_structure; NVIC_structure.NVIC_IRQChannel = CAN1_RX1_IRQn ; NVIC_structure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_structure.NVIC_IRQChannelSubPriority = 0; NVIC_structure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_structure); } //main function int main(void) { //Variables and structures GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; //Initialize System SystemInit(); //Enable CAN1 and GPIOD RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //enable CAN1 clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //enable Port D clock //LEDs GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //green , orange GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); //Configure PD0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOD, &GPIO_InitStructure); //CAN1_RX to PD0 GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); //Configure PD1 to AF9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOD, &GPIO_InitStructure); //Map CAN1_TX to PD1 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); //CAN1 on standard CAN_DeInit(CAN1); //Configure CAN CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = ENABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //Baud rate = 125 Kb/s CAN_InitStructure.CAN_BS1 = CAN_BS1_7tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler = 24; CAN_Init(CAN1, &CAN_InitStructure); //Initialize CAN filter 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 = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); //turn on CAN1 interrupt CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //initialize interrupts NVIC_Config(); //Endless loop while(1) { //sleep mode __WFI(); //wake up from sleep mode through CAN interrupt on receiving message } } void CAN1_RX0_IRQHandler (void) { CAN_Receive(CAN1, CAN_FIFO0, &RxMsg); if (counter1 == 10) { //create message TxMsg.StdId = 0x11D; TxMsg.ExtId = 0; TxMsg.DLC = 1; TxMsg.IDE = CAN_ID_STD; TxMsg.RTR = CAN_RTR_DATA; TxMsg.Data[0] = counter2; // send number of received messages CAN_Transmit(CAN1, &TxMsg); GPIO_ToggleBits(GPIOD,GPIO_Pin_12); //blink green LED } if(RxMsg.StdId == 0x67) { counter1++; } else if(RxMsg.StdId == 0x52) { counter2++; } }