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


von hochsitzcola (Gast)


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
}

von Regeln Erklehrbehr (Gast)


Angehängte Dateien:

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".

von hochsitzcola (Gast)


Lesenswert?

Danke Herr Lehrer, ich werd's mir merken! :-)

Gruß
hochsitzcola

von Regeln Erklehrbehr (Gast)


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

von hochsitzcola (Gast)


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

von Regeln Erklehrbehr (Gast)


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.

von hochsitzcola (Gast)


Angehängte Dateien:

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

von Stefan F. (Gast)


Lesenswert?

> vielleicht hat der eine andere Interrupt-Tabelle?!

Kannst du das nicht selber klären?

von Stefan F. (Gast)


Lesenswert?

> vielleicht hat der eine andere Interrupt-Tabelle?!

Kannst oder willst du das nicht selber klären?

von hochsitzcola (Gast)


Lesenswert?

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

Gruß
hochsitzcola

von pegel (Gast)


Lesenswert?

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

von OMG (Gast)


Lesenswert?

pegel schrieb:
> Jetzt ist Zeit auf einen echten STM32F103 umzusteigen.

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

von HierWirdDirGeholfen (Gast)


Lesenswert?

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

Dann musst du Dir eines besorgen!

von hochsitzcola (Gast)


Lesenswert?

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

Gruß
hochsitzcola

von Stefan F. (Gast)


Lesenswert?

Ohne Referenzhandbuch keine Softwareentwicklung. So ist das halt.

Punkt

von Tim K. (Gast)


Lesenswert?

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

Das ist kein Exot!

von HierWirdDirGeholfen (Gast)


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".

von hochsitzcola (Gast)


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

von OMG (Gast)


Angehängte Dateien:

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.

von hochsitzcola (Gast)


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

von OMG (Gast)


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.

von hochsitzcola (Gast)


Lesenswert?

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

von hochsitzcola (Gast)


Lesenswert?

Hmmm, open drain ist ein Ausgang, also zu früh gefreut ?!

Gruß
hochsitzcola

von OMG (Gast)


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.

von hochsitzcola (Gast)


Lesenswert?

mach ich! Sobald ich zuhause bin! :-)

Gruß
hochsitzcola

von hochsitzcola (Gast)


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

von Stefan F. (Gast)


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.

von OMG (Gast)


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.

von OMG (Gast)


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.

von Stefan F. (Gast)


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.

von hochsitzcola (Gast)


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

von OMG (Gast)


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.

von Stefan F. (Gast)


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.

von hochsitzcola (Gast)


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

von hochsitzcola (Gast)


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

von hochsitzcola (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt geht es :-)

Gruß
hochsitzcola

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.