mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103: bei UART1 remapped funktioniert der UART1 Interrupt nicht


Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe einen Beispielcode zum toggeln einer LED per UART1 Interrupt 
hergenommen, bringe ihn aber nicht ans laufen.
Ich musste den UART1 remappen, da bei der Hardware RX und TX auf PB7/PB7 
liegen.
Das "Hello World" beim Initialisieren wird gesendet, dann wird aber die 
Interrupt-Routine beim Empfangen nicht angesprungen.

Irgendwelche Ideen?

Gruß
hochsitzcola

/*************************
 * stm32 uart main.c
 *************************/

#include "stm32f10x.h"
#include "print.h"


/* User defined function prototypes */
void GPIOB_Init(void);
void USART1_Init(void);
void led_toggle(void);


int main(void)
{
    /* Initialize GPIOA PIN8 */
    GPIOB_Init();
    /* Initialize USART1 */
    USART1_Init();
    printf_("Hello World");
   // USART_SendData(USART1, 'T');

    while(1)
    {
      //USART_SendData(USART1, 'T');  /* Do nothing, all happens in ISR */
    }
}

/***********************************************
 * Initialize GPIOA PIN8 as push-pull output
 ***********************************************/
void GPIOB_Init(void)
{
    /* Bit configuration structure for GPIOA PIN8 */
    GPIO_InitTypeDef gpiob_init_struct = { GPIO_Pin_2, GPIO_Speed_50MHz,
                                           GPIO_Mode_Out_PP };

    /* Enable PORT A clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    /* Initialize GPIOA: 50MHz, PIN8, Push-pull Output */
    GPIO_Init(GPIOB, &gpiob_init_struct);

    /* Turn off LED to start with */
    GPIO_SetBits(GPIOB, GPIO_Pin_2);
}

/*****************************************************
 * Initialize USART1: enable interrupt on reception
 * of a character
 *****************************************************/
void USART1_Init(void)
{
    /* USART configuration structure for USART1 */
    USART_InitTypeDef usart1_init_struct;
    /* Bit configuration structure for GPIOB PIN6 and PIN7 (alternative function) */
    GPIO_InitTypeDef gpiob_init_struct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

    /* Enalbe clock for USART1, AFIO and GPIOA */


    /* GPIOB PIN6 alternative function Tx */
    gpiob_init_struct.GPIO_Pin = GPIO_Pin_6;
    gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    gpiob_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &gpiob_init_struct);
    /* GPIOB PIN7 alternative function Rx */
    gpiob_init_struct.GPIO_Pin = GPIO_Pin_7;
    gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    gpiob_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &gpiob_init_struct);

    /* Enable USART1 */
    USART_Cmd(USART1, ENABLE);
    /* Baud rate 9600, 8-bit data, One stop bit
     * No parity, Do both Rx and Tx, No HW flow control
     */
    usart1_init_struct.USART_BaudRate = 9600;
    usart1_init_struct.USART_WordLength = USART_WordLength_8b;
    usart1_init_struct.USART_StopBits = USART_StopBits_1;
    usart1_init_struct.USART_Parity = USART_Parity_No ;
    usart1_init_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    usart1_init_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    /* Configure USART1 */
    USART_Init(USART1, &usart1_init_struct);
    /* Enable RXNE interrupt */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    /* Enable USART1 global interrupt */
    
    NVIC_EnableIRQ(USART1_IRQn);



}

/*******************************************
 * Toggle LED
 *******************************************/
void led_toggle(void)
{
    /* Read LED output (GPIOA PIN8) status */
    uint8_t led_bit = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2);

    /* If LED output set, clear it */
    if(led_bit == (uint8_t)Bit_SET)
    {
        GPIO_ResetBits(GPIOB, GPIO_Pin_2);
    }
    /* If LED output clear, set it */
    else
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_2);
    }
}

/**********************************************************
 * USART1 interrupt request handler: on reception of a
 * character 't', toggle LED and transmit a character 'T'
 *********************************************************/
void USART1_IRQHandler(void)
{
    /* RXNE handler */
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        /* If received 't', toggle LED and transmit 'T' */
        if((char)USART_ReceiveData(USART1) == 't')
        {
            led_toggle();
            USART_SendData(USART1, 'T');
            /* Wait until Tx data register is empty, not really
             * required for this example but put in here anyway.
             */
            /*
            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
            {
            }*/
        }
    }

    /* ------------------------------------------------------------ */
    /* Other USART1 interrupts handler can go here ...             */
}



Autor: Regeln Erklehrbehr (Gast)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Irgendwelche Ideen?

Zuerst sollte hochsitzcola mal lernen die Hinweise

a) zu lesen
b) zu verinnerlichen
c) anerkennen dass sie auch für ihn gelten

Diese Regeln sind für jeden der postet frei zugänglich.

Und ja, dein Sourcecode gehört zu den "längeren".

Autor: hochsitzcola (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Danke Herr Lehrer, ich werd's mir merken! :-)

Gruß
hochsitzcola

Autor: Regeln Erklehrbehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Danke Herr Lehrer, ich werd's mir merken!

Da dein Code bei mir funktioniert tippe ich mal darauf dass
du Rx und Tx vertauscht angeschlossen hast.

Also gehört

PB6 an Rx  deines Kommunikations-Partners
und
PB7 an Tx  deines Kommunikations-Partners

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, kann nicht sein, da das Senden ja funktioniert.  Komisch, daß es bei 
dir geht. Da muß ich wohl noch mal allgemein probieren, ob die externen 
Interrupts funktionieren

Gruß
hochsitzcola

Autor: Regeln Erklehrbehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Programm ist unvollständig dahingehend dass du nicht zeigst
in welcher Umgebung dein Controller initialisiert wird. Dort kann
ein Hund begraben sein. Z.B. Prozessortakt oder IRQ-Tabelle.

Poste dein ganzes Projekt in einem Zip Archiv, dann kann man es
leichter nachvollziehen.

Auch hast du deinen Kommunikations-Partner nicht beschrieben.

hochsitzcola schrieb:
> ob die externen Interrupts funktionieren

Externe Interrupts finden hier nicht statt.

Autor: hochsitzcola (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier das gesamte Projekt!
Es wird ein etwas exotischer Prozessor genutzt, vielleicht hat der eine 
andere Interrupt-Tabelle?!
Beitrag "welches Target für STM32FEBKC6T6 auswählen"

Gruß
hochsitzcola

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> vielleicht hat der eine andere Interrupt-Tabelle?!

Kannst du das nicht selber klären?

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> vielleicht hat der eine andere Interrupt-Tabelle?!

Kannst oder willst du das nicht selber klären?

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich nicht, da ich kein Referenz Manual zu dem Exoten habe.

Gruß
hochsitzcola

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist Zeit auf einen echten STM32F103 umzusteigen.
Findest du nicht?

Autor: OMG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pegel schrieb:
> Jetzt ist Zeit auf einen echten STM32F103 umzusteigen.

Nein! Hier wird gespart, koste es was es wolle.

Autor: HierWirdDirGeholfen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Kann ich nicht, da ich kein Referenz Manual zu dem Exoten habe.

Dann musst du Dir eines besorgen!

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prima Plan, wo bitte schön? Ich hab mir schon die Finger wund gegooglet.

Gruß
hochsitzcola

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Referenzhandbuch keine Softwareentwicklung. So ist das halt.

Punkt

Autor: Tim K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Kann ich nicht, da ich kein Referenz Manual zu dem Exoten habe.

Das ist kein Exot!

Autor: HierWirdDirGeholfen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tippe hier auch auf geballte Faulheit.
Erkennt man auch schon am ersten hingerotzten superinformativen post.

Hier ziehe ich wirklich den Hut vor "Regeln Erklehrbehr".

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim K. schrieb:
> Das ist kein Exot!

Ich liebe dieses Forum :-)

Wenn das alles so einfach ist, gebt mir doch bitte den Tipp, was an 
meiner Kombination aus Code und Controller nicht funktioniert.

- Controller STM32FEBKC6T6: Blink Beispiel und senden UART funktioniert.

- Code: funktioniert laut User Regeln Erklehrbehr (mit welchem Prozessor 
hat er uns nicht verraten).

- Kombination aus Code und Controller STM32FEBKC6T6: UART1 Interrupt 
funktioniert nicht.

hochsitzcola

Autor: OMG (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> - Kombination aus Code und Controller STM32FEBKC6T6: UART1 Interrupt
> funktioniert nicht.

Probiere den Code im Anhang.

Angepasst für BluePill 72 Mhz, UART remapped auf PB6/PB7.
LED (wie Original) an PC13, sollte zyklisch blinken.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deinen Einsatz. Ich kann das gerne auf einem Bluepill 
probieren, für mein Projekt wird da nichts blinken, da die LED auf PB2 
liegt. Aber vielleicht bekomme ich ja eine Antwort über UART1 wenn ich 
vom Laptop "t" sende...

Gruß
hochsitzcola

Autor: OMG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> für mein Projekt wird da nichts blinken

Du kannst ja provisorisch an PC13 eine LED anschliessen.

Wichtig wäre noch dass dein "Problemcontroller" auch mit
8MHz externem Takt arbeitet, d.h ein solcher Quarz
angeschlossen ist.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, mir geht grad auf, daß ich Rx nicht als alternative function 
definiert hab:
gpiob_init_struct.GPIO_Mode = GPIO_Mode_AF_OD;

Mal schauen ob es daran liegt ;-)

Gruß
hochsitzcola

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, open drain ist ein Ausgang, also zu früh gefreut ?!

Gruß
hochsitzcola

Autor: OMG (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Danke für deinen Einsatz. Ich kann das gerne auf einem Bluepill
> probieren

hochsitzcola schrieb:
> Mal schauen ob es daran liegt

Wenn du jetzt nicht in kurzer Zeit auf meinen Testvorschlag
eingehst dann bist du für mich kein Troll, sondern ein Voll-Troll.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach ich! Sobald ich zuhause bin! :-)

Gruß
hochsitzcola

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, leider keine Erfolgsmeldung. Auf dem Bluepill blinkt die LED brav, 
mit dem STM32FEBKC6T6 passiert garnichts, nicht mal die "Hallo Welt" 
Meldung. Es ist aber auch kein externer Quarz auf der Platine zu finden.

Laut diesem Post, sollte der Prozessor dann aber automatisch den 
internen Oszillator nehmen?
Beitrag "Re: STM32F1 (Nucleo-F103RB) - HSE ohne Quartz?"

Gruß
hochsitzcola

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Laut diesem Post, sollte der Prozessor dann aber automatisch den
> internen Oszillator nehmen?

Die Hardware enthält keinen Automatismus. Das müsste man ausdrücklich in 
Software implementieren.

Autor: OMG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Es ist aber auch kein externer Quarz auf der Platine zu finden.

OMG schrieb:
> Wichtig wäre noch dass dein "Problemcontroller" auch mit
> 8MHz externem Takt arbeitet, d.h ein solcher Quarz
> angeschlossen ist.

Autor: OMG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hochsitzcola schrieb:
> Es ist aber auch kein externer Quarz auf der Platine zu finden.

Das bedeuted so quasi dass du bis jetzt nur Mist-Firmware für
deinen Controller geschrieben hast da du dich um die Clock-
Aufbereitung noch gar nicht gekümmert hast.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ihn so verstanden, dass die Hardware vorgegeben ist. Wenn der 
Hersteller des Gerätes keinen Quarz für nötig gehalten hat, dann ist das 
halt so. Das für kann doch der TO nichts.

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Rückendeckung :-)
Nach der Initialisierung ist RCC->CFGR & RCC_CFGR_SWS Null, also ist der 
interne Takt aktiv.
Ich habe jetzt noch SystemInit(); im Code hinzugefügt. Das ändert nichts 
am verhalten. Das Senden funktioniert ja auch.

Gruß
hochsitzcola

Autor: OMG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> dann ist das halt so. Das für kann doch der TO nichts.

Hab ich auch nicht behauptet.

Aber wenn er sich nicht um sein Clock-Gefüge kümmert ist
er nicht Herr der Lage und es kann alles Mögliche passieren.

hochsitzcola schrieb:
> Ich habe jetzt noch SystemInit(); im Code hinzugefügt.

Das sagt gar nichts darüber aus _wie_ der Prozessor
initialisiert wird.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OMG schrieb:
>> dann ist das halt so. Das für kann doch der TO nichts.
> Wenn er sich nicht um sein Clock-Gefüge kümmert ist
> er nicht Herr der Lage und es kann alles Mögliche passieren.

Er hat ein vorcompiliertes Hex File bekommen. Dessen Inhalt hat er 
logischerweise nicht unter Kontrolle.

OMG wollte sicher helfen, aber ich denke es war sein Fehler, einen 
Quarz vorauszusetzen ohne vorher danach zu fragen.

Das Problem des TO ist ein ganz anderes, nämlich dass er kein passendes 
Reference Manual hat. Aufgrund unserer vorherigen Diskussion hatte er 
gehofft, dass es sich um eine frühe Variante des STM32F103 handelt so 
dass er dessen reference Manual verwenden kann. Doch seine aktuellen 
Probleme deuten an, dass dem wohl nicht so ist.

Man könnte sich jetzt natürlich in winzigen Schritten an die 
Unterschiede heran tasten. Ich fürchte aber, dass dies ein Fass ohne 
Boden wird und es von viel Glück abhängt, dass er sein Projekt jemals 
fertig stellen wird.

Ich fände es schön, wenn ihr mal aufhört, so auf hochsitzcola herum zu 
hacken. Unsere Meinung zu seiner Vorgehensweise haben wir ihm längst 
deutlich genug mitgeteilt, jetzt muss auch mal gut sein.

: Bearbeitet durch User
Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Unterstützung. Ich kenne und akzeptiere den "herzlichen" 
Umgangston in diesem Forum. Bisher ist mir immer geholfen worden, da 
kann ich mit etwas Beschimpfungen gut leben :-)

Ich bin inzwischen etwas weiter, sobald man UART1 auf die alternative 
function legt, kann vom kompletten PORTB nichts mehr gelesen werden. Die 
Pins schreiben geht, auch Input Pull up / Pull down gibt den richtigen 
Pegel auf dem Pin, aber gelesen werden vom kompletten Port nur noch 
Nullen. :-(

Gruß
hochsitzcola

Autor: hochsitzcola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss mich korrigieren, das ist Port D von dem nur Nullen kommen, das 
kann bei meiner Hardware aber korrekt sein. Dafür gibt es jetzt eine 
Reaktion auf eine Pegeländerung an PB7: Der Controller hängt sich auf. 
Ich habe jetzt die Ports A bis D alle aktiviert, das scheint also einen 
Unterschied zu machen....

Gruß
hochsitzcola

Autor: hochsitzcola (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt geht es :-)

Gruß
hochsitzcola

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.