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
>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.
Mit den einzelnen Pin-Definitionen meinte ich ein PIN als Input der andere als Output usw. zu definieren.
>Mit den einzelnen Pin-Definitionen meinte ich ein PIN als Input der >andere als Output usw. zu definieren. Ja, das geht.
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.
>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.
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?
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); }
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); Schau da mal GANZ GENAU hin. Dort ist dein Fehler.
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.
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)
>>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.
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
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.