stm32f103zet 6 기반 타이머 학습 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++;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WatchdogTimer 사용해보기ESP32(M5Stack)와 Arduino에서 워치독 타이머의 동작을 확인한다. 모두 Arduino IDE를 이용하고 있지만, 워치독 타이머는 마이크로컴퓨터 의존의 부분이 많이 있어, 저레벨에서는 각각 다른 Func...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.