stm32f103zet 6 기반 타이머 학습 2(타이머 넘 침)

일반 타이머 2 를 사용 하여 중단,계수 방식:증가 계수!
1.프로 그래 밍 설정 부분
1.먼저 인 터 럽 트 설정 을 하고 타이머 인 터 럽 트 는 반드시 설정 해 야 합 니 다.코드 는 다음 과 같 습 니 다.
void TIM2_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  													
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

이 부분 은 상술 하지 않 겠 다
2.타이머 설정 이 포인트
이 구조 체 를 찾 아 라.
/*TIM_Period--1000   TIM_Prescaler--71 -->     1ms*/
void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period=1000;		 		/*             (   ) */
    /*    TIM_Period               */
    TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1);			/*        72M/72 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 		/*      */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 		/*        */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);				/*          */
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM2, ENABLE);						/*      */								
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);		/*       */    
}

1、TIM_Clock Division 은 시계의 주파 수 를 설정 하 는 데 사 용 됩 니 다.값 은?
#define 
TIM_CKD_DIV1   ((uint16_t)0x0000)
#define 
TIM_CKD_DIV2   ((uint16_t)0x0100)
#define 
TIM_CKD_DIV4   ((uint16_t)0x0200)
2、 TIM_CounterMode 는 계수 모드 를 설정 하 는 데 사 용 됩 니 다.
#define 
TIM_CounterMode_CenterAligned1   ((uint16_t)0x0020)
#define 
TIM_CounterMode_CenterAligned2   ((uint16_t)0x0040)
#define 
TIM_CounterMode_CenterAligned3   ((uint16_t)0x0060)
#define 
TIM_CounterMode_Down   ((uint16_t)0x0010)
#define 
TIM_CounterMode_Up   ((uint16_t)0x0000)
3、 TIM_Period
Specifies the period value to be loaded into the active Auto-Reload Register at the next update event. This parameter must be a number between 0x0000 and 0xFFFF.  그냥 리 셋 값 이 야!
4、TIM_Prescaler 는 분명히 시계 와 주파수 계수 이다.
Specifies the prescaler value used to divide the TIM clock. This parameter can be a number between 0x0000 and 0xFFFF
설정 범위 가 비교적 넓 은 데,여기에 계산 공식 이 하나 있다.
5、TIM_RepetitionCounter
Specifies the repetition counter value. Each time the RCR downcounter reaches zero, an update event is generated and counting restarts from the RCR value (N)
이것 은 PWM 에서 사용 하 는 것 이 니,여 기 는 설정 하지 않 아 도 된다.
6.인 터 럽 트 설정,인 터 럽 트 플래그 위치 제거
TIM_TimeBaseInitTypeDef{
uint16_t  TIM_ClockDivision 
uint16_t  TIM_CounterMode 
uint16_t  TIM_Period 
uint16_t  TIM_Prescaler 
uint8_t  TIM_RepetitionCounter 
}

이로써 TIM 2 전체 설정 이 완료 되 었 습 니 다!어렵 지 않 게 나 왔 습 니 다.마지막 에 나 온 결 과 는:
/*TIM_Period--1000   TIM_Prescaler-71-->중단 주 기 는 1ms*/
7.초기 화 함 수 를 빠 뜨 렸 습 니 다.바로 TIMx 를 기본 값 으로 설정 하 는 것 입 니 다!
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);					/*          */
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

각종 타이머 의 기본 값 을 설정 한 것 을 볼 수 있 습 니 다.우 리 는 하나의 매개 변 수 를 입력 하면 해당 하 는 가 지 를 자동 으로 찾 아 초기 화 할 수 있 습 니 다.매우 밝 습 니 다!
2.우리 가 중단 이 생 긴 이상 우리 의 중단 함 수 는 어떻게 실현 합 니까?어디서 이 루어 질 까요?이어서 우리 가 it.c 파일 에서 실현 한 중단 함 수 를 보십시오!
4.567913.인 터 럽 트 안에 무엇 을 했 는 지 보 세 요.괜찮아 요.수첩 을 찾 아 보 세 요.이것 을 볼 수 있어 요.
void TIM_DeInit(TIM_TypeDef* TIMx)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx)); 
 
  switch (*(uint32_t*)&TIMx)
  {
    case TIM1_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);  
      break; 
      
    case TIM2_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
      break;
 
    case TIM3_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
      break;
 
    case TIM4_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
      break;
      
    case TIM5_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);
      break;
      
    case TIM6_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
      break;
      
    case TIM7_BASE:
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);
      break;
      
    case TIM8_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE);  
      break; 
      
    default:
      break;
  }
}
이것 이 바로 그 함수 의 입력 매개 변수 입 니 다.각종 인 터 럽 트 방식,Checks where the TIM interrupt has occurred or not.인 터 럽 트 가 발생 했 는 지 확인 하 는 데 사 용 됩 니 다.인 터 럽 트 를 설정 할 때 설정 한 TIM 이기 때 문 입 니 다.IT_Update 인 터 럽 트 방식,즉 업데이트 이벤트 입 니 다.초기 값 을 다시 불 러 오 세 요.적어도 저 는 그렇게 이해 합 니 다.
인 터 럽 트 안에 인 터 럽 트 플래그 비트 도 지 워 서 다음 에 인 터 럽 트 에 들 어가 기 편 하 잖 아 요.그리고 전역 변수 time 에 1 을 추가 하여 주 함수 에서 의 검 측 을 편리 하 게 합 니 다!
좋 습 니 다.마지막 으로 주 함수 의 코드 를 붙 이 면 문제 가 크 지 않 을 것 입 니 다.
void TIM2_IRQHandler(void)
{
	if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) 
	{	
		TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);    
  		 time++;
	}		 	
}

좋은 웹페이지 즐겨찾기