STM32F103: bei UART1 remapped funktioniert der UART1 Interrupt nicht

Gast #5614819
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

1
/*************************
2
 * stm32 uart main.c
3
 *************************/
4

5
#include "stm32f10x.h"
6
#include "print.h"
7

8

9
/* User defined function prototypes */
10
void GPIOB_Init(void);
11
void USART1_Init(void);
12
void led_toggle(void);
13

14

15
int main(void)
16
{
17
    /* Initialize GPIOA PIN8 */
18
    GPIOB_Init();
19
    /* Initialize USART1 */
20
    USART1_Init();
21
    printf_("Hello World");
22
   // USART_SendData(USART1, 'T');
23

24
    while(1)
25
    {
26
      //USART_SendData(USART1, 'T');  /* Do nothing, all happens in ISR */
27
    }
28
}
29

30
/***********************************************
31
 * Initialize GPIOA PIN8 as push-pull output
32
 ***********************************************/
33
void GPIOB_Init(void)
34
{
35
    /* Bit configuration structure for GPIOA PIN8 */
36
    GPIO_InitTypeDef gpiob_init_struct = { GPIO_Pin_2, GPIO_Speed_50MHz,
37
                                           GPIO_Mode_Out_PP };
38

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

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

48
/*****************************************************
49
 * Initialize USART1: enable interrupt on reception
50
 * of a character
51
 *****************************************************/
52
void USART1_Init(void)
53
{
54
    /* USART configuration structure for USART1 */
55
    USART_InitTypeDef usart1_init_struct;
56
    /* Bit configuration structure for GPIOB PIN6 and PIN7 (alternative function) */
57
    GPIO_InitTypeDef gpiob_init_struct;
58
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
59
    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
60

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

63

64
    /* GPIOB PIN6 alternative function Tx */
65
    gpiob_init_struct.GPIO_Pin = GPIO_Pin_6;
66
    gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
67
    gpiob_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
68
    GPIO_Init(GPIOB, &gpiob_init_struct);
69
    /* GPIOB PIN7 alternative function Rx */
70
    gpiob_init_struct.GPIO_Pin = GPIO_Pin_7;
71
    gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
72
    gpiob_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
73
    GPIO_Init(GPIOB, &gpiob_init_struct);
74

75
    /* Enable USART1 */
76
    USART_Cmd(USART1, ENABLE);
77
    /* Baud rate 9600, 8-bit data, One stop bit
78
     * No parity, Do both Rx and Tx, No HW flow control
79
     */
80
    usart1_init_struct.USART_BaudRate = 9600;
81
    usart1_init_struct.USART_WordLength = USART_WordLength_8b;
82
    usart1_init_struct.USART_StopBits = USART_StopBits_1;
83
    usart1_init_struct.USART_Parity = USART_Parity_No ;
84
    usart1_init_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
85
    usart1_init_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
86
    /* Configure USART1 */
87
    USART_Init(USART1, &usart1_init_struct);
88
    /* Enable RXNE interrupt */
89
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
90
    /* Enable USART1 global interrupt */
91
    
92
    NVIC_EnableIRQ(USART1_IRQn);
93

94

95

96
}
97

98
/*******************************************
99
 * Toggle LED
100
 *******************************************/
101
void led_toggle(void)
102
{
103
    /* Read LED output (GPIOA PIN8) status */
104
    uint8_t led_bit = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2);
105

106
    /* If LED output set, clear it */
107
    if(led_bit == (uint8_t)Bit_SET)
108
    {
109
        GPIO_ResetBits(GPIOB, GPIO_Pin_2);
110
    }
111
    /* If LED output clear, set it */
112
    else
113
    {
114
        GPIO_SetBits(GPIOB, GPIO_Pin_2);
115
    }
116
}
117

118
/**********************************************************
119
 * USART1 interrupt request handler: on reception of a
120
 * character 't', toggle LED and transmit a character 'T'
121
 *********************************************************/
122
void USART1_IRQHandler(void)
123
{
124
    /* RXNE handler */
125
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
126
    {
127
        /* If received 't', toggle LED and transmit 'T' */
128
        if((char)USART_ReceiveData(USART1) == 't')
129
        {
130
            led_toggle();
131
            USART_SendData(USART1, 'T');
132
            /* Wait until Tx data register is empty, not really
133
             * required for this example but put in here anyway.
134
             */
135
            /*
136
            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
137
            {
138
            }*/
139
        }
140
    }
141

142
    /* ------------------------------------------------------------ */
143
    /* Other USART1 interrupts handler can go here ...             */
144
}
Gast #5614852
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".
Angehängte Dateien:
Gast #5614959
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
Gast #5614992
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
Gast #5615009
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.
Gast #5615723
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".
Gast #5615745
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
Gast #5615800
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
Gast #5615828
Ah, mir geht grad auf, daß ich Rx nicht als alternative function 
definiert hab:
1
gpiob_init_struct.GPIO_Mode = GPIO_Mode_AF_OD;

Mal schauen ob es daran liegt ;-)

Gruß
hochsitzcola
Gast #5616095
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.
Gast #5616103
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
Gast #5616163
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.
Gast #5616300
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.
Gast #5616681
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
Gast #5616726
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.