- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 19

Thema: STM32F100/ Capture Compare Unit

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Ich habe mal ihre code mit den IAR compiler in meines Discovery board versucht. Das scheint zu functionieren. Jeden mal das ich den user button drucke, erhoht die variable "INT_count", und die LEDS fangen an zu blinken Ich habe nur kleine aenderungen gemacht wegend andere compiler. Moglich sind andere systemfiles auch noch wichtig (Clock Init).
    Ich kopîere das nochmal hierein.
    Code:
    /* 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;
    /*---------------------------Global Variable---------------------------------*/
    volatile uint32_t INT_Counter = 0;
    volatile uint32_t delayCount;
    
    /************************************************** *****************************
    # * Function Name : RCC_cONFIGURATION
    # * Description : .
    # * Input : None
    # * Output : None
    # * Return : None
    # ************************************************** *****************************/
    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_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    /* GPIOC clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }
    /************************************************** *****************************
    # * Function Name : GPIO_SETUP
    # * Description : .
    # * Input : None
    # * Output : None
    # * Return : None
    # ************************************************** *****************************/
    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_IN_FLOATING;// 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);
    }
    /************************************************** *****************************
    # * Function Name : TIM2_SETUP
    # * Description : Timer2 as Output/Compare
    # * Input : None
    # * Output : None
    # * Return : None
    # ************************************************** *****************************/
    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_DirectTI;// 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_ICInit(TIM2, &Input_Capture);
    TIM_Cmd(TIM2, ENABLE);
    /*----Enable the Capture Compare Interrupt Request-----*/
    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
    }
    /************************************************** *****************************
    # * Function Name : Configure the nested vectored interrupt controller.
    # * Description : .
    # * Input : None
    # * Output : None
    # * Return : None
    # ************************************************** *****************************/
    void NVIC_SETUP ()
    {
    /* Enable the TIM2 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    }
    /************************************************** *****************************
    # * Function Name : delayloop
    # * Description : .
    # * Input : None
    # * Output : None
    # * Return : None
    # ************************************************** *****************************/
    void delayLoop()
    {
    delayCount = 1000000;
    while (delayCount > 0)
    {
    delayCount--;
    }
    }
    
    /*+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++*/
    int main (void)
    {
    RCC_Configuration();
    GPIO_Setup();
    TIM2_SETUP();
    NVIC_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;
    }
    //steht bei mir in eine ander file : STM32F10x_it.c
    void TIM2_IRQHandler (void)
    {
    // Interrupt Flag muß per Software gelöscht werden
    TIM_ClearFlag(TIM2, TIM_FLAG_CC1);
    //TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); 
    INT_Counter++;
    }
    Ha der Atollic compiler auchj eine debugger ?
    Fiel erfolg !!

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Hallo,

    vielen Dank nochmal für Ihre Mühe. Sie haben mir sehr viel geholfen.

    Ja, der Atolic hat schon Debugger.

    Den Code werde ich gleich testen.
    Danke.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    das ist ein Rätzel, den ich nie im Leben verstehen würde.
    es funktioniert nicht!
    bei Debugg gehts rein in der If_schleife aber die LEDS leuchten nicht obwohl er bei LED-On steht.

    Bei meinem Versuch er konnte überhaupt die If_schleife nicht ausführen.

    wenn ich andere Programme bedugge, dann leuchten die Leds ganz normal. nur bei diesem Code leuchten sie nicht.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Ich hab das Programm (Toggle LED) aus dem EXamble genommen und debuggert. Es hat supper funktioniert.
    Step by step habe ich das Programm erweitert und bei jede Erweiterung habe das Programm erneut debugg um ich sicher zu sein dass die neue erweiterung hat die Funktion von Blinken_Leds nicht beeinflüssen.


    1) habe ich NVIC und Inputcapture hingeschrieben. debuggert--> LEDs leuchten.ok!
    2)danach die VOLTEILE, debuggert---> LEDS leuchten.ok!
    3)RCC-Configuration hingefügt, debuggert-->LEDs leuchten. Ok!
    4) dann das GPIO-MODE habe ich von IPD zu In_Floating geändert,debuggert--->LEDS leuchten nicht!! ok das ist Normal.

    Was ich annormal finde, dass ich den GPIO-MODE auf IPD zurücksetze und trotzdem leuchten die LEDS nicht. warum?

    mehr als diese 4 schritte habe ich and das Programm von LED-Toggle nicht geändert und sie leuchten nicht mehr obwohl sie besitzen den Orginalen Zustand.

    was könnte dahinten stecken????

    Danch habe ich die RCC von AFIO deaktiviert, trotzdem leuchten die LEDS nicht mehr.


    /* Includes */

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

    NVIC_InitTypeDef NVIC_InitStructure; <-- das ist die erste 'Änderung, LEDs leuchten noch
    TIM_ICInitTypeDef Input_Capture;
    GPIO_InitTypeDef GPIO_Inity;


    volatile uint32_t INT_Counter = 0;<-- zwite Erweiterung, LEDS leuchten noch
    volatile uint32_t delayCount;



    void RCC_Configuration(void)
    {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); <-- dritte, LEDS leuchten
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<-- vierte, LEDS leuchten nicht mehr
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }

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


    void GPIO_Setup ()
    {
    GPIO_InitTypeDef GPIO_Inity;
    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;
    GPIO_Init(GPIOC, &GPIO_Inity);

    GPIO_Inity.GPIO_Pin = GPIO_Pin_1;
    GPIO_Inity.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Inity.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_Inity);
    }


    int main (void)
    {
    uint8_t read_A0 = 0;
    SystemInit();
    GPIO_Setup();


    while (1)
    {

    read_A0 =GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

    if(read_A0)
    {
    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;
    }

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    GPIO_Inity.GPIO_Pin = GPIO_Pin_1;
    GPIO_Inity.GPIO_Mode = GPIO_Mode_IPD;
    Jetzt steht hier Pin A1 auf IPD. Pin A0 wird nicht mehr initialisiert. Kan das die Ursache sein ?

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Nein, das ist nicht die Ursache.

    Übrigens in dem orginalen Programm (Toggle-LED), das in Exsamble stheht, ist der PA1 als GEPIO-Pin für Port A eingestellt, und nicht Pin0.
    das hat mir aufgefallen, denn laut der Pinlayout (Datasheet) ist der User_Button mit PA.0 verbunden.

    Das Heisst wenn ich im Programm den Pin 1 als GPIO-Pin für User-Button eingebe soll die LEDS nicht leuchten.
    Tatsach ist, dass sie tortz der Änderung von pin0 auf Pin1 und von pin1 auf pin0 leuchten.

    Ist nicht wahnsinnig????
    ich bin Verrückt geworden.

    Ist das Programm 100% prommlemlos bei dir gelaufen????
    Bei mir das programm meldet kein Fehler bei Debugging, aber die LEDS leuchten nicht wenn der User Butoon gedruckt wird.
    Sogra es geht rein in der schleife liest den Befehl das die LEDS einschalten aber die Leds leuchten nicht.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Es ist scheinbar so, das die Init von portA nicht immer functioniert. Ich habe auch schon erfahren, das beim debuggen und download, nicht alle register von µ gereset werden. Nach eine hard reset (abklemmen Spannung) hat der µ dan wel functioniert.
    Bei den debugger konnen sie auch schon sehen oder den Eingang A0 hoch oder niedrig ist. Auch die initialisierung von Ports kann hier angesehen werden. Bei mir ist das program problemlos gelaufen. Ich habe wel die Abfrage "INT_count==1" gaendert in "INT_count>0", jetzt functioniert das auch bei mehrmals drucken.
    EDIT :
    Ich habe beim zweite Versuch auch das problem das die LEDS nicht leuchten !! Jetzt habe ich wel ein Fehler gefunden in die Init von Ports :
    /************************************************** *****************************/
    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);

    }
    Da wird erst eine structure fur Port C gefullt, und dan wieder ueberschrieben für Port A !! Damit wirden Port A und Port C als AF_PP definiert !! Einfach die Zeile "GPIO_Init(GPIOA, &GPIO_Inity);" nach oben verschieben, unten den declarierung von der Structure von Port A !! Dann hat er es bei mir wieder functioniert.
    Geändert von RP6conrad (17.07.2011 um 11:32 Uhr)

Ähnliche Themen

  1. ISR per Output Compare funktioniert nicht wie gewünscht
    Von Sebastian132 im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 24.07.2006, 11:22
  2. Fragen zu Compare -> Timer
    Von Rage_Empire im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 21.11.2005, 18:35
  3. Problem mit Timer1 und Compare...
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 12.11.2005, 16:34
  4. Compare Register
    Von chouifi im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 31.10.2005, 13:47
  5. Wie Compare Register Werte sicher ändern?
    Von Werner_Just im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.04.2005, 14:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen