STM32 Port-Initialisierung

Gast #3552071
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
Gast #3552080
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.
Gast #3552132
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.
Gast #3552150
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.
Gast #3552152
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?
Gast #3552161
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);
}
Gast #3552191
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)
Gast #3552211
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.
Gast #3552248
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren