Aber damit komme ich nicht mehr durch die Initialisierung durch.
Ich habe schon rumgesucht, ob und wie HAL_TIM mit FreeRTOS verheiratet
werden kann. Aber bis jetzt bin ich damit nur gegen die Wand gelaufen.
Kann mir da eine von euch helfen?
Grüsse,
Frank
Vielleicht solltest du mal erklären, was dein Timer überhaupt machen
soll.
Ansonsten solltest du den Timer in CubeMX initialisieren, wie auch die
zugehörigen Interrupts.
Einschalten musst du den dann immer noch, aber das kannst du dann
natürlich auch innerhalb eines Task mit den HAL-Funktionen machen.
/*##-2- Start the TIM Base generation in interrupt mode ####################*/
41
/* Start Channel1 */
42
if(HAL_TIM_Base_Start_IT(&TimHandle)!=HAL_OK)
43
{
44
/* Starting Error */
45
Error_Handler();
46
}
47
}
Vertragen sich HAL Timer mit dem FreeRTOS überhaupt?
Oder kollidiert da irgendwas?
[Nachtrag] ich sehe gerade, dass ich ignoriert habe:
"- When RTOS is used, it is strongly recommended to use a HAL timebase
source other than the Systick. The HAL timebase source can be changed
from the Pinout tab under SYS"
Das blöde ist, man kann das im Nachhinein nicht mehr so einfach ändern.
Wenn die Code-Generierung dafür anläuft, dann werden relevant source
files einfach wieder überschrieben.
Frank B. schrieb:> Vertragen sich HAL Timer mit dem FreeRTOS überhaupt?>> Oder kollidiert da irgendwas?
Das hat schlicht nichts miteinander zu tun.
Du kannst die LED wahlweise via Task mit osDelay() oder über deinen
Timer-Callback blinken lassen.
Das sind aber 2 kompl. unterschiedliche Paar Schuhe.
das Programm landet im DefaultHandler weil nix ISR für TIM3 IRQ
vorhanden ist. Dank der weak Technik sucht man sich da jedesmal einen
Wolf...
füge den hinzu und siehe es blinken:
1
staticGPIO_InitTypeDefGPIO_InitStruct;
2
staticTIM_HandleTypeDefTimHandle;
3
static__IOuint32_tuwPrescalerValue=0;
4
5
/**
6
* @brief This function handles TIM3 global interrupt.
7
*/
8
voidTIM3_IRQHandler(void)
9
{
10
/* USER CODE BEGIN TIM3_IRQn 0 */
11
12
/* USER CODE END TIM3_IRQn 0 */
13
HAL_TIM_IRQHandler(&TimHandle);
14
/* USER CODE BEGIN TIM3_IRQn 1 */
15
16
/* USER CODE END TIM3_IRQn 1 */
17
}
oder wie Harry schon schrieb, besser per Cube generieren lassen.
D.h. das framework bindet da still und heimlich ein NOP ein, wenn man es
nicht definitiert? (weak)
> oder wie Harry schon schrieb, besser per Cube generieren lassen.
Das muss man aber wirklich schon von Anfang an genau und komplett
wissen, welche Resourcen man verwenden will. Nachträglich irgendetwas
ändern geht nicht, weil die Code-Generierung dann immer alles wieder
übermangelt.
- Danke!
Frank B. schrieb:> D.h. das framework bindet da still und heimlich ein NOP ein, wenn man es> nicht definitiert? (weak)
Im Startup sind die Vektoren und die Handler als weak definiert. Die
werden überschrieben wenn es andere gibt und weak verhindert dann das
der Linker meckert. Wenn der richtige Handler fehlt oder falsch
geschrieben ist oder durch C++ Kompilierung vermangelt ist, dann meckert
keiner weil das Symbol ja vorhanden ist.
Frank B. schrieb:> Nachträglich irgendetwas ändern geht nicht, weil die Code-Generierung> dann immer alles wieder übermangelt.
Doch, man muss nur brav in den User Sektionen bleiben. Vorher ein commit
ist trotzdem sicherer.
Frank B. schrieb:> Das muss man aber wirklich schon von Anfang an genau und komplett> wissen, welche Resourcen man verwenden will. Nachträglich irgendetwas> ändern geht nicht, weil die Code-Generierung dann immer alles wieder> übermangelt.
Natürlich geht das!
Du darfst, wenn du generierte Dateien ändesrt- deinen Code allerdings
nur zwischen die markierten UserCode-Sections schreiben.
Diese Teile werden beim Code-generieren nicht angefasst und bleiben
erhalten.
1
/* USER CODE BEGIN 1 */
2
3
// dein code - der bleibt erhalten
4
5
/* USER CODE END 1 */
[edit] Jojo war schneller...
[Mod-Edit: Codeformatierungstag]
Aha, die entsprechenden Kommentare schützen die Bereiche.
Ich glaube, ich sollte mir doch ein paar der online Kurs von STM antun
:-)
Vielen Dank noch einmal für eure Hilfe!
Falls noch mal jemand darüber stolpert - hier noch ein link, wie man das
mit STM32CubeIDE aufsetzt:
"Getting Started with STM32 and Nucleo Part 6: Timers and Timer
Interrupts | Digi-Key Electronics"
https://www.youtube.com/watch?v=VfbW6nfG4kw
habe ich entsprechend verschoben.
> Das osDelay in Zeile 159 kannst du löschen.> Der Teil des Code wird nie ausgeführt.
Da wird's ein bisschen philosophisch.
Ich habe das 'osDelay(1000)' entfernt, weil hier der FreeRTOS
task-manager nicht mehr läuft. Stattdessen habe ich ein
'HAL_Delay(1000);' eingebaut, weil dass ja immer noch verfügbar sein
sollte.
Wenn der code sowieso nicht läuft, warum dann die Schleife?
1
while(1){}
Und wenn schon Schleife, dann nicht als CPU consuming busy-loop.
Oder übersehe ich hier etwas?