Hallo zusammen, ich möchte hier um euere Hilfe bieten... ich versuche mit dem STM32F303K6 eine CAN-Nachricht zu empfangen und der Mikrocontroller hängt sich auf wenn die Nachricht empfangen wird. Die LED am PA1 blink mit dem Timer und die Nachrichten werden einwandfrei gesendet, das sehe ich mit meinem CAN-Analyzer; aber sobald ich mit dem Analyzer nur eine Nachricht sende hängt sich Mikrocontroller auf, die LED bleibt je nach dem an oder aus; der kommt nicht mal zu der Interrupt-Behandlung, die LED am PA2 bleibt aus. Setze ich CAN_Mode auf loopback hängt er sich direkt nach dem RESET, offensichtlich von eigener gesendeten Nachricht. CAN Treiber: SN65HVD232D ext. Quarz 4 mhz, interner Takt 72 mhz IDE: Keil uVision 5 Vielen Dank Stanislav hier ist der Code: #include "stm32f30x.h" void TIM2_IRQHandler(void){ CanTxMsg canMessage; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)){ GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); }else{ GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); } canMessage.StdId = 0x123; canMessage.ExtId = 0; canMessage.RTR = CAN_RTR_DATA; canMessage.IDE = CAN_ID_STD; canMessage.DLC = 8; canMessage.Data[0] = 0; canMessage.Data[1] = 1; canMessage.Data[2] = 2; canMessage.Data[3] = 3; canMessage.Data[4] = 4; canMessage.Data[5] = 5; canMessage.Data[6] = 6; canMessage.Data[7] = 7; CAN_Transmit(CAN1, &canMessage); } void USB_LP_CAN1_RX0_IRQHandler(void) { GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET); } int main() { GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure; TIM_OCInitTypeDef TIM_OC_InitStructure; //CanTxMsg canMessage; SystemInit(); SystemCoreClockUpdate(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //LED1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2 GPIO_Init(GPIOA, &GPIO_InitStructure); //LED2 /* CAN GPIOs configuration **************************************************/ /* Connect CAN pins to AF9 */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_9); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_9); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* NVIC configuration *******************************************************/ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); 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 = ENABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 500KBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CAN1, &CAN_InitStructure); /* 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 = 0x0401 << 5; //CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; //CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; 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); /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //TIMER BLINK LED RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBase_InitStructure.TIM_Period = 500; //1999 TIM_TimeBase_InitStructure.TIM_Prescaler = 17999; TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM2, ENABLE); while(1) { } }
Fehler gefunden, falsche startup..s File; alls läuft :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.