Forum: Mikrocontroller und Digitale Elektronik Hard Fault STM32F103 beim Takteinstellen


von Vincent (Gast)


Lesenswert?

Hallo,

ich versuche den Takt von einem STM32F103 µController auf 48MHz 
einzustellen. Es klappt leider nicht.

Wenn ich die Funktion System_Clock_Setup() bei der Initialisierung 
aufrufe, geht das in die Hard Fault. Weiss jemand zufällig woran es 
liegt?

Danke im Voraus.

Debugger Ausgabe:
1
Hello ARM World!
2
[HardFault]
3
Stack frame:
4
 R0 =  00000000
5
 R1 =  40061020
6
 R2 =  40021000
7
 R3 =  080018F9
8
 R12 = 01010101
9
 LR =  08000BAB
10
 PC =  08000A8E

Der Quellcode:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include "diag/Trace.h"
4
#include "stm32f10x.h"
5
#include "cortexm/ExceptionHandlers.h"
6
7
8
#define GPIOB_LED GPIO_Pin_2
9
#define GPIOC_BZZ GPIO_Pin_13
10
11
#define TIMER_FREQUENCY_HZ (1000u)
12
13
14
volatile uint32_t timer_delayCount;
15
16
void Delay(uint32_t ticks);
17
void TimingDelay_Decrement(void);
18
19
20
void System_Clock_Setup(void);
21
22
#pragma GCC diagnostic push
23
#pragma GCC diagnostic ignored "-Wunused-parameter"
24
#pragma GCC diagnostic ignored "-Wmissing-declarations"
25
#pragma GCC diagnostic ignored "-Wreturn-type"
26
27
void System_Clock_Setup(void) {
28
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); // 48MHz
29
  RCC_PLLCmd(ENABLE);
30
31
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
32
  }
33
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
34
35
  /* Set HCLK, PCLK1, and PCLK2 to SCLK (these are default */
36
  RCC_HCLKConfig(RCC_SYSCLK_Div1); // 48 MHz
37
  RCC_PCLK1Config(RCC_HCLK_Div2);  // APB1 24MHz, max 36MHz
38
  RCC_PCLK2Config(RCC_HCLK_Div1);  // APB2 48MHz
39
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);  // 48MHz/4 = 12MHz
40
41
  RCC_ClocksTypeDef clocks;
42
  RCC_GetClocksFreq(&clocks);
43
  SysTick_Config(clocks.SYSCLK_Frequency / 100000); //10us
44
}
45
46
int main(int argc, char* argv[]) {
47
48
  trace_puts("Hello ARM World!");
49
50
51
  //SysTick_Config(SystemCoreClock / TIMER_FREQUENCY_HZ);
52
  System_Clock_Setup();
53
54
  trace_printf("System clock: %u Hz\n", SystemCoreClock);
55
56
  // Enable GPIO Peripheral clock
57
  /* GPIOA GPIOB and GPIOC clock enable */
58
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
59
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
60
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
61
62
  GPIO_InitTypeDef GPIO_InitStructure;
63
64
  /* PB2 LED configuration */
65
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
66
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
67
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
68
  GPIO_Init(GPIOB, &GPIO_InitStructure);
69
70
  /* PC13 Buzzer configuration */
71
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
72
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
73
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
74
  GPIO_Init(GPIOC, &GPIO_InitStructure);
75
76
  uint32_t seconds = 0;
77
78
  GPIO_SetBits(GPIOB, GPIOB_LED);
79
  GPIO_SetBits(GPIOC, GPIOC_BZZ);
80
  // Infinite loop
81
  while (1) {
82
    Delay(100);
83
84
    GPIOC->ODR ^= GPIOC_BZZ; // Toggle Buzzer
85
    GPIOB->ODR ^= GPIOB_LED; // Toggle LED
86
87
    Delay(100);
88
89
    ++seconds;
90
91
    // Count seconds on the trace device.
92
    trace_printf("Second %u\n", seconds);
93
  }
94
}
95
96
void Delay(uint32_t ticks) {
97
  timer_delayCount = ticks;
98
  while (timer_delayCount != 0u)
99
    ;
100
}
101
102
void TimingDelay_Decrement(void) {
103
  if (timer_delayCount != 0u) {
104
    --timer_delayCount;
105
  }
106
}
107
108
void SysTick_Handler(void) {
109
  TimingDelay_Decrement();
110
}
111
112
#pragma GCC diagnostic pop

von Stefan F. (Gast)


Lesenswert?

Du hast vergessen, Wait States für den Flash Zugriff einzustellen.
Siehe http://stefanfrings.de/stm32/index.html#takt

von Vincent (Gast)


Lesenswert?

Stefan U. schrieb:
> Du hast vergessen, Wait States für den Flash Zugriff einzustellen.
> Siehe http://stefanfrings.de/stm32/index.html#takt

Danke!!

mit
1
  FLASH_SetLatency(FLASH_Latency_2);
 gehts.

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.