STM32F103: bei UART1 remapped funktioniert der UART1 Interrupt nicht

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

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 #5615009
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.
Gast #5615745
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
Gast #5615800
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
Gast #5616007
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
Gast #5616103
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
Gast #5616300
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.
Gast #5616681
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
Gast #5616726
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren