Forum: Mikrocontroller und Digitale Elektronik STM32F103C8T6: Timer 6 IRQ verschwunden?


von Christian J. (Gast)


Lesenswert?

Hallo,

laut Datenblatt hat der 48Pinner im NVIC einen "Timer 6 Global 
Interrupt". Benutze ich aber die StdPeriphLibs mit der Option MD (Medium 
Density), so wie von Embitz bei der Auswahl der CPU vorgeschlagen fehlt 
die Möglichkeit für Timer 6 dass der einen INT auslöst. Bei anderen CPU 
ist das ein "TIM6_DAC_IRQn". Die system_F1xx.c leitet da durch etliche 
ifdefs durch und tatsächlich fehlt da der Timer 6 drin als 
Interruptquelle. Testweise habe ich mal MD_VL (Value Line) gesetzt aber 
erstens funktioniert dieser Int dann auch nicht und zudem läuft die CPU 
dann nur noch auf 24 MHz stat auf 72Mhz

Defintion:
- Medium-density (MD) devices are STM32F101xx, STM32F102xx and 
STM32F103xx microcontrollers where the Flash memory density ranges 
between 64 and 128 Kbytes.


Ist das nun ein Fehler in der Lib?

Idee?

Gruss,
Christian

Timer 6 fehlt!
1
#ifdef STM32F10X_MD
2
  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
3
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
4
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
5
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
6
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
7
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
8
  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
9
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
10
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
11
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
12
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
13
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
14
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
15
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
16
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
17
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
18
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
19
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
20
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
21
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
22
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
23
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
24
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
25
  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
26
  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
27
#endif /* STM32F10X_MD */

von hp-freund (Gast)


Lesenswert?

Laut CubeMX hat dein STM32F103C8T nur Timer1 bis Timer4.

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

hp-freund schrieb:
> Laut CubeMX hat dein STM32F103C8T nur Timer1 bis Timer4.

Nach Datenblatt auch: 
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00161566.pdf

von Christian J. (Gast)


Lesenswert?

hp-freund schrieb:
> Laut CubeMX hat dein STM32F103C8T nur Timer1 bis Timer4.

Hast recht.... nur muss man echt suchen, bis man das findet. Steht nur 
im Data Sheet mit dem ich kaum arbeite.

Muss mit CubeMX auch mal installieren.

Nochwas: Wenn ich die ExtI_Pin_10-15 benutze, also jene, die sich 
mehrere Pins teilen, löst dann auch ein Signalwechsel durch eine 
Peripherie einen Int aus? Und wenn nicht, wie kriege ich raus welcher 
Pin den Int ausgelöst hat?

Bisher sieht das so aus, PA2. Lieber wäre mir aber ein PBx Port:
1
#define IRQ_PORT       GPIOA
2
#define IRQ_PIN        GPIO_Pin_2
3
#define IRQ_LINE       EXTI_Line2
4
#define IRQ_HDL        EXTI2_IRQn
5
#define IRQ_ROUTINE    EXTI2_IRQHandler
6
7
GPIO_InitTypeDef GPIO_InitStruct;
8
    EXTI_InitTypeDef EXTI_InitStruct;
9
    NVIC_InitTypeDef NVIC_InitStruct;
10
11
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
12
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);      /* Clock für SYSCFG */
13
14
    /* PA2 als Input */
15
    GPIO_StructInit (&GPIO_InitStruct);
16
    GPIO_InitStruct.GPIO_Pin    = IRQ_PIN;
17
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN_FLOATING;
18
    GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;
19
    GPIO_Init(IRQ_PORT, &GPIO_InitStruct);
20
21
    // Line einem Port und Pin zuordnen
22
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
23
24
    /* Line 2 der External IRQs 2 konfigurieren */
25
    EXTI_InitStruct.EXTI_Line    = IRQ_LINE;                        /* PA2 ist verbunden mit EXTI_Line2 */
26
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;                          /* Enable interrupt */
27
    EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;             /* Interrupt mode */
28
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;            /* Trigger auf fallende Flanke */
29
    EXTI_Init(&EXTI_InitStruct);                                    /* Aktivieren und zu EXTI hinzufügen */
30
31
    /* NVIC einbinden: PC1 ist auf EXTI_Line1 und hat den Vector EXT1_IRQn */
32
    NVIC_InitStruct.NVIC_IRQChannel = IRQ_HDL;
33
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 15;         /* Niedrige Priorität */
34
    NVIC_InitStruct.NVIC_IRQChannelSubPriority        = 0;          /* Sub Priorität */
35
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                    /* Enable Interrupt */
36
    NVIC_Init(&NVIC_InitStruct);                                    /* Zum NVIC hinzufügen */
37
38
    NVIC_EnableIRQ(IRQ_HDL);                                     /* Interrupt ein */

von Cyblord -. (cyblord)


Lesenswert?

Christian J. schrieb:

> Hast recht.... nur muss man echt suchen, bis man das findet. Steht nur
> im Data Sheet mit dem ich kaum arbeite.

Finde den Fehler....

Die Datenblätter der STM32 haben ziemlich weit vorne eine tabellarische 
Übersicht über alle Features und Peripherie der darin behandelten 
Controller. Mir ist nicht klar, wie man ohne diese essentielle 
Informationen anfangen kann zu entwickeln.
Das Reference Manual überspannt regelmäßig eine riesige Familie an 
Controllern und kann dafür nicht herhalten.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Cyblord -. schrieb:
> Das Reference Manual überspannt regelmäßig eine riesige Familie an
> Controllern und kann dafür nicht herhalten.

Jo, das ist die einzige Stelle wo das steht... das kann man schon mal 
übersehen, wenn man den neu erworben hat.

Blöd ist nur: Ich habe die 64kb Version. Release ist derzeit 5kb, Debug 
ist schon 21kb (+20kb für sprintf) und wachsend. Da mir noch die Grafik 
fehlt platzt mir der Chip schon vorher, oder ich arbeite ohne Debug. 
Erstmal grad die 128kb version bei amazon bestellt und die umlöten auf 
die Boards.

von hp-freund (Gast)


Lesenswert?

Christian J. schrieb:
> wie kriege ich raus welcher Pin den Int ausgelöst hat?

Im EXTI15_10_IRQHandler

 z.B.:

 if(EXTI_GetITStatus(EXTI_Line15) != RESET)

von Christian J. (Gast)


Lesenswert?

hp-freund schrieb:
> Im EXTI15_10_IRQHandler
>
>  z.B.:
>
>  if(EXTI_GetITStatus(EXTI_Line15) != RESET)

Ok, und löst ein Peripheriesignalwechsel an einem Pin auch einen Int 
aus?

von Nils P. (ert)


Lesenswert?

Hatte auch kürzlich das Problem...

in der STM32F10x.H steht:
 - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx 
microcontrollers where the Flash memory density ranges between 64 and 
128 Kbytes.
 - Medium-density value line devices are STM32F100xx microcontrollers 
where the Flash memory density ranges between 64 and 128 Kbytes.
 - High-density devices are STM32F101xx and STM32F103xx microcontrollers 
where the Flash memory density ranges between 256 and 512 Kbytes.

Ich war auch verwöhnt von dem Stm32f4, auf einmal muss man sich wieder 
einschränken ;-)

Wenn mC tauschen, dann doch gleich einen High-density. Oder gar einen 
Cortex M4 oder sind die nicht mehr Pinkompatibel?

von Jojo S. (Gast)


Lesenswert?

Christian J. schrieb:
> Ok, und löst ein Peripheriesignalwechsel an einem Pin auch einen Int
> aus?

Ich würde sagen ja, auch wenn ich es bis jetzt noch nicht ausprobiert 
habe.
Im Manual CD00171190.pdf ist das in 10.2, der EXTI beschrieben. Da kann 
man sich durch die nötigen Register hangeln.
Oder man fragt den Würfel: da kann man für die GPIOs den GPIO_EXTIn als 
Funktion auswählen. In Configuration/GPIO wählt man per Dialog die 
Flanke und Pull up/down aus, dann noch im NVIC den EXTI als aktiv 
markieren. Das generiert dann zB für PC13 als Int und PA9 als einfachen 
Output:
1
// stm32f1xx_it.c
2
/**
3
* @brief This function handles EXTI line[15:10] interrupts.
4
*/
5
void EXTI15_10_IRQHandler(void)
6
{
7
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
8
9
  /* USER CODE END EXTI15_10_IRQn 0 */
10
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
11
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */
12
13
  /* USER CODE END EXTI15_10_IRQn 1 */
14
}
15
16
/** Configure pins as 
17
        * Analog 
18
        * Input 
19
        * Output
20
        * EVENT_OUT
21
        * EXTI
22
*/
23
void MX_GPIO_Init(void)
24
{
25
26
  GPIO_InitTypeDef GPIO_InitStruct;
27
28
  /* GPIO Ports Clock Enable */
29
  __GPIOC_CLK_ENABLE();
30
  __GPIOA_CLK_ENABLE();
31
  __GPIOB_CLK_ENABLE();
32
33
  /*Configure GPIO pin : InterruptPin_Pin */
34
  GPIO_InitStruct.Pin = InterruptPin_Pin;
35
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
36
  GPIO_InitStruct.Pull = GPIO_PULLUP;
37
  HAL_GPIO_Init(InterruptPin_GPIO_Port, &GPIO_InitStruct);
38
39
  /*Configure GPIO pin : PA9 */
40
  GPIO_InitStruct.Pin = GPIO_PIN_9;
41
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
42
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
43
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
44
45
  /*Configure GPIO pin Output Level */
46
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
47
48
  /* EXTI interrupt init*/
49
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
50
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
51
}

bequemer gehts kaum.

von Christian J. (Gast)


Lesenswert?

Nils P. schrieb:
> Ich war auch verwöhnt von dem Stm32f4, auf einmal muss man sich wieder
> einschränken ;-)
>
> Wenn mC tauschen, dann doch gleich einen High-density. Oder gar einen
> Cortex M4 oder sind die nicht mehr Pinkompatibel?

Weiss ich nicht.  Klar, weniger Fläche für LQFP48, daher weniger von 
allem. Von 14 Timern war ich auch verwöhnt, man hats ja, einen für die 
Uhr, einen für die Sensorabstaster, einer saugt, der andere spült :-) 
Davon muss man sich verabschieden.

Ich habe die f103 genommen, weil es die für 7 Euro im DIP40 Format für 
Lochraster gibt, 32 Bit Rechenpower + C99 GCC Compiler (statt blöder 
8bit für PIC) und die eben sehr handlich sind um die Platine an die Wand 
zu nageln als Barometer. Port Expansion mit 74HCT595, dann kommt man gut 
hin.

Das erste problem ist leider schon da: Debug Code wächst schnell an, mit 
Libs (ein schlankes sprintf habe ich woanders geklaut) sind es schon 
45kb. Relase nur 12kb. D.h. die 64kb Grenze werde ich schnell erreichen 
wenn ich die Grafik fürs ILI9341 und Fonts noch reinhole. Daher bei 
Amazon die 128kb Chips "CB" statt "C8" bestellt.

@Jojo S. CubeMx finde ich noch etwas kryptisch, evtl. melde ich mich 
dazu nochmal wie man Code erzeugt und wie man alles zurücksetzt usw.

von Cyblord -. (cyblord)


Lesenswert?

Debugge doch einfach direkt mit einem Debugger dann brauchst du nicht so 
viel sprintf Ausgaben. Und du kannst dir JEDE Variable direkt anschauen.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Cyblord -. schrieb:
> Debugge doch einfach direkt mit einem Debugger dann brauchst du nicht so
> viel sprintf Ausgaben. Und du kannst dir JEDE Variable direkt anschauen.

Tu ich ja ... sprintf ist nur fürs Display. Semihosting funktioniert 
zwar auf dem F103 aber wer braucht das schon wirklich? Der KOmfort 
Debugger bei EmBitz kann fast alles, nur nicht tracen. Allerdings knallt 
die Codegröße sofort  hoch, sobald das erste float da ist und dann ein 
Sinus noch und ruckzuck ist die Hütte voll.

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.