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
Hast du schon mal gemessen ob der Pin wirklich auf low geht? Die LED und Widerstand gehören auch an den Kollektor.
> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
Liefert der aktivierte Pull Up genug Strom um den Transistor zu
schalten?
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; }
> 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.
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?
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.