STM32F4 - Transistor schalten

Gast #3108267
Lesenswert?

Hallo zusammen,

habe folgende Frage/Problem:

Ich schließe einen Ausgang des STM32F4 über einen Widerstand an die 
Basis eines Standard NPN-Transistors. Am Kollektor liegen 12V an, an 
Emmitter ist ebenfalls ein Widerstand und danach eine LED angeschlossen.

Ich dachte nun folgendes. Ich setze den Ausgang des Controllers auf 
High, der Transistor schaltet durch, die LED leuchtet.

Hier die Initialisierung des Pins:

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OTypePP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

Die LED leuchtet dann auch, aber ich kann sie nie wieder ausschalten. 
Ich setze den Pin zurück, die LED leuchtet weiter. Sie geht nie aus.
Woran könnte das liegen?

Über Hilfe würde ich mich sehr freuen :)
Viele Grüße
Gast #3108321
Lesenswert?

Hier der komplette Code:

void initApplication()
{
  SysTick_Config(SystemCoreClock/100);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_StructInit (&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void delayLoop() {
  volatile uint32_t delayCount = 1000000;
  while (delayCount > 0) {
    delayCount--;
  }
}


int main(void)
{
  SystemInit();
  initApplication();

        while(1){

      GPIO_SetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
      GPIO_ResetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
        }

  return 0;
}

void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t 
Size){
  return;
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void){
  return -1;
}
Gast #3108446
Lesenswert?

> delayCount = 1000000;

Dein stm32F4 kann mit 168 MHz getaktet werden. Wenn der so schnell 
läuft, ist die Delay-Loop viel viel viel zu kurz. Für das Auge wird es 
so aussehen, als wäre die LED dauerhaft an.

Mach die Delay Loop mal länger.
Gast #3109493
Lesenswert?

Okay, ich denke ich habe hier ein grundsätzliches Software-Problem. Ich 
kann die I/Os überhaupt nicht steuern, die machen was sie wollen. Hier 
mein komplettes Programm (STM32F4 Discovery Board), ich möchte einfach 
nur den Pin1 (PE2) auf High oder Low setzen.

void initApplication()
{
  SysTick_Config(SystemCoreClock/100);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_StructInit (&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void delayLoop() {
  volatile uint32_t delayCount = 10000000;
  while (delayCount > 0) {
    delayCount--;
  }
}


int main(void)
{
  SystemInit();
  initApplication();

        while(1){

      GPIO_SetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
      GPIO_ResetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
        }

  return 0;
}

void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t
Size){
  return;
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void){
  return -1;
}


Leider tut sich da gar nichts, genau wie an anderen Ausgängen.
Hat jemand eine Idee woran es liegen könnte?
Gast #3109777
Lesenswert?

wie passt das hier:

> ich möchte einfach
> nur den Pin1 (PE2) auf High oder Low setzen.

du setzt aber die ganze Zeit PD1. Welchen Pin willst du denn jetzt 
setzen? Hast du schon mal mit dem Debugger durchgegangen?
#3109800
Lesenswert?

Ist schwierig zu sagen, wenn Du nicht alle Files postet, die verwendet 
werden. Oder zumindest sagst, welchen Compiler (Umgebung) Du verwendest.

Bei meiner GCC Umgebung gibt es da noch:
- startup_stm32f4xx.S
- system_stm32f4xx.c/.h
- stm32f4xx_it.c/.h
- Linkerscript
- ...

Eventuell hast Du ja dadrin noch ein ganz anderes Problem.

Habe Dir mal ein minimales Beispiel mit allen benötigten Files 
angehängt.

OS: Linux (für Windows müsstest Du die Pfade anpassen)
ARM-GCC: gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-69)

Im Beispiel wir der Pin 13 von GPIOC im Sekundentakt ein- und wieder 
ausgeschaltet.

Daniel
Angehängte Dateien:

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