Hallo; ich versuche seit 2 TAGE; die Funktion TIM -Capture/Compare durch STM32 value line Discovery (STM32f100RB) zu Implementieren. Ich habe alle Beiträge, die hier in diesem Forum sind, durchgelesen, und dementsprechend habe ich mich orientiert. Ich wollte einfache einen captureInterrupt auslösen lassen, wenn der User Button gedruckt wird. dafür habe ich die Alternate Function verwendet, den Cappture_Interrupt und der NVIC eingesetzt. Ich habe den Code mehrmals durchgeprüft und zeile für Zeile geprüft, trotzdem bich ich leider auf den Fehler nicht gekommen. Kann jemand mir bitte helfen, um den Fehler zu finden. vielen Dank Ich brauche jede kleine Hinweise, Tipp, Orientierung bitte....! /* Includes */ #include <stddef.h> #include "stm32f10x.h" /* ---------------------------Private typedef -------------------------------*/ TIM_TimeBaseInitTypeDef TIM2_Configuration; NVIC_InitTypeDef NVIC_InitStructure; TIM_OCInitTypeDef Output_Compare; TIM_ICInitTypeDef Input_Capture; GPIO_InitTypeDef GPIO_Inity; /*Variable*/ uint32_t Interrupt_Counter = 0; /*# ************************************************** *****************************/*/ void RCC_Configuration(void) { /* TIM2clock= SystemCoreColock, enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* ALTERNATE FUNCTION ENABLE*/ RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* GPIOC clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); } /************************************************** *****************************/ void GPIO_Setup () { /* LEDs pin (PC.08 and 09) configuration */ GPIO_Inity.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_9; GPIO_Inity.GPIO_Mode =GPIO_Mode_Out_PP; GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz; /* TIM2 PA.0 configuration*/ GPIO_Inity.GPIO_Mode =GPIO_Mode_AF_PP;// soll ich PULL-Down oder Pull up werwenden wenn der // Eingang als Pull-Down Konfiguriert? // Der AF weil bei dieser Pin wir der Alternate Function verwendet GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Inity.GPIO_Pin =GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_Inity); GPIO_Init(GPIOC, &GPIO_Inity); } /************************************************** ******************************/ void TIM2_SETUP () { /*----Time_Base_Counter-----*/ TIM2_Configuration.TIM_CounterMode= TIM_CounterMode_Up; TIM2_Configuration.TIM_ClockDivision= 0; TIM2_Configuration.TIM_Period=65535; TIM2_Configuration.TIM_Prescaler=1; TIM_TimeBaseInit(TIM2,&TIM2_Configuration); /*----Input_Capture Mode CH1----*/ Input_Capture.TIM_ICSelection = TIM_ICSelection_IndirectTI;// hier verstehe ich der Unterschied // zwischen Direct und Indirekt nicht // wirklich, aber ich verwende Direct weil ich // kein remaping durchführe Input_Capture.TIM_ICPolarity= TIM_ICPolarity_Rising; Input_Capture.TIM_ICPrescaler = TIM_ICPSC_DIV1; Input_Capture.TIM_Channel= TIM_Channel_1; Input_Capture.TIM_ICFilter = 0; TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);// dieze Zeile verstehe ich überhaupt nicht TIM_ICInit(TIM2, &Input_Capture); TIM_Cmd(TIM2, ENABLE); /*----Enable the Capture Compare Interrupt Request-----*/ TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); } /************************************************** ******************************/ void NVIC_SETUP () { /* Enable the TIM2 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; NVIC_Init(&NVIC_InitStructure); } /************************************************** ******************************/ void delayLoop() { volatile uint32_t delayCount = 1000000; while (delayCount > 0) { delayCount--; } } /*+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++*/ int main (void) { RCC_Configuration(); GPIO_Setup(); TIM2_SETUP(); while (1) { if(INT_Counter ==1) { GPIOC->BSRR = GPIO_Pin_8; // LED On delayLoop(); GPIOC->BRR = GPIO_Pin_8; // LED Off delayLoop(); GPIOC->BSRR = GPIO_Pin_8; // LED On delayLoop(); GPIOC->BRR = GPIO_Pin_8; // LED Off delayLoop(); GPIOC->BSRR = GPIO_Pin_9; // LED On delayLoop(); GPIOC->BRR = GPIO_Pin_9; // LED Off delayLoop(); } } return 0; } void TIM2_IRQHandler (void) { // Interrupt Flag muß per Software gelöscht werden TIM_ClearFlag(TIM2, TIM_FLAG_Update); INT_Counter++; } Ich danke Ihnen.
1 | uint32_t Interrupt_Counter = 0; |
Da fehlt ein "volatile":
1 | volatile uint32_t Interrupt_Counter = 0; |
Nur so liest der Compiler die Variable auch bei jedem Zugriff neu ein. Sonst schafft er sie einfach nur vor der Schleife in ein Register und greift nur aufs Register zu, da kann der Timer-IRQ dann machen was er will. ;-)
Danke Turbo für die Schnelle Antwort. ich habe es Korregiert, sogar habe ich anderen Fehler wie z.B GPIO_Inity.GPIO_Mode =GPIO_Mode_AF_PP richtig ist GPIO_Inity.GPIO_Mode =GPIO_Mode_IN_FLOATING; Aber trotzdem erfolglos. Ich verstehe überhaupt nicht warum`?? Bitte unm Hilfe.
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.