Forum: Mikrocontroller und Digitale Elektronik STM32 Port-Initialisierung


von Amir (Gast)


Lesenswert?

Hallo zusammen,

Ich habe folgende Fragen an euch:
1) Kann man jedes Pin eines Ports verschieden definieren?
2) Kann man beliebig im Code die Pin-Definition eines Ports nachträglich 
ändern?
3) Kann man auch Timer-Definition im Code nachträglich ändern?
Natürlich werden die Änderungen unternommen wenn sie gebraucht werden.

Gruß
Amir

von holger (Gast)


Lesenswert?

>1) Kann man jedes Pin eines Ports verschieden definieren?

Was meinst du damit?

>2) Kann man beliebig im Code die Pin-Definition eines Ports nachträglich
>ändern?

Ja.

>3) Kann man auch Timer-Definition im Code nachträglich ändern?
>Natürlich werden die Änderungen unternommen wenn sie gebraucht werden.

Ja.

von Amir (Gast)


Lesenswert?

Mit den einzelnen Pin-Definitionen meinte ich ein PIN als Input der 
andere als Output usw. zu definieren.

von holger (Gast)


Lesenswert?

>Mit den einzelnen Pin-Definitionen meinte ich ein PIN als Input der
>andere als Output usw. zu definieren.

Ja, das geht.

von Amir (Gast)


Lesenswert?

Ich habe ein Problem, wenn ich bei STM32F103 TIM3,Kanal3(für PB0) als 
PWM-Timer definiere, wird ein LED auf PB0 gedimmt, aber wenn ich den 
Timer in einem anderen Projekt initialisiere und den PORT/PIN natürlich 
auch, wird das LED nicht gedimmt!
Alle Einstellungen für TIM3 und GPIOB sind gleich.
Ich dachte man kann TIMER und PORT an beliebiger Stelle im Code neu 
definieren.

von Christian B. (chbalnuweit)


Lesenswert?

Was macht dich so sicher, dass es an der Software liegt?
Wie sind die LEDs angeschlossen?

von holger (Gast)


Lesenswert?

>Alle Einstellungen für TIM3 und GPIOB sind gleich.
>Ich dachte man kann TIMER und PORT an beliebiger Stelle im Code neu
>definieren.

Du kannst dir so aber auch deine alternate Function
des Pins abschalten wenn du nicht aufpasst. Das ist
ein Software Problem. Irgendwo machst du was falsch.

von Amir (Gast)


Lesenswert?

Die LEDs sind über ULN2803 angeschlossen und sie funktionieren.
Du meinst also es musste auf jeden Fall funktionieren und es liegt 
irgendwo am Code, ich habe aber alles untersucht.
Kann es sein dass ein Teil von Controller anderen teil beeinträchtigt?

von Amir (Gast)


Lesenswert?

Ich habe für TIM3-Kanal3 PB0 verwendet, es ist keine Alternate-Pin.
Die Init-Code ist Unten zu sehen:
Um PWM-Wert zu setzen verwende ich "TIM3->CCR3 = PWM_Wert;"

void InitTim3Chanal3PWM(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  int brightness = 0;

/*******************************************************************/
  /* TIM3 and GPIOB clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 1000;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  // Kanal3 aktivieren
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);
}

von holger (Gast)


Lesenswert?

RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

Schau da mal GANZ GENAU hin. Dort ist dein Fehler.

von Christian B. (chbalnuweit)


Lesenswert?

Versuche den Init Code mal mit einer vordefinierten Pulsbreite > 0. Dann 
kannst du sehen, ob es am Init Code liegt oder an der Art und Weise wie 
du die Pulsbreite im Betrieb verstellst.

von Amir (Gast)


Lesenswert?

Das ist kein Fehler, die GPIOs laufen auf APB2 und die Timer auf APB1
Siehe bitte Unten:
Ich habe mit vordefinirtem Wert die Pulsbreite gesetzt, es funktioniert 
auch wenn ich Emwin nicht verwende, aber mit Emwin läuft es nicht!

/* APB2 peripheral */
#define RCC_APB2Periph_AFIO              ((u32)0x00000001)
#define RCC_APB2Periph_GPIOA             ((u32)0x00000004)
#define RCC_APB2Periph_GPIOB             ((u32)0x00000008)
#define RCC_APB2Periph_GPIOC             ((u32)0x00000010)
#define RCC_APB2Periph_GPIOD             ((u32)0x00000020)
#define RCC_APB2Periph_GPIOE             ((u32)0x00000040)
#define RCC_APB2Periph_GPIOF             ((u32)0x00000080)
#define RCC_APB2Periph_GPIOG             ((u32)0x00000100)
#define RCC_APB2Periph_ADC1              ((u32)0x00000200)
#define RCC_APB2Periph_ADC2              ((u32)0x00000400)
#define RCC_APB2Periph_TIM1              ((u32)0x00000800)
#define RCC_APB2Periph_SPI1              ((u32)0x00001000)
#define RCC_APB2Periph_TIM8              ((u32)0x00002000)
#define RCC_APB2Periph_USART1            ((u32)0x00004000)
#define RCC_APB2Periph_ADC3              ((u32)0x00008000)
#define RCC_APB2Periph_ALL               ((u32)0x0000FFFD)

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFF0002) == 0x00) && 
((PERIPH) != 0x00))

/* APB1 peripheral */
#define RCC_APB1Periph_TIM2              ((u32)0x00000001)
#define RCC_APB1Periph_TIM3              ((u32)0x00000002)
#define RCC_APB1Periph_TIM4              ((u32)0x00000004)
#define RCC_APB1Periph_TIM5              ((u32)0x00000008)
#define RCC_APB1Periph_TIM6              ((u32)0x00000010)
#define RCC_APB1Periph_TIM7              ((u32)0x00000020)
#define RCC_APB1Periph_WWDG              ((u32)0x00000800)
#define RCC_APB1Periph_SPI2              ((u32)0x00004000)
#define RCC_APB1Periph_SPI3              ((u32)0x00008000)
#define RCC_APB1Periph_USART2            ((u32)0x00020000)
#define RCC_APB1Periph_USART3            ((u32)0x00040000)
#define RCC_APB1Periph_UART4             ((u32)0x00080000)
#define RCC_APB1Periph_UART5             ((u32)0x00100000)
#define RCC_APB1Periph_I2C1              ((u32)0x00200000)
#define RCC_APB1Periph_I2C2              ((u32)0x00400000)
#define RCC_APB1Periph_USB               ((u32)0x00800000)
#define RCC_APB1Periph_CAN               ((u32)0x02000000)
#define RCC_APB1Periph_BKP               ((u32)0x08000000)
#define RCC_APB1Periph_PWR               ((u32)0x10000000)
#define RCC_APB1Periph_DAC               ((u32)0x20000000)
#define RCC_APB1Periph_ALL               ((u32)0x3AFEC83F)

von holger (Gast)


Lesenswert?

>>RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
>Das ist kein Fehler, die GPIOs laufen auf APB2 und die Timer auf APB1

Natürlich ist das ein Fehler. Du kannst keinen Clock für
Peripherie die an APB2 hängt bei APB1 freischalten.
Da hast du gerade irgendwas eingeschaltet.

von Amir (Gast)


Lesenswert?

Wie soll ich dann vorgehen?

von Amir (Gast)


Lesenswert?

Wie soll ich dann vorgehen?

von Amir (Gast)


Lesenswert?

Hallo Holger,

Danke für deinen Tipp, ich habe den Fehler gefunden und korrigiert.
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

Es läuft trotzdem nicht, muss ich wohl weitersuchen.

Danke für deine Hilfe
Amir

von holger (Gast)


Lesenswert?

>auch wenn ich Emwin nicht verwende, aber mit Emwin läuft es nicht!

Du hast ein LCD angeschlossen?
Dann könnte es sein das dein LCD PB0 benutzt.

von Amir (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Holger,

PB0 ist nirgendwo verwendet worden, das kannst du auf dem Schaltplan 
sehen.
Kann es möglich sein dass ein Teil von STM32F103 den Timer3 
beeinträchtigt, obwohl Timer3 nur einmal wegen PWM auf PB0 programmiert 
worden ist?

Gruß
Amir

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.