STM32 Startprobleme

Gast #1038867
Lesenswert?

Hi,

also seit wenigen Tagen experimentier ich mit dem STM32-SK Board herum. 
Endlich habe ich es geschaft ein Rumpfprogramm fehlerfrei zu 
compilieren.
Wenn ich das jetzt flashen will gelange ich allerdings nie in die 
main().
Bei der Projekterstellung habe ich mich sehr an den mitgelieferten 
Beispielen orientiert und auch alle notwenigen Files includiert. Woran 
kann das liegen?
Ach und das Häckchen beim debuggen habe ich auch bei "run to main" 
gesetzt.
Sobald ich das Programm ausführe und Disassambly betrachte startet der 
Debugger sofort an irgendwelchen Speicherstellen, die ich nicht 
beeinflussen kann.

Wo ist der Fehler?

Die main.c sieht wie folgt aus :
1
 #include "stm32f10x_lib.h"                        // STM32F10x Library Definitions
2
#include <stdio.h>
3
#include "STM32_Init.h"                           // STM32 Initialization
4
#include "stm32f10x_usart.h"
5

6
//#define UART  UART_3
7
typedef unsigned int          Int32U;   // Unsigned 32 bit quantity
8

9
#define LOOP_DLY_100US  450
10

11

12
void Clk_Init (void)
13
{
14
  // 1. Clocking the controller from internal HSI RC (8 MHz)
15
  RCC_HSICmd(ENABLE);
16
  // wait until the HSI is ready
17
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
18
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
19
  // 2. Enable ext. high frequency OSC
20
  RCC_HSEConfig(RCC_HSE_ON);
21
  // wait until the HSE is ready
22
  while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
23
  // 3. Init PLL
24
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); // 72MHz
25
  RCC_PLLCmd(ENABLE);
26
  // wait until the PLL is ready
27
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
28
  // 4. Set system clock dividers
29
  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
30
  RCC_ADCCLKConfig(RCC_PCLK2_Div8);
31
  RCC_PCLK2Config(RCC_HCLK_Div1);
32
  RCC_PCLK1Config(RCC_HCLK_Div2);
33
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
34
#ifdef EMB_FLASH
35
  // 5. Init Embedded Flash
36
  // Zero wait state, if 0 < HCLK 24 MHz
37
  // One wait state, if 24 MHz < HCLK 56 MHz
38
  // Two wait states, if 56 MHz < HCLK 72 MHz
39
  // Flash wait state
40
  FLASH_SetLatency(FLASH_Latency_2);
41
  // Half cycle access
42
  FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Disable);
43
  // Prefetch buffer
44
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
45
#endif // EMB_FLASH
46
  // 5. Clock system from PLL
47
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
48
}
49

50
/*************************************************************************
51
 * Function Name: Dly100us
52
 * Parameters: Int32U Dly
53
 *
54
 * Return: none
55
 *
56
 * Description: Delay Dly * 100us
57
 *
58
 *************************************************************************/
59
void Dly100us(void *arg)
60
{
61
Int32U Dly = (Int32U)arg;
62
  while(Dly--)
63
  {
64
    for(volatile int i = LOOP_DLY_100US; i; i--);
65
  }
66
}
67

68

69
void UART_init()
70
{
71
  
72
}
73
/*************************************************************************
74
 * Function Name: main
75
 * Parameters: none
76
 *
77
 * Return: none
78
 *
79
 * Description: main
80
 *
81
 *************************************************************************/
82
void main(void)
83
{
84
GPIO_InitTypeDef GPIO_InitStructure;
85
NVIC_InitTypeDef NVIC_InitStructure;
86
#ifdef DEBUG
87
   debug();
88
#endif
89

90
  // Init clock system
91
  Clk_Init();
92

93
  // NVIC init
94
#ifndef  EMB_FLASH
95
  /* Set the Vector Table base location at 0x20000000 */
96
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
97
#else  /* VECT_TAB_FLASH  */
98
  /* Set the Vector Table base location at 0x08000000 */
99
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
100
#endif
101
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
102

103
  // Enable timer counting
104
  //TIM1_Cmd(ENABLE);
105

106

107
  UART_init();
108
  
109

110
  while(1)
111
  {
112
    
113

114
      
115
  }
116
}
117
#ifdef  DEBUG
118

119
void assert_failed(u8* file, u32 line)
120
{ 
121
  /* User can add his own implementation to report the file name and line number,
122
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
123

124
  /* Infinite loop */
125
  while (1)
126
  {
127
  }
128
}
129
#endif

MFG
Gast #1196190
Lesenswert?

Ich helfe gerne mit den STM32 zum laufen zu bringen.

Das Laden des Controllers über OpenOCD hat bei mir geklappt.
(OLIMEX STM32_P103 Board + OLIMEX ARM-USB-TINA)

Ich habe OpenOCD 0.1.0 verwendet und in einer Kommandobox mit folgenden 
Parametern gestartet:
openocd -f interface/olimex-jtag-tiny-a.cfg -f target/stm32.cfg -c init 
-c reset

Anschließend habe ich in einer zweiten Kommandobox eine 
telnet-Verbindung aufgebaut:
telnet localhost 4444
Danach konnte ich mit den folgenden Parametern ein Testprogramm in den 
Controller schreiben:
  halt
  reset
  stm32x mass_erase 0
  flash write_bank 0 
C:/STM32/Examples/Olimex/stm_p103_blink_flash/main.bin 0
Nach dem Drücken des Reset-Tasters blinkt die LED an PC12.

Habt ihr vielleicht schon ein paar Sachen für die Toolchain 
(strukturiertes makefile, Debuggen mit Eclipse)?

Wollen wir die Diskussion unter folgendem Thread fortsetzen:
Beitrag "Yagarto : Beispiel für STM32?"
Oder vielleicht einen ganz neues Thema einrichten?

Gruss, Florian
#1196282
Lesenswert?

Ich habe leider noch garnichts, hatte bis jetzt eigentlich nur mit 
kompletten IDEs zu tun. Nur habe ich gewaltige Probleme mit Crossworks 
(oder dem Debugger) und ich weiß nicht wieso. Deshalb ist bei mir der 
Wille recht groß Eclipse zum laufen zu bewegen um einen vergleich zu 
haben. Im anderen Post gibt es ja ein example zum downloaden. Im 
ST-Forum gibts auch schon StartupCode usw für STM32. Ich schlage vor 
neuen Thread aufmachen wo wir die Infos zusammentragen können.

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