Gast
#3376234
Hallo ich habe folgendes Problem: Mein Bus läuft gut auf 125 KBit. Wenn ich allerdings den Prescaler von 16 auf 8 runter stelle läuft nichts mehr. Die Clock bzw. Timer müssten alle passen, sonst würde der CAN ja auch in 125k nicht laufen !? Die LED in dem Code ist nur zur Kontrolle ob der Timer richtig läuft. Ossi ist vorhanden. Hier der Code: #define HSE_VALUE ((uint32_t)8000000) /* Includes */ #include <stddef.h> #include "stm32f2xx.h" #define CAN1_TX GPIO_Pin_12 #define CAN1_RX GPIO_Pin_11 #define CAN_PORT GPIOA #define CAN_GPIO_CLK RCC_AHB1Periph_GPIOA #define CAN_TX_SOURCE GPIO_PinSource12 #define CAN_RX_SOURCE GPIO_PinSource11 //====================================================================== ===== volatile uint8_t a=0; void SetupPeripherie (void) { GPIO_InitTypeDef GPIO_InitStructure; // GPIOD Takt freigeben RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // LED-GPIO als Ausgang konfigurieren GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void Delay(__IO uint32_t nCount) { while(nCount--) { } } void Timer_Initt(void) { TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //Einstellung Timer auf 100 ms TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBase_InitStructure.TIM_Period = 6000-1; TIM_TimeBase_InitStructure.TIM_Prescaler = 1000-1; 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); } void TIM2_IRQHandler(void){ /* a++; if (a==100) { GPIO_ToggleBits(GPIOB,GPIO_Pin_2); a=0; } */ GPIO_ToggleBits(GPIOB,GPIO_Pin_2); CanTxMsg canMessage; canMessage.StdId = 0x14; 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] = 1; canMessage.Data[4] = 0; canMessage.Data[5] = 1; canMessage.Data[6] = 4; canMessage.Data[7] = a; CAN_Transmit(CAN1, &canMessage); a++; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } void CAN_Initt(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE); // Connect CAN pins to AF9 GPIO_PinAFConfig(CAN_PORT, CAN_RX_SOURCE, GPIO_AF_CAN1); GPIO_PinAFConfig(CAN_PORT, CAN_TX_SOURCE, GPIO_AF_CAN1); // Configure CAN RX and TX pins GPIO_InitStructure.GPIO_Pin = CAN1_TX | CAN1_RX; 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(CAN_PORT, &GPIO_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); CAN_DeInit(CAN1); CAN_InitTypeDef CAN_InitStructure; CAN_InitStructure.CAN_Prescaler = 16; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; //CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; // CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; 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_Init(CAN1, &CAN_InitStructure); } int main(void) { SystemCoreClock = HSE_VALUE; SetupPeripherie(); Timer_Initt(); CAN_Initt(); while (1) { } }