2015년 12월 10일 목요일

stm32 input 타이머 예제

#include "stm32f10x.h"
volatile unsigned int Timer2_Counter=0;
void init_port()
{
 GPIO_InitTypeDef PORTA;
 GPIO_InitTypeDef PORTB; //GPIO 구조체
 GPIO_InitTypeDef PORTC;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); // 클럭수를 배당
 PORTA.GPIO_Pin=GPIO_Pin_0; //핀
 PORTA.GPIO_Mode=GPIO_Mode_AF_PP;// 모드
 PORTA.GPIO_Speed=GPIO_Speed_10MHz;//속도
 GPIO_Init(GPIOA,&PORTA); //GPIOA를 PORTA로 초기화 한다.
 PORTB.GPIO_Pin=GPIO_Pin_0; //핀
 PORTB.GPIO_Mode=GPIO_Mode_AF_PP;// 모드
 PORTB.GPIO_Speed=GPIO_Speed_10MHz;//속도
 GPIO_Init(GPIOB,&PORTB); //GPIOA를 PORTA로 초기화 한다.

 PORTC.GPIO_Pin = GPIO_Pin_0;
 PORTC.GPIO_Speed = GPIO_Speed_10MHz;
 PORTC.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOC, &PORTC);

}
void TIM2_IRQHandler(void) //핸들러 함수에서  TIM_GetITStatus(TIM2,TIM_IT_Update)를 통해서 인터럽트 플래그가  set 되어있는지 확인하고 내가 만든 변수 증가한다.
{
  if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Clear the interrupt flag
        Timer2_Counter++; //카운트를 증가시킨다.
        GPIOB->BRR = GPIO_Pin_0;  // PB0 OFF
    }

    if(TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);//인터럽트 플래그를 지운다.
        GPIOB->BSRR = GPIO_Pin_0;  // PB0 ON
    }
}
void init_Timer2()
{
   NVIC_InitTypeDef NVIC_InitStructure;// 타이머 인터럽트 컨드롤
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//타이머

    TIM_OCInitTypeDef OutputChannel;   
    
    /* TIM2 Clock Enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//클럭 할당
    
    /* Enable TIM2 Global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);//NVIC 초기화
    
    /* TIM2 Initialize */  
    TIM_TimeBaseStructure.TIM_Period=100-1; // 100kHz// 주기
    TIM_TimeBaseStructure.TIM_Prescaler=24-1; //
    TIM_TimeBaseStructure.TIM_ClockDivision=0;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//타임 초기화
    
    /* TIM2 PWM Initialize */
    OutputChannel.TIM_OCMode = TIM_OCMode_PWM1;
    OutputChannel.TIM_OutputState=TIM_OutputState_Enable;
    OutputChannel.TIM_OutputNState=TIM_OutputNState_Enable;
    OutputChannel.TIM_Pulse=50-1; // 50% duty ratio
    OutputChannel.TIM_OCPolarity=TIM_OCPolarity_Low;
    OutputChannel.TIM_OCNPolarity=TIM_OCNPolarity_High;
    OutputChannel.TIM_OCIdleState=TIM_OCIdleState_Set;
    OutputChannel.TIM_OCNIdleState=TIM_OCIdleState_Reset;

    TIM_OC1Init(TIM2,&OutputChannel);//오실리스코프 초기화
    
    /* TIM2 Enale */
    TIM_Cmd(TIM2,ENABLE); //타이머가 가득차면 인터럽트 발생
    TIM_ITConfig(TIM2,TIM_IT_Update | TIM_IT_CC1 ,ENABLE); // interrupt enable
}
void make_pwn(u16 val)
{

    TIM_OCInitTypeDef OutputChannel; //오실리스코프 구조체 할당
    
    OutputChannel.TIM_OCMode = TIM_OCMode_PWM1;
    OutputChannel.TIM_OutputState=TIM_OutputState_Enable;
    OutputChannel.TIM_OutputNState=TIM_OutputNState_Enable;
    OutputChannel.TIM_Pulse=val;// 펄스값이 들어옴 val
    OutputChannel.TIM_OCPolarity=TIM_OCPolarity_Low;
    OutputChannel.TIM_OCNPolarity=TIM_OCNPolarity_High;
    OutputChannel.TIM_OCIdleState=TIM_OCIdleState_Set;
    OutputChannel.TIM_OCNIdleState=TIM_OCIdleState_Reset;
   
  TIM_OC1Init(TIM2,&OutputChannel);// 구조체 할당
}
void delay(unsigned int del) //del 100이므로
{
 Timer2_Counter=0; //전역 변수 초기화
 while(Timer2_Counter<del); //100까지 반복 아마 타이머로인해 카운터가 수시로 증가됨.
}
int main()
{
 u16 i;
 SystemInit(); //시스템 초기화
 init_port(); //출력 포트 초기화
 init_Timer2(); //타이머 초기화 아마 출력포트에 영향
 /*
   if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0 )==1) )
  {
   GPIO_WriteBit(GPIOA,0x0001,1);
   delay(1000);
   GPIO_WriteBit(GPIOA,0x0001,0);
  }else
  {}*/
 
    for(i=0;i<100;i++)
   {
   TIM2->CCR1=i; //튜티비는 TIM_CCR / TIM_ARR 으로 제어 ccr 증가
   delay(100); //딜레이
   }
   for(i=98;i>0;i--)
   {
   TIM2->CCR1=i;
   delay(100);
  
  
   }
  while(1)
  {
   if( (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0 )==0.) )
   {
   for(i=0;i<100;i++)
   {
   TIM2->CCR1=i; //튜티비는 TIM_CCR / TIM_ARR 으로 제어 ccr 증가
   delay(100); //딜레이
   }
   for(i=98;i>0;i--)
   {
   TIM2->CCR1=i;
   delay(100);
  
  
  
   }
   }
  }
 


}

댓글 없음:

댓글 쓰기