Hallo zusammen,
entweder bin ich doof und übersehe etwas, aber ich bekomme es nicht hin,
vernünftig die Timer beim STM32 zu berechnen.
Kleines Beispiel wie ich vorgegangen bin:
Ich möchte gerne einen Sekundentimer konfigurieren. Dafür nehme ich auf
einen STM32F446 den TIM3. Das Updateevent berechnet sich wie folgt:
UPDATEEVENT = F_CLOCK/((PSC+1)*(PERIOD+1))
Der TIM3 liegt auf ABP1, welcher mit 90 MHz versorgt wird. Um also ein
Updateevent auszulösen ist meine Berechnung wie folgt:
UPDATEEVENT = 90000000/((44999+1)*(1999+1)) = 1 s
So habe ich es programmiert:
1 | void MX_TIM3_Init(void){
|
2 | TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
3 | TIM_MasterConfigTypeDef sMasterConfig = {0};
|
4 |
|
5 | htim3.Instance = TIM3;
|
6 | htim3.Init.Prescaler = 44999;
|
7 | htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
8 | htim3.Init.Period = 1999+1;
|
9 | htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
10 | htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
11 | if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
12 | {
|
13 | Error_Handler();
|
14 | }
|
15 | sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
16 | if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
|
17 | {
|
18 | Error_Handler();
|
19 | }
|
20 | sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
21 | sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
22 | if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
|
23 | {
|
24 | Error_Handler();
|
25 | }
|
26 | }
|
Okay und nun meine delay-funktion
[c]
void delay_s(volatile uint32_t seconds){
__HAL_TIM_SetCounter(&htim3,0);
while(__HAL_TIM_GET_COUNTER(&htim3)<seconds);
}
[\c]
In der main habe ich den Timer eingeschaltet
(HAL_TIM_Base_Start(&htim3))
Was ich verstanden habe:
Prescaler ist der Divisor mit welcher dieser heruntergeteilt wird. Ist
dieser 16 Bit ist der Maximalwert 2^16 also 65536. Die Periode ist der
Maximalwert bevor der Timer reloaded wird.
Alle anderen Timer stimmen, auch die Funktion HAL_Delay(1) gibt exakt 1
ms aus.
Wie werden die Timer berechnet?