Forum: Mikrocontroller und Digitale Elektronik [Cortex-M3] Problem mit dem UART


von Philipp (Gast)


Lesenswert?

Hallo,
ich setze gerade ein neues Projekt auf und bin schon am verzweifeln. Die 
Initialisierung des UART (STM32F103RB) funktioniert nicht.

Während des ladens (OLIMEX OCD mit Board von OLIMEX) kommen kurz einige 
Zeichen und dann ist Stille.

Hier der wichtigste Code.
1
int main()
2
{
3
    GPIO_InitTypeDef    GPIO_InitStructure;
4
    USART_InitTypeDef   USART_InitStructure;
5
6
    uint8_t byRecBuffer[64] = "Das ist ein Test\r\n";
7
    uint8_t byRecBufferIndex = 0;
8
9
    /* Configure the system clocks */
10
    RCC_Configuration();
11
      
12
    // Enable GPIO clock
13
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
14
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
15
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
16
17
    /* NVIC Configuration */
18
    NVIC_Configuration();
19
20
    /* Enable GPIOC clock */
21
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
22
23
    // Configure PC.12 as Output push-pull 
24
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
25
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
27
    GPIO_Init(GPIOC, &GPIO_InitStructure);
28
29
    // Tx1 as Push-Pull
30
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
31
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
32
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
33
    GPIO_Init(GPIOA, &GPIO_InitStructure);
34
35
    // Rx1 as Floating
36
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
37
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
38
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
39
    GPIO_Init(GPIOA, &GPIO_InitStructure);
40
41
    // Tx2 as Push-Pull
42
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
43
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
44
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
45
    GPIO_Init(GPIOA, &GPIO_InitStructure);
46
47
    // Rx2 as Floating
48
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
49
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
50
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
51
    GPIO_Init(GPIOA, &GPIO_InitStructure);
52
53
    // init Terminal
54
    USART_InitStructure.USART_BaudRate = 9600;
55
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
56
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
57
    USART_InitStructure.USART_Parity = USART_Parity_No;
58
    USART_InitStructure.USART_HardwareFlowControl =   USART_HardwareFlowControl_None;
59
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
60
    USART_Init(USART2, &USART_InitStructure);
61
  
62
    // enable serial
63
    USART_Cmd(USART2, ENABLE);
64
65
    // Enable the USART2 Pins Software Remapping
66
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);  
67
 
68
    while (1)
69
    {
70
      byRecBufferIndex = 0;
71
    
72
      while (byRecBufferIndex < strlen(byRecBuffer))
73
      {
74
        /* Wait until end of transmit */
75
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)== RESET);
76
77
        /* Write one byte in the USARTz Transmit Data Register */
78
        USART_SendData(USART2, byRecBuffer[byRecBufferIndex++]);
79
      }
80
    }
81
 
82
    return 0;
83
}

Schon mal Danke fürs ansehen.

Philipp

von Tartaruga (Gast)


Lesenswert?

Hi

Hast du das Problem schon gelöst? Ich steh jetzt nämlich vor den selben 
Problem. Vielleicht hast du ja einen Tipp ??

Lg

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Auf ersten Blick sollte das funktionieren, weiß allerdings nichts über
RCC_Configuration();
Am besten die Geschichte auf dauersenden stellen (z. B. 0xAA senden) und 
mit dem Oszi mal die Baudrate kontrollieren.

Grüße

von KeinPlan (Gast)


Lesenswert?

Versuch mal ob es was bringt, das Remap vor der GPIO PIN Config 
auszuführen.

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hi
Ich hab folgenden Code verwendet. Die Funktionen sind eh von der 
standard library von stm.
1
int main(void){
2
3
USART_InitTypeDef USART_InitStructure;
4
uint8_t TxBuffer[] = "AT\n";
5
uint8_t RxBuffer[RxBufferSize];
6
uint8_t NbrOfDataToTransfer = TxBufferSize;
7
uint8_t TxCounter = 0;
8
uint8_t RxCounter = 0;
9
10
/*RCC Configuration*/
11
{//start RCCConfig
12
  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  
13
     initialize the PLL and update the SystemFrequency variable. */
14
  SystemInit();
15
    
16
  /* Enable GPIOx and AFIO clocks */
17
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
18
19
  /* Enable USART2 clocks */
20
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
21
}//end RCCConfig
22
23
/*GPIO Configuration*/
24
{//start GPIOConfig
25
26
GPIO_InitTypeDef GPIO_InitStructure;
27
28
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
29
30
  /* Configure USART2 RTS and USART2 Tx as alternate function push-pull */
31
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
32
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
33
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
34
  GPIO_Init(GPIOA, &GPIO_InitStructure);
35
36
  /* Configure USART2 CTS and USART2 Rx as input floating */
37
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
38
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
39
  GPIO_Init(GPIOA, &GPIO_InitStructure);
40
41
}//end GPIOConfig
42
43
/*LastUartConfiguration*/
44
45
{//start LastUartConfig
46
47
  USART_InitStructure.USART_BaudRate = 115200;
48
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
49
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
50
  USART_InitStructure.USART_Parity = USART_Parity_No;
51
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
52
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //Receive and transmit is enabled
53
54
  USART_Init(USART2, &USART_InitStructure);
55
  USART_Cmd(USART2, ENABLE);
56
}//end LastUartConfig
57
58
59
while(1)//(NbrOfDataToTransfer--)
60
  {
61
    USART_SendData(USART2, (uint16_t)0xAA);
62
  //USART_SendData(USART2, TxBuffer[TxCounter++]);
63
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);          
64
  }
65
  
66
  /* Receive a string (Max RxBufferSize bytes) 
67
  do
68
  { 
69
    if((USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)&&(RxCounter < RxBufferSize))
70
    {
71
       RxBuffer[RxCounter] = USART_ReceiveData(USART2);
72
       //USART_SendData(USART2, RxBuffer[RxCounter++]);
73
    }   
74
 
75
  }
76
  while((RxBuffer[RxCounter - 1] != '\n')&&(RxCounter != RxBufferSize));
77
78
  while (1)
79
  {
80
  }
81
82
83
84
85
}//end main

Ich was ich nciht verstehe ist warum in der Funktion 
"USART_SendData(USART2, (uint16_t)0xAA)"
1
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
2
{
3
  /* Check the parameters */
4
  assert(IS_USART_ALL_PERIPH(USARTx));
5
  assert(IS_USART_DATA(Data)); 
6
    
7
  /* Transmit Data */
8
  USARTx->DR = Data;//(Data & (uint16_t)0x01FF);

wird bei der Zuweisung an das USARTx->DR nichts hineingeschrieben. Also 
wenn ich beim Debuggen einen schritt drüber bin dann hat das Register 
keinen Wert. Anbei hänge ich noch ein Bild von meinen Einstellungen an. 
Da ist auch zu sehen dass das Register leer ist :-(

Ich hoffe es kann mir wer weiterhelfen

danke schon mal im Vorraus

Lg
Markus

von (prx) A. K. (prx)


Lesenswert?

Offen hängender Kommentar.

Da DR eigentlich 2 Register darstellt, eines pro Richtung, und ausserdem 
der Inhalt der sendenden Richtung u.U. sofort ins Schieberegister 
wandert, hat ein Debugger Probleme, den Inhalt wie von dir erwartet 
anzuzeigen.

Manche Pins mit mehreren Zusatzfunktionen sind etwas verknotet. Siehe 
Errata.

von Markus (Gast)


Lesenswert?

OK verstehe... Ich hab aber den Pin schon ans Oszi gehängt so wie es 
schon vorgeschlagen worden ist und ich musste leider feststellen das der 
Tx Pin auf +2,5 V geschalten wird.

von Random .. (thorstendb) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi Leutz,

hier mal das ganze ohne dieses DriverLibGeraffel. Da hat man immer 
Probleme, wenn was nicht funzt und muss doch auf die Regs runter.
Daher nutze ich die DLs nur als Example - mehr nicht.


VG,
/th.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Du remapst Uart2, da werden doch die Pins PD5/6 verwendet, die du aber 
nicht konfigurierst. Mach das mal.

Grüße Gebhard

von Random .. (thorstendb) Benutzerseite


Lesenswert?

ei ...
so viele Downloads - any comments?

VG,
/th.

von (prx) A. K. (prx)


Lesenswert?

Markus schrieb:

> schon vorgeschlagen worden ist und ich musste leider feststellen das der
> Tx Pin auf +2,5 V geschalten wird.

Das klingt eher so, als würde an dem Pin überhaupt nichts verschaltet, 
denn 2,5V ist bei nicht exzessiver Last nix Halbes und nix Ganzes, 
jedenfalls bei 3,3V Versorgung.

Passt auch zum Code. Du konfigurierst die standardmässigen GPIO Pins auf 
PORTA für UART2, leitest UART2 aber auf die alternativen abgeschalteten 
PORTD Pins um. Willst du die nun auf PORTA (dann lass den Remap weg) 
oder auf PORTD (dann konfiguriere die richtigen Portpins)?

von (prx) A. K. (prx)


Lesenswert?

Random ... schrieb:
> Hi Leutz,
>
> hier mal das ganze ohne dieses DriverLibGeraffel. Da hat man immer
> Probleme, wenn was nicht funzt und muss doch auf die Regs runter.
> Daher nutze ich die DLs nur als Example - mehr nicht.

In USART*_IRQHandler
1
volatile unsigned int IIR;
2
...
3
USART1->SR &= ~USART_FLAG_RXNE;         // clear interrupt
4
u1_rxBuffer_putchar(USART1->DR & 0xFF); // write buffer
wird das RXNE Bit vom Lesen von DR automatisch kassiert, muss also nicht 
explizit gelöscht werden. Und das volatile ist für solche lokale 
Variablen überflüssig (ziemlich ineffizient).

von Random .. (thorstendb) Benutzerseite


Lesenswert?

g ist irgendein rest, der mal übriggeblieben ist, den ich dann in die 
Fkt geschrumpft, aber nicht komplett angepasst hab ^^

von Markus (Gast)


Lesenswert?

Eigentlich will ich den UART 2 schon auf Port A ausgeben. Vorallem weil 
der Port D bei meine Eval Board (STM32-H103) nicht rausgeführt wird.

Also wenn ich das Remap weglasse dann wird nach dem Senden des 1. 
Zeichens das USART_FLAG_TXE Flag nicht mehr auf SET geschalten die 
Abfrage ist dann quasi eine endless loop

Lg

Danke Random ... für deinen Code... hab leider jetzt erst am Abend Zeit 
mit das anzusehen

von DrMaex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, bin gerade auch damit beschäftigt mit dem STM32-H103 Board 
Zeichen über den USART zu schicken und wollte fragen ob es jetzt einem 
hier gelungen ist und welche Einstellungen dazu vorgenommen werden 
müssen.
Mit Hilfe von "A.K." habe ich es zwar geschafft überhaupt Etwas heraus 
zu schicken aber es ist auf keinem Fall das, was ich schicken will. Am 
Hyperterminal empfange ich nur Smilies, Dreiecke und so weiter. Advanced 
Serial Port Monitor weigert sich komplett was zu empfangen......habe die 
main.c angehänt.
Was mir im Moment auch nicht klar ist, warum meine LED durchgehend 
leuchtet....theoretisch sollte da ein deutlich wahrnehmbares Blinken 
vorhanden sein...


Vielen Dank im Voraus


Max

von (prx) A. K. (prx)


Lesenswert?

DrMaex schrieb:

> zu schicken aber es ist auf keinem Fall das, was ich schicken will. Am
> Hyperterminal empfange ich nur Smilies, Dreiecke und so weiter.

Wetten dass die Bitrate falsch ist? Da die Lib zwar umständlich aber 
richtig rechnet, geht sie vermutlich von einer falschen Annahme über den 
Takt des betreffenden APB Busses aus.

von DrMaex (Gast)


Lesenswert?

Hmm also ehrlich gesagt stehe ich etwas auf dem Schlauch....
habe die clk_Init() etwas verändert was allerdings keine Veränderung 
gebracht hat...ich schildere meinen Gedankengang bzw. Interpretation:
1
void Clk_Init (void)
2
{
3
 //Internen Oscillator starten (8 MHz)
4
  RCC_HSICmd(ENABLE);
5
 
6
 // warten bis fertig
7
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
8
9
  //Systemtak von internen Oscillator antreiben
10
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
11
  
12
// Externen Oscillarot starten (8MHZ)
13
  RCC_HSEConfig(RCC_HSE_ON);
14
15
  // warten bis fertig
16
  while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
17
18
  // 3.PLL initialisieren mit 8 MHz*9=72 MHz
19
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
20
  
21
//PLL aktivieren
22
  RCC_PLLCmd(ENABLE);
23
24
  // warten bis fertig
25
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
26
27
//KEINE AHNUG WAS DIESE ZEILE MACHT  
28
// Flash 1 wait state
29
  *(vu32 *)0x40022000 = 0x12;
30
31
 //Systemtak von PLL antreiben ->System läuft mit 72 MHz
32
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
33
34
//warten bis Systemtakt-Herkunft übernommen wurde
35
  while(RCC_GetSYSCLKSource() != 0x08)
36
  {
37
  }
38
39
  // Takte für die Peripherie setzen
40
41
//AHB Takt (HCLR) 72 MHz 
42
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
43
44
//USb Takt 72/1.5=48 MHz
45
  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
46
47
// APB2 takt 72 MHz (Dieser Takt treibt u. A. den USART1 an)
48
  RCC_PCLK2Config(RCC_HCLK_Div1);
49
50
//APB1 Takt 72/2=36 MHz (u. A. USART2,USART3)
51
  RCC_PCLK1Config(RCC_HCLK_Div2);
52
53
//ADC Takt (APB2)/8=9MHz
54
  RCC_ADCCLKConfig(RCC_PCLK2_Div8);
55
}
Also demnach sollte der uC keine Annahmen mehr beim Ausrechnen der 
Baud-Rate machen..... es kommen aber immer noch keine richtigen Zeichen 
an. Habe vorläufig kein Hyperterminal zuhause, aber sowohl Tera-Term als 
Advanced Serial Port Monitor zeigen keine gescheiten Zeichen an. Auch 
ein Atmel328(Arduino) dessen RX auf TX umgeleitet wird kann die Daten 
nicht interpretieren die aus dem Pin des STM32 rauskommen. Wo steckt 
mein Denkfehler??

Danke


Gruß
Max

von (prx) A. K. (prx)


Lesenswert?

Welche Möglichkeiten des Debuggings stehen dir zu Verfügung? Mit Oszi 
kannst du feststellen, was tatsächlich an Baudrate aus der UART 
rauskommt. Mit JTAG kannst du dir ansehen, was der Lib-Code als 
Taktfrequenz annimmt - da gibt's ein paar Variablen zu, eine davon 
verwendet die Lib für die Baudratendefinition. Vielleicht stimmt das 
nicht überein - z.B. mit 8MHz Quarz gerechnet und 12MHz sind drin.

Alternativ kannst du mal den Quarz ignorieren und ohne PLL auf Basis des 
HSI arbeiten. Für den ersten Test ist der genau genug. Nur muss auch 
dann die Angabe der Taktfrequenz irgendwo im Programm oder Projekt einen 
gewissen Bezug zur Realität haben.

von DrMaex (Gast)


Angehängte Dateien:

Lesenswert?

Hab jetzt versucht nur dem dem HSI Clock zu arbeiten.
In der „stm32f10x_rcc.h“ steht
1
/* Typical Value of the HSI in Hz */
2
#define HSI_Value                 ((u32)8000000)
Meine Konfiguration der Takte schaut folgendermaßen aus:
1
void Clk_Init (void)
2
{
3
  // 1. Clocking the controller from internal HSI RC (8 MHz)
4
  RCC_HSICmd(ENABLE);
5
  // wait until the HSI is ready
6
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
7
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
8
  while(RCC_GetSYSCLKSource() != 0x00)
9
    {
10
    }
11
  // 2. Enable ext. high frequency OSC
12
 // RCC_HSEConfig(RCC_HSE_ON);
13
  // wait until the HSE is ready
14
  //while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
15
  // 3. Init PLL
16
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); // 36 MHz
17
  RCC_PLLCmd(ENABLE);
18
  // wait until the PLL is ready
19
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
20
  // 4. Set system clock divders
21
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
22
  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
23
  RCC_ADCCLKConfig(RCC_PCLK2_Div8);
24
  RCC_PCLK2Config(RCC_HCLK_Div1);
25
  RCC_PCLK1Config(RCC_HCLK_Div2);
26
  // Flash 1 wait state
27
  //*(vu32 *)0x40022000 = 0x12;
28
  // 5. Clock system from PLL
29
  //RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
30
  //while(RCC_GetSYSCLKSource() != 0x08)
31
  //{
32
  //}
33
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
34
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA,    ENABLE);
35
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);}

In der “stm32f10x_usart.c” wird die Baudrate folgendermaßen Verarbeitet
1
/*---------------------------- USART BRR Configuration -----------------------*/
2
  tmpreg = 0x00;
3
4
  /* Configure the USART Baud Rate -------------------------------------------*/
5
  RCC_GetClocksFreq(&RCC_ClocksStatus);
6
  if ((*(u32*)&USARTx) == USART1_BASE)
7
  {
8
    apbclock = RCC_ClocksStatus.PCLK2_Frequency;
9
  }
10
  else
11
  {
12
    apbclock = RCC_ClocksStatus.PCLK1_Frequency;
13
  }
14
15
  /* Determine the integer part */
16
  integerdivider = ((0x19 * apbclock) / (0x04 * (USART_InitStruct->USART_BaudRate)));
17
  tmpreg = (integerdivider / 0x64) << 0x04;
18
19
  /* Determine the fractional part */
20
  fractionaldivider = integerdivider - (0x64 * (tmpreg >> 0x04));
21
  tmpreg |= ((((fractionaldivider * 0x10) + 0x32) / 0x64)) & ((u8)0x0F);
22
23
  /* Write to USART BRR */
24
  USARTx->BRR = (u16)tmpreg;
25
}

Mit der Berechnung selbst kann ich leider nichts anfangen.
Wenn ich probiere das Programm zu debuggen sehe ich folgendes 
(Screenshot im Anhang siehe oben)
Ich vermute das ist genau die Variable die als Baudrate ins Register 
geschrieben wird…

Ich bin langsam am verzweifeln…

Mal eine andere Frage bezüglich des Flashens und der Hardware 
Konfiguration vielleicht liegt da der Hund begraben:
Also was mich als erstes etwas stutzig macht ist anscheinend braucht ja 
die RS232 +-12 Volt als Pegel, mein TX Pin liegt aber bei 3.26 
Volt.(Direkt auf Com Verbunden)
Beim Kompilieren geht soweit alles glatt
1
**** Build of configuration Debug for project stm_h103 ****
2
make all 
3
.compiling
4
arm-none-eabi-gcc -I./ -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb  main.c
5
.compil
6
arm-none-eabi-gcc -I./ -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb  stm32f10x_rcc.c 
7
.compili
8
arm-none-eabi-gcc -I./ -c -fno-common -O0 -g -mcpu=cortex-m3 -mthumb  stm32f10x_gpio.c 
9
..linking
10
arm-none-eabi-ld -v -Tstm_h103_blink_rom.cmd -nostartfiles -o main.out  main.o stm32f10x_rcc.o stm32f10x_gpio.o 
11
GNU ld (Sourcery G++ Lite 2008q1-126) 2.18.50.20080215
12
...copying
13
arm-none-eabi-objcopy -Obinary main.out main.bin
14
arm-none-eabi-objdump -S main.out > main.list
Beim Flashen iritiren mich die Meldungen ala “not enough working area 
available“
1
Warning: /cygdrive/C/gccfd/projects/stm_h103/Release: No such file or directory.
2
Warning: /cygdrive/C/gccfd/projects/stm_h103: No such file or directory.
3
mi_cmd_break_watch: Missing <expression>
4
No registers.
5
target remote localhost:3333
6
main () at main.c:45
7
45  {
8
symbol-file main.out
9
monitor soft_reset_halt
10
requesting target halt and executing a soft reset
11
monitor flash erase_sector 0 0 31
12
erased sectors 0 through 31 on flash bank 0 in 1.031303s
13
monitor flash write_image main.bin 0x08000000 bin
14
not enough working area available(requested 8192, free 8144)
15
wrote 7120 byte from file main.bin in 0.875045s (7.946020 kb/s)
16
thbreak main
17
Hardware assisted breakpoint 1 at 0x8e8: file main.c, line 49.
18
cont
19
main () at main.c:49
20
49      Clk_Init();
21
mi_cmd_var_create: unable to create variable object
22
mi_cmd_var_create: unable to create variable object
23
mi_cmd_var_create: unable to create variable object
24
mi_cmd_var_create: unable to create variable object
25
mi_cmd_disassemble: Invalid filename.

Ist das normal?

Tut mir leid wegen des langen Beitrags…


Danke

Gruß
Max

von (prx) A. K. (prx)


Lesenswert?

Man kann sich auch von hinten durch die Brust ins Auge stechen. Wenn du 
dir die komplette Taktprogrammierung einsparst läuft IMHO alles auf 
HSI=8MHz. Auf was denn sonst ;-).

Den Baudratenteiler programmiert man trivialerweise so:
 UARTx->BRR = APBx-Takt / Baudrate;
Dass man sich das Leben auch schwerer machen kann beweist die Lib.

von DrMaex (Gast)


Lesenswert?

Also scheint es alles zwar kompliziert programmiert zu sein sollte aber 
dennoch funktionieren....was heute einem Kumpel aufgefallen ist, ist, 
dass der uC selbst sehr heisst wird, nicht lauwarm,  heiss! Man kann den 
Finger nicht dran lassen, ich mein ok das Ding ist ziemlich schnell und 
die LED blinkt fleissig weiter aber hmmm.... leider habe ich keinen 
Thermometer zur Hand deswegen die Frage, ist das normal?

p.s. meinst du dass man bereits nach
1
RCC_HSICmd(ENABLE);
2
  // wait until the HSI is ready
3
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
4
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
5
  while(RCC_GetSYSCLKSource() != 0x00)
6
    {
7
    }
aufhören könnte und die Peripherie Teiler und Takte bekommen 
irgendwelche Default-Werte verpasst?


Danke

Gruß
Max

von (prx) A. K. (prx)


Lesenswert?

DrMaex schrieb:

> p.s. meinst du dass man bereits nach
> aufhören könnte und die Peripherie Teiler und Takte bekommen
> irgendwelche Default-Werte verpasst?

Nicht nur dies.

Hast du schon einmal einen Prozessor gesehen, der gänzlich ohne Takt 
seine Befehle ausführt? (für Experten: ja, ich weiss das es das gibt, 
aber der hier gehört nicht dazu).

Wenn du dir das nicht vorstellen kannst, dann überleg mal, oder noch 
besser schau nach, mit welchem Takt der STM32 den obigen Code nach dem 
Reset auszuführen beginnt.

von (prx) A. K. (prx)


Lesenswert?

DrMaex schrieb:

> dass der uC selbst sehr heisst wird, nicht lauwarm,  heiss! Man kann den
> Finger nicht dran lassen,

Ganz ganz schlecht. Sollte nicht spürbar warm werden.

von DrMaex (Gast)


Lesenswert?

Ne, klar ohne Takt wäre es schwierig aber nachdem ich gesehen hatte was 
man da einstellen kann habe ich dem ARM einfach alles zugetraut :) Bzw. 
halt zumindest, dass die Peripherie nicht ohne explizite Angaben zum 
Takt funktioniert.
Beschäftige mich erst seit kurzem mit uC und habe die ganzen Strukturen 
noch nicht ganz verinnerlicht und lerne die Sachen eher bei Bedarf, nur 
dann kann ich erst den nötigen Ehrgeiz aufbringen. Einfach so ohne 
Anwendung schalte ich viel zu schnell auf Durchzug....
Da sich jetzt der Verdacht, dass ein heisser Prozessor nicht gut ist, 
bestätigt werde ich wahrscheinlich die Arbeiten an dem STM32-H103 Board 
einstellen und mich nach Alternativen umschauen...
Vielen Dank für die Hilfe!


Gruß
Max

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.