STM32F303K6 - hängt sich auf wenn eine CAN-Nachricht empfangen wird

OP #4829238
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) {
  }
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.