Blue Flower

× STM32-Projektbesprecheungen

STM32 CAN , STM32 Bootloader

STM32F105 CAN1 Problem

More
1 year 2 months ago #457 by jh_elec
Moin Moin,

ich bin relativ neu in der Welt der STM´s.
Nun versuche ich schon seit ein paar Stunden den CAN1 zum laufen zu bekommen.
Das ganze soll auf einen STM32F105R8 passieren.

Konfiguriert habe ich ihn hoffentlich richtig?!
Vermutlich habe ich die System Frequenz nicht richtig konfiguriert?

Kann mir da jemand weiterhelfen?

Hier die CAN Init..
void _canInit(void)
{
    GPIO_InitTypeDef gpiox;
    CAN_InitTypeDef canx;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

    gpiox.GPIO_Pin      = GPIO_Pin_8;
    gpiox.GPIO_Mode     = GPIO_Mode_IPU;
    gpiox.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpiox);

    gpiox.GPIO_Pin      = GPIO_Pin_9;
    gpiox.GPIO_Mode     = GPIO_Mode_AF_PP;
    gpiox.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpiox);

    GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);

    CAN_DeInit(CAN1);

    canx.CAN_SJW        = CAN_SJW_1tq;  // SJW 1-4
    canx.CAN_BS1        = stBitrate[_500_kbit].BS1;  // Samplepoint 72%
    canx.CAN_BS2        = stBitrate[_500_kbit].BS2;  // Samplepoint 72%
    canx.CAN_Prescaler  = stBitrate[_500_kbit].Prescaler;

    canx.CAN_Mode = CAN_Mode_Normal;
    canx.CAN_TTCM = DISABLE;
    canx.CAN_ABOM = ENABLE;
    canx.CAN_AWUM = DISABLE;
    canx.CAN_NART = ENABLE;
    canx.CAN_RFLM = DISABLE;
    canx.CAN_TXFP = DISABLE;

    CAN_Init(CAN1, &canx);
}
mfg jh_elec

Please Anmelden or Create an account to join the conversation.

More
1 year 2 months ago - 1 year 2 months ago #458 by geier99
Replied by geier99 on topic STM32F105 CAN1 Problem
Hallo jh_elec

wenn Du Dir nicht sicher bist, dass Deine Clock-Konfiguration stimmt, dann füge doch mal folgendes ein:
RCC_ClocksTypeDef RCC_ClockFreq;

RCC_GetClocksFreq(&RCC_ClockFreq);

printf("\nClock-Konfiguration:\nSYSCLK=%10d Hz\nPCLK1 =%10d Hz\nPCLK2 =%10d Hz\nHCLK  =%10d Hz", RCC_ClockFreq.SYSCLK_Frequency,RCC_ClockFreq.PCLK1_Frequency,RCC_ClockFreq.PCLK2_Frequency,RCC_ClockFreq.HCLK_Frequency);

den printf kannst Du nur verwenden, wenn er bei Dir aktiviert ist, falls nicht kannst du Dir im Debugger die Werte anschauen. Und ein Blick in das "RCC->CR" Register kann auch nicht schaden, hier siehst Du ob der HSE läuft.

Und hier noch wie ich den Clock auf 72MHz stelle:
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if(HSEStartUpStatus == SUCCESS){
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        RCC_HCLKConfig(RCC_SYSCLK_Div1); 

        RCC_PCLK2Config(RCC_HCLK_Div1); 
                                            
        RCC_PCLK1Config(RCC_HCLK_Div2);   

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
         
        RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9); // PLL konfigurieren: HSE / 1  * 9 = 72MHZ
        RCC_PLLCmd(ENABLE);  // PLL einschalten   

        while(RCC_GetSYSCLKSource() != 0x08){
        }

        RCC_HSICmd(DISABLE);
    }

   SystemCoreClockUpdate();


Grüße
Andreas

PS: Bei mir läuft der CAN mit einem 105er problemlos mit einem 8 MHz Quarz und einen Sysclock von 72 MHz.
Last edit: 1 year 2 months ago by geier99.

Please Anmelden or Create an account to join the conversation.

Time to create page: 0.206 seconds
Powered by Kunena Forum