Moin Moin,
ich bin am verzweiflen.. bitte helft mir ;-)
Aber nun erstmal zu meinem Problem: Ich habe ein laufendes STM32, das
ich im Atollic TrueStudio Lite geschrieben habe (Der Prozessor ist ein
STM32F103RBT6). Das bedeutet also ich habe ein funktionierendes Linker
file und ein startup file.
Da mein Projekt immer komplexer wird, habe ich mir überlegt doch ein
Betriebssystem einzusetzen -> FreeRTOS.
Aus den vorhandenen Beispielprojekten habe ich mir ein ganz neues leeres
Projekt zusammengeschustert, in dem ich über einen xTimer eine LED
blinken lasse. Das funktioniert.
Ich benötige aber außerdem einen Hardware Timer, der mir mit 80 kHz
einen Interrupt erzeugt. Im alten Projekt lief dieser bereits, doch nun
habe ich das folgende Problem (erstmal der Code):
1 | /* PCLK1 = HCLK/2 = 36 MHz */
|
2 | RCC_PCLK1Config(RCC_HCLK_Div2);
|
3 |
|
4 | /* PCLK2 = HCLK = 72 MHz */
|
5 | RCC_PCLK2Config(RCC_HCLK_Div1);
|
6 |
|
7 | /* ADCCLK = PCLK2/6 = 72 MHz/6 = 12 MHz */
|
8 | RCC_ADCCLKConfig(RCC_PCLK2_Div6);
|
9 |
|
10 | /* GPIO clock enable */
|
11 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
|
12 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
13 |
|
14 | /* TIM2 clock enable */
|
15 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
16 |
|
17 | /* ADC1 clock enable */
|
18 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
|
19 |
|
20 | /* ADC2 clock enable */
|
21 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
28 |
|
29 | /************************************************/
|
30 | /* TIM2: 80 kHz */
|
31 | /************************************************/
|
32 |
|
33 | /* Initialise data. */
|
34 | TIM_DeInit(TIM2);
|
35 |
|
36 | TIM_TimeBaseStructure.TIM_Period = 900;
|
37 | TIM_TimeBaseStructure.TIM_Prescaler = 0;
|
38 | TIM_TimeBaseStructure.TIM_ClockDivision = 0;
|
39 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
40 | TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | NVIC_InitTypeDef NVIC_InitStructure;
|
46 |
|
47 | #ifdef VECT_TAB_RAM
|
48 | /* Set the Vector Table base location at 0x20000000 */
|
49 | NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
|
50 | #else /* VECT_TAB_FLASH */
|
51 | /* Set the Vector Table base location at 0x08000000 */
|
52 | NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
|
53 | #endif
|
54 |
|
55 | /* Ensure that all 4 interrupt priority bits are used as the pre-emption priority. */
|
56 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
57 |
|
58 | /* Configure the TIM2 global interrupts (80 kHz) */
|
59 | NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
|
60 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (configMAX_SYSCALL_INTERRUPT_PRIORITY >> 4) + 1;
|
61 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
62 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
63 | NVIC_Init(&NVIC_InitStructure);
|
64 |
|
65 | /* TIM2 enable overflow interrupt */
|
66 | TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
|
Drumrum läuft gar kein Code mehr, alles auskommentiert. Wenn ich mit dem
Debugger durch das Programm steppe, stürzt es genau in der Zeile
1 | TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
|
ab und landet in der Default_Handler Routine in meinem Startup Code.
Ich habe jetzt schon an allen Schrauben rumgeschraubt ;) Ich hatte es in
Erwägung gezogen, dass mit den Interrupt Prioritäten was nicht stimmt,
wobei ich jetzt nicht mehr daran glaube. Dann habe ich überlegt, dass
vielleicht der Interrupt Handler nicht gefunden werden kann, also die
IVT vielleicht falsch ist. Aber mein Startup Code und auch mein Linker
File laufen ja im anderen Projekt, wo alles identisch ist, bis auf das
RTOS was nun im Hintergrund exisitert. Habe die entsprechenden Files
nochmal mit hochgeladen... vielleicht hat ja einer eine Idee.
Übrigens passiert bei anderen Interrupts das selbe. Egal was für einen
Interrupt ich aktiviere, sobald er auslöst, lande ich im
Default_Handler.
Wäre sooo super, wenn jemand eine Idee hat, was ich tun kann :-)
Vielen Dank!!!