Forum: Mikrocontroller und Digitale Elektronik CC/alternate function


von rasoul (Gast)


Lesenswert?

Hallo;

ich versuche seit 2 TAGE; die Funktion TIM -Capture/Compare durch STM32 
value line Discovery (STM32f100RB) zu Implementieren.

Ich habe alle Beiträge, die hier in diesem Forum sind, durchgelesen, und 
dementsprechend habe ich mich orientiert.

Ich wollte einfache einen captureInterrupt auslösen lassen, wenn der 
User Button gedruckt wird.

dafür habe ich die Alternate Function verwendet, den Cappture_Interrupt 
und der NVIC eingesetzt.

Ich habe den Code mehrmals durchgeprüft und zeile für Zeile geprüft, 
trotzdem bich ich leider auf den Fehler nicht gekommen.

Kann jemand mir bitte helfen, um den Fehler zu finden.

vielen Dank

    Ich brauche jede kleine Hinweise, Tipp, Orientierung bitte....!


    /* Includes */

    #include <stddef.h>
    #include "stm32f10x.h"

    /* ---------------------------Private typedef 
-------------------------------*/
    TIM_TimeBaseInitTypeDef TIM2_Configuration;
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_OCInitTypeDef Output_Compare;
    TIM_ICInitTypeDef Input_Capture;
    GPIO_InitTypeDef GPIO_Inity;

    /*Variable*/

    uint32_t Interrupt_Counter = 0;

    /*# ************************************************** 
*****************************/*/

    void RCC_Configuration(void)
    {
    /* TIM2clock= SystemCoreColock, enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    /* GPIOA clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    /* ALTERNATE FUNCTION ENABLE*/
    RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    /* GPIOC clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }

    /************************************************** 
*****************************/
    void GPIO_Setup ()
    {
    /* LEDs pin (PC.08 and 09) configuration */
    GPIO_Inity.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_Inity.GPIO_Mode =GPIO_Mode_Out_PP;
    GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz;

    /* TIM2 PA.0 configuration*/
    GPIO_Inity.GPIO_Mode =GPIO_Mode_AF_PP;// soll ich PULL-Down oder 
Pull up werwenden wenn der
    // Eingang als Pull-Down Konfiguriert?
    // Der AF weil bei dieser Pin wir der Alternate Function verwendet
    GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Inity.GPIO_Pin =GPIO_Pin_0;

    GPIO_Init(GPIOA, &GPIO_Inity);
    GPIO_Init(GPIOC, &GPIO_Inity);

    }

    /************************************************** 
******************************/

    void TIM2_SETUP ()
    {

    /*----Time_Base_Counter-----*/

    TIM2_Configuration.TIM_CounterMode= TIM_CounterMode_Up;
    TIM2_Configuration.TIM_ClockDivision= 0;
    TIM2_Configuration.TIM_Period=65535;
    TIM2_Configuration.TIM_Prescaler=1;
    TIM_TimeBaseInit(TIM2,&TIM2_Configuration);

    /*----Input_Capture Mode CH1----*/
    Input_Capture.TIM_ICSelection = TIM_ICSelection_IndirectTI;// hier 
verstehe ich der Unterschied
    // zwischen Direct und Indirekt nicht
    // wirklich, aber ich verwende Direct weil ich
    // kein remaping durchführe
    Input_Capture.TIM_ICPolarity= TIM_ICPolarity_Rising;
    Input_Capture.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    Input_Capture.TIM_Channel= TIM_Channel_1;
    Input_Capture.TIM_ICFilter = 0;

    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);// dieze Zeile verstehe 
ich überhaupt nicht
    TIM_ICInit(TIM2, &Input_Capture);

    TIM_Cmd(TIM2, ENABLE);

    /*----Enable the Capture Compare Interrupt Request-----*/
    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);

    }

    /************************************************** 
******************************/
    void NVIC_SETUP ()
    {
    /* Enable the TIM2 global Interrupt */

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    }

    /************************************************** 
******************************/

    void delayLoop()
    {
    volatile uint32_t delayCount = 1000000;
    while (delayCount > 0)
    {
    delayCount--;
    }
    }


    /*+++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++++++++++++++++++++++++++++*/

    int main (void)
    {
    RCC_Configuration();
    GPIO_Setup();
    TIM2_SETUP();

    while (1)
    {

    if(INT_Counter ==1)
    {
    GPIOC->BSRR = GPIO_Pin_8; // LED On
    delayLoop();

    GPIOC->BRR = GPIO_Pin_8; // LED Off
    delayLoop();

    GPIOC->BSRR = GPIO_Pin_8; // LED On
    delayLoop();

    GPIOC->BRR = GPIO_Pin_8; // LED Off
    delayLoop();
    GPIOC->BSRR = GPIO_Pin_9; // LED On
    delayLoop();

    GPIOC->BRR = GPIO_Pin_9; // LED Off
    delayLoop();

    }

    }
    return 0;
    }

    void TIM2_IRQHandler (void)
    {
    // Interrupt Flag muß per Software gelöscht werden

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    INT_Counter++;
    }


    Ich danke Ihnen.

von Turbo J (Gast)


Lesenswert?

1
    uint32_t Interrupt_Counter = 0;

Da fehlt ein "volatile":
1
    volatile uint32_t Interrupt_Counter = 0;

Nur so liest der Compiler die Variable auch bei jedem Zugriff neu ein. 
Sonst schafft er sie einfach nur vor der Schleife in ein Register und 
greift nur aufs Register zu, da kann der Timer-IRQ dann machen was er 
will. ;-)

von rasoul (Gast)


Lesenswert?

Danke Turbo für die Schnelle Antwort.
ich habe es Korregiert, sogar habe ich anderen Fehler wie z.B

GPIO_Inity.GPIO_Mode =GPIO_Mode_AF_PP
richtig ist

GPIO_Inity.GPIO_Mode =GPIO_Mode_IN_FLOATING;

Aber trotzdem erfolglos.

Ich verstehe überhaupt nicht warum`??

Bitte unm Hilfe.

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.