Forum: Mikrocontroller und Digitale Elektronik STM32F303K6 - hängt sich auf wenn eine CAN-Nachricht empfangen wird


von Stanislav S. (lau-de)


Lesenswert?

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) {
  }
}

von Stanislav S. (lau-de)


Lesenswert?

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
Noch kein Account? Hier anmelden.