Gast
#2267217
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.