기술나눔

STM32-TIM 타이머

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

이 내용은 다음을 기반으로 합니다.Jiangxie Technology STM32 비디오콘텐츠, 정리.

1. 팀

1.1 TIM 타이머

  • 타이머는 입력 클록을 카운트하고 카운트 값이 설정 값에 도달하면 인터럽트를 트리거할 수 있습니다.
  • 16비트 카운터, 프리스케일러 및 자동 다시 로드 레지스터의 시간 기반 단위는 72MHz 카운팅 클록에서 최대 59.65초의 타이밍을 달성할 수 있습니다. 1/(72/65536/65536) (카운터는 카운팅 타이밍을 수행하는 데 사용되는 레지스터입니다. 클럭이 올 때마다 카운터는 1씩 증가합니다. 프리스케일러는 카운터 클럭을 분할하여 보다 유연하게 계산할 수 있습니다. 자동 재시작 로드됨 레지스터는 인터럽트를 적용하기 위해 카운트하려는 클럭 수를 나타내는 카운트의 목표 값입니다. 이 레지스터는 타이머의 핵심 부분을 구성합니다. 이 회로를 시간 기반 단위라고 합니다.
  • 기본 예약된 인터럽트 기능뿐만 아니라 내부 및 외부 클럭 소스 선택, 입력 캡처, 출력 비교, 인코더 인터페이스, 마스터-슬레이브 트리거 모드 및 기타 기능도 포함합니다.
  • 복잡성과 응용 시나리오에 따라 고급 타이머, 일반 타이머, 기본 타이머의 세 가지 유형으로 구분됩니다.

1.2 타이머 유형

유형일련번호버스기능
고급 타이머TIM1、TIM8APB2일반 타이머의 기능을 모두 갖고 있으며 추가적으로 반복 카운터, 데드존 생성, 보완 출력, 브레이크 입력 등의 기능을 갖고 있습니다.
범용 타이머TIM2、TIM3、TIM4、TIM5APB1기본 타이머의 모든 기능을 갖추고 있으며 내부 및 외부 클럭 소스 선택, 입력 캡처, 출력 비교, 인코더 인터페이스, 마스터-슬레이브 트리거 모드 등과 같은 추가 기능이 있습니다.
기본 타이머TIM6、TIM7APB1DAC를 트리거하는 예약된 인터럽트 및 마스터 모드 기능이 있습니다.
  • STM32F103C8T6 타이머 리소스: TIM1, TIM2, TIM3, TIM4
  • DAC: 디지털-아날로그 변환기

1.3 기본 타이머

주요 기능:

  • 16비트 자동 재로드 누적 카운터
  • 16비트 프로그래밍 가능 프리스케일러는 입력 클록을 1~65536 사이의 값으로 나누는 데 사용됩니다.
  • DAC를 트리거하는 동기 회로
  • 업데이트 이벤트 시 인터럽트/DMA 요청이 생성됨(카운터 오버플로)

이미지.png

  • 프리스케일러 PSC
    참조 카운트 클럭의 입력은 프리스케일러 앞에 연결됩니다. 기본 타이머는 내부 클럭만 선택할 수 있으므로 프리스케일러의 입력 라인은 내부 클럭(CK_INT)에 연결되어 있다고 볼 수 있다.
    내부 클럭의 소스는 RCC의 TIMxCLK입니다. 여기서의 주파수 값은 일반적으로 시스템의 기본 주파수인 72MHz입니다.
    프리스케일러에 0을 쓰면 주파수 분할이 없음을 의미하고, 1을 쓰면 주파수를 2로 나누는 것을 의미하며 출력 주파수 = 입력 주파수/2 = 36MHz입니다.
    2를 쓴다는 것은 3으로 나누는 것을 의미하고, 출력 = 입력/3을 의미합니다. 따라서 프리스케일러의 값은 실제 주파수 분주 계수와 1만큼 차이가 나며, 실제 주파수 분주 계수 = 프리스케일러 1의 값이 됩니다. 프리스케일러는 16비트이므로 최대값은 65535로 쓸 수 있고 이를 65536으로 나눈다.

  • 카운터CNT
    카운터는 미리 분할된 카운트 클럭을 카운트할 수 있으며, 카운팅 클럭이 상승 에지에 도달할 때마다 카운터 값이 1씩 증가합니다. 카운터도 16비트이므로 내부 값을 0부터 65535까지 더할 수 있다. 더 추가되면 카운터는 0으로 돌아가서 다시 시작됩니다. 따라서 카운터 값은 계산 프로세스 중에 계속 증가합니다. 증가량이 목표 값에 도달하면 인터럽트가 생성되고 예약된 작업이 완료됩니다. 따라서 목표값을 저장하기 위한 레지스터가 필요하며, 이는 자동 리로드 레지스터이다.

  • 자동 재로드 레지스터
    자동 리로드 레지스터도 16비트이며, 기록할 카운트 대상을 저장합니다. 실행 프로세스 중에 카운트 값은 계속 증가하며 자동 재로드 값은 고정 목표입니다. 카운트 값이 자동 재로드 값과 같을 때 타이밍 시간이 초과됩니다. 그런 다음 인터럽트 신호를 생성하고 카운터를 지우며 카운터는 자동으로 다음 계산 시간을 시작합니다.

  • U 및 UI 화살표
    그림에 그려진 상향 할인 화살표는 여기서 인터럽트 신호가 발생한다는 의미입니다. 이와 같이 카운트 값이 자동 다시 로드 값과 동일한 인터럽트를 일반적으로 "업데이트 인터럽트"라고 합니다. 이 업데이트 인터럽트는 NVIC로 이어집니다. NVIC의 타이머 채널을 구성하면 타이머의 업데이트 인터럽트가 CPU에 의해 응답됩니다. 아래쪽 화살표는 이벤트가 생성될 것임을 나타내며, 여기서 해당 이벤트를 "업데이트 이벤트"라고 합니다. 업데이트 이벤트는 인터럽트를 트리거하지 않지만 다른 내부 회로의 작업을 트리거할 수 있습니다.

1.4 일반 타이머

주요 기능:

  • 16비트 업, 다운, 업/업 자동 재로드 누산기 카운터

  • 16비트 프로그래밍 가능 프리스케일러는 입력 클록을 1~65536 사이의 값으로 나누는 데 사용됩니다.

  • 4개의 독립 채널:

    • 입력 캡처
    • 출력 비교
    • PWM 생성(에지 또는 중앙 정렬 모드)
    • 단일 펄스 모드 출력
  • 외부 신호를 사용하여 타이머 및 타이머 상호 연결을 제어하는 ​​동기화 회로

  • 다음 이벤트가 발생할 때 인터럽트/DMA가 생성됩니다.

    • 업데이트: 카운터 오버플로/언더플로, 카운터 초기화(소프트웨어 또는 내부/외부 트리거를 통해)
    • 트리거 이벤트(내부/외부에서 트리거되는 카운터 시작, 중지, 초기화 또는 카운팅)
    • 입력 캡처
    • 출력 비교
  • 위치 지정을 위한 증분(구적) 인코더 및 홀 센서 회로 지원

  • 외부 클록 또는 사이클별 전류 관리로 입력 트리거
    이미지.png

  • CNT 카운터
    CNT 카운터는 업 카운팅 모드, 다운 카운팅 모드, 중앙 정렬 모드를 지원합니다. 하향 카운트 모드는 다시 로드된 값부터 시작하여 0으로 감소한 후 다시 로드된 값으로 돌아가 인터럽트를 적용합니다. 중앙 정렬 모드는 0부터 시작하여 위쪽으로 증가한 후 reload 값을 카운트하여 인터럽트를 적용한 다음 아래쪽으로 0으로 감소한 후 인터럽트를 적용합니다.

  • 클럭 소스
    일반 타이머의 클럭 소스는 내부 72MHz 클럭을 선택할 수 있을 뿐만 아니라 외부 클럭도 선택할 수 있습니다.
    (1)첫 번째 외부 시계는TIMx_ETR 핀의 외부 클록 즉, 외부 구형파 클럭을 TIM2, PA0의 ETR 핀에 연결한 다음 내부 극성 선택, 에지 감지 및 프리스케일러 회로와 입력 필터 회로를 구성할 수 있습니다. 이 두 회로는 클럭을 겪을 수 있습니다. 특정 성형. 외부 핀 클럭이기 때문에 필연적으로 약간의 결함이 있을 수 있으므로 이러한 회로는 입력 파형을 필터링할 수 있습니다. 필터링된 신호는 두 개의 채널로 나누어지며 상위 ETRF 채널은 트리거 컨트롤러로 들어간 다음 시계를 시간 기반 단위로 선택할 수 있습니다. 이 길은 "라고도 불립니다.외부 클록 모드 2”。
    이미지.png
    (2) TRGI는 외부 클럭도 제공할 수 있습니다. , 주로 트리거 입력으로 사용됩니다. 이 트리거 입력은 타이머의 슬레이브 모드를 트리거할 수 있습니다. TRGI를 외부 클럭으로 사용하는 경우 이 경로를 "외부 클록 모드 1". 이 채널을 통과하는 외부 클럭은 무엇입니까? 첫 번째는 ETR 핀의 신호입니다. 두 번째는 ITR 신호입니다. 클럭 신호의 이 부분은 다른 타이머에서 나옵니다. 마스터 모드의 TRGO는 다음으로 이어질 수 있습니다. 다른 타이머에 연결할 때는 다른 타이머의 ITR0부터 ITR3까지 연결되며 여기에 입력 캡처 장치에 연결된 TI1F_ED를 선택할 수도 있습니다. CH1 핀, 즉 클럭은 CH1 핀에서 얻습니다. 여기서 접미사 ED(Edge)는 TI1FP1을 통해서도 얻을 수 있으며 TI1FP2는 CH1 핀에 연결된 클럭입니다. CH2 핀.
    요약: 외부 클록 모드 1에 대한 입력은 ETR 핀, 기타 타이머, CH1 핀의 에지, CH1 핀 및 CH2 핀이 될 수 있습니다.

  • 출력 비교 회로
    아래 오른쪽 부분은 출력 비교 회로로, CH1~CH4 핀에 해당하는 총 4개의 채널이 있으며, 이를 통해 PWM 파형을 출력하고 모터를 구동할 수 있습니다.

  • 입력 캡처 회로
    왼쪽에는 입력 캡처 회로가 있으며, 이 회로에는 입력 구형파 등의 주파수를 측정하는 데 사용할 수 있는 CH1 ~ CH4 핀에 해당하는 4개의 채널이 있습니다.

  • 캡처/비교 레지스터
    중간 레지스터는 입력 캡처와 출력 비교 회로가 공유하는 캡처/비교 레지스터입니다. 입력 캡처와 출력 비교를 동시에 사용할 수 없기 때문에 여기의 레지스터도 공유되고 핀도 공유됩니다.

1.4 고급 타이머

주요 기능:

  • 16비트 업, 다운, 업/업 자동 재로드 누산기 카운터
  • 16비트 프로그래밍 가능 프리스케일러는 입력 클록을 1~65536 사이의 값으로 나누는 데 사용됩니다.
  • 4개의 독립 채널:
    • 입력 캡처
    • 출력 비교
    • PWM 생성(에지 또는 중앙 정렬 모드)
    • 단일 펄스 모드 출력
  • 데드타임 프로그래밍 가능 보완 출력
  • 외부 신호를 사용하여 타이머 및 타이머 상호 연결을 제어하는 ​​동기화 회로
  • 지정된 데이터의 카운터 기간 이후 타이머 레지스터에서 반복 카운터를 업데이트할 수 있습니다.
  • 브레이크 입력 신호는 타이머 출력 신호를 재설정 상태 또는 알려진 상태로 전환할 수 있습니다.
  • 다음 이벤트가 발생할 때 인터럽트/DMA가 생성됩니다.
    • 업데이트: 카운터 오버플로/언더플로, 카운터 초기화(소프트웨어 또는 내부/외부 트리거를 통해)
    • 트리거 이벤트(내부/외부에서 트리거되는 카운터 시작, 중지, 초기화 또는 카운팅)
    • 입력 캡처
    • 출력 비교
    • 브레이크 신호 입력
  • 위치 지정을 위한 증분(구적) 인코더 및 홀 센서 회로 지원
  • 외부 클록 또는 사이클별 전류 관리로 입력 트리거

이미지.png

  • 반복 카운터
    일반 타이머와의 차이점: 첫 번째는 인터럽트가 적용되는 반복 카운터를 추가하는 것입니다. 이 카운터를 사용하면 업데이트 이벤트와 업데이트 인터럽트가 몇 번의 계산 주기마다 발생한다는 것을 알 수 있습니다. 원래 구조는 각 카운팅 주기가 완료된 후에 업데이트가 발생한다는 것입니다. 이는 출력 업데이트 신호를 다시 나누는 것과 같습니다.

  • DTG 데드밴드 생성기 및 보완 출력
    다음은 고급 타이머에 의한 출력 비교 모듈의 업그레이드입니다. DTG(데드 타임 생성)는 데드존 생성 회로입니다. 오른쪽의 출력 핀은 원래의 1개에서 2개의 보완 출력으로 변경되었으며, 이는 한 쌍의 보완적인 PWM 파동을 출력할 수 있습니다. 이 회로는 쿼드콥터 항공기, 전기의 뒷바퀴와 같은 3상 브러시리스 모터를 구동하는 데 사용됩니다. 차량, 전기 드릴 등이 있습니다. 3상 브러시리스 모터일 수도 있습니다. 3상 브러시리스 모터의 구동 회로에는 일반적으로 3개의 브리지 암이 필요하기 때문에 각 브리지 암은 2개의 고출력 스위칭 튜브로 제어되므로 총 6개의 고출력 스위칭 튜브가 필요합니다. 따라서 여기에서 처음 3개의 출력 PWM 핀은 보완 출력이 됩니다. 또한, 보완 출력 PWM이 브리지 암을 구동할 때 스위칭 순간에 소자의 불완전성으로 인해 발생하는 단기적인 슛스루 현상을 방지하기 위해 데드존 생성 회로를 전면에 추가합니다. 스위치를 전환하는 순간 일정 시간 동안 데드존이 발생해 브릿지 암의 상부 튜브와 하부 튜브가 모두 꺼지도록 하여 슛스루를 방지합니다.

  • 브레이크 입력
    마지막 부분은 모터 드라이브의 안전을 보장하는 브레이크 입력 기능입니다. 외부 핀 BKIN(Break IN)이 브레이크 신호를 발생시키거나, 내부 클럭이 고장나고 이상이 발생하면 제어 회로가 자동으로 모터의 출력을 차단해 사고를 방지합니다.

1.5 예약된 인터럽트의 기본 구조

이미지.png
작동 제어: 시작 및 중지, 카운트 업 또는 다운 등과 같은 레지스터의 일부 비트를 제어합니다.
오른쪽은 타이밍 시간이 경과하고 업데이트 인터럽트가 생성된 후 신호가 이동하는 곳입니다. 고급 타이머인 경우 추가 반복 카운터가 있습니다. 인터럽트 신호는 먼저 상태 레지스터에 인터럽트 플래그 비트를 설정하고 이 플래그 비트는 인터럽트 출력을 통해 제어되며 NVIC에 인터럽트를 적용합니다. 인터럽트 출력 제어는 인터럽트 출력을 위한 활성화 비트입니다. 인터럽트가 필요한 경우 이를 활성화해야 합니다.
이미지.png
이미지.png

1.6 프리스케일러 타이밍

이미지.png

  • 카운터 계산 빈도: CK_CNT = CK_PSC / (PSC 1)
  • CK_PSC: 프리스케일러 클럭, 내부 클럭은 72MHz입니다.
  • CNT_EN: 카운터가 활성화되고 상위 수준 카운터가 정상적으로 실행되며 하위 수준 카운터가 중지됩니다.
  • CK_CNT: 프리스케일러의 클럭 출력이자 카운터의 클럭 입력인 카운터 클럭입니다.
  • 처음에는 카운터가 활성화되지 않고 카운터 시계가 실행되지 않습니다. 활성화 후 기간의 전반부에서 실제 주파수 분할 계수는 1(PSC=0)이고 후반부에서 카운터의 클럭은 프리스케일러 이전의 클럭과 동일하며 실제 주파수 분할 계수는 2입니다. PSC=1), 카운터의 클럭 클럭은 프리스케일러 이전 클럭의 절반이 됩니다. 카운터 클럭에 의해 구동되면 다음 카운터 레지스터도 클럭의 상승 에지와 함께 계속 증가합니다. 중간 위치 FC 이후 카운트 값은 0이 됩니다. 여기에서 ARR 자동 재로드 값은 FC임을 추론할 수 있습니다. 카운트 값이 다시 로드 값과 동일하고 다음 클럭이 오면 카운트 값이 0으로 지워지고 아래 업데이트 이벤트가 생성됩니다.
  • 다음 세 줄은 프리스케일러 레지스터의 버퍼링 메커니즘을 설명합니다. 즉, 실제로 두 개의 프리스케일러 레지스터가 있는데, 그 중 하나는 우리가 읽고 쓰는 프리스케일러 제어 레지스터입니다. . 버퍼 레지스터나 섀도우 레지스터도 있는데, 프리스케일러 버퍼입니다. 이 버퍼 레지스터는 실제로 작동하는 레지스터입니다. 예를 들어 특정 순간에 프리스케일러 레지스터를 0에서 1로 변경합니다. 클록의 분할 계수는 즉시 전반부와 후반부의 주파수를 카운팅 사이클 내에서 다르게 만듭니다. 따라서 버퍼가 카운트의 절반에 도달하면 프리스케일러 값이 변경되며, 이 변경 사항은 이 카운팅 주기가 끝날 때까지 기다렸다가 업데이트 이벤트가 발생합니다. 프리스케일러 레지스터의 값은 변경되기 전에 버퍼 레지스터로 전달됩니다.
  • 마지막 줄에서 볼 수 있듯이 프리스케일러는 주파수를 나누기 위해 카운팅에 의존합니다. 프리스케일러 값이 0이면 카운터는 항상 0이고 프리스케일러 값이 1이면 카운터는 0이고, 1, 0, 1, 0, 1은 이렇게 카운트되며, 0으로 돌아가면 1펄스를 출력하게 됩니다. 이렇게 해서 출력 주파수는 입력 주파수의 2배 값이 됩니다. 실제 주파수 분할 계수에는 숫자의 오프셋이 있습니다.

1.7 카운터 타이밍

이미지.png

  • 카운터 오버플로 주파수: CK_CNT_OV = CK_CNT / (ARR 1) = CK_PSC / (PSC 1) / (ARR 1)
  • CK_INT: 내부 클록 72MHz;
  • CNT_EN: 카운터 활성화, 상승 에지에서 유효;
  • CK_CNT: 카운터 클럭, 주파수 분할 계수가 2이므로 이 주파수는 CK_INT를 2로 나눈 값입니다. 그런 다음 이 클럭의 각 상승 에지에서 카운터가 증가합니다. 0036에 도달하면 오버플로가 발생합니다. 36까지 카운트한 후 또 다른 상승 에지가 발생하고 카운터가 클리어되고 카운터가 오버플로되며 업데이트 이벤트 펄스가 생성됩니다. 또한 업데이트 인터럽트 플래그(UIF)가 설정됩니다. 1로 설정하면 인터럽트가 응답된 후 인터럽트 프로그램에서 수동으로 지워야 합니다.

1.8 카운터에는 사전 설치된 타이밍 시퀀스가 ​​없습니다.

이미지.png
자동 로딩 레지스터가 FF에서 36으로 변경되고, 카운트 값의 목표 값이 FF에서 36으로 변경되었으므로 여기서 36을 카운트한 후 바로 업데이트되어 다음 카운트 라운드를 시작하게 됩니다.

1.9 카운터에는 타이밍이 사전 설치되어 있습니다.

이미지.png
카운트 도중 카운트 목표값을 F5에서 36으로 변경합니다. 아래에 섀도우 레지스터가 있습니다. 이 섀도우 레지스터는 여전히 F5이므로 계산 대상은 여전히 ​​F5로 계산되며 동시에 변경될 36이 섀도우에 전달됩니다. 이 변경은 주기가 36인 경우에만 유효하므로 섀도우 레지스터를 도입하는 목적은 실제로 동기화를 위한 것입니다. 즉, 값 변경 및 업데이트 이벤트가 동기적으로 발생하여 변경으로 인한 오류를 방지하기 위한 것입니다. 작동 중.

1.10 RCC 클록 트리

이미지.png

  • 클럭 소스
    클록 생성 회로에는 4개의 발진 소스가 있습니다.
    (1) HSI: 내부 8MHz 고속 RC 발진기;
    (2) HSE: 외부 4~16MHz 고속 수정 발진기(수정 발진기라고도 함)는 일반적으로 8MHz에 연결됩니다.
    (3) LSE: 일반적으로 RTC용 클록을 제공하는 외부 32.768KHz 저속 수정 발진기.
    (4) LSI: 마지막으로 감시용 클록을 제공할 수 있는 내부 40KHz 저속 RC 발진기가 있습니다.
    위의 두 개의 고속 수정 발진기는 시스템 클럭을 제공하는 데 사용됩니다. AHB, APB2 및 APB1의 클럭은 모두 이 두 개의 고속 수정 발진기에서 파생됩니다. 단지 외부 수정 발진기가 내부보다 안정적이라는 것입니다. RC 발진기는 일반적으로 외부 수정 발진기를 사용합니다.

  • ST 구성 시계
    SystemInit 기능에서 ST는 클록을 구성합니다. 먼저 내부 클록 HSI를 시작하고 내부 8MHz를 시스템 클록으로 선택한 다음 일시적으로 내부 8MHz 클록으로 실행합니다. 그런 다음 외부 클록을 시작하고 주파수 곱셈을 위해 PLL 위상 고정 루프에 들어가도록 외부 클록을 구성합니다. 8MHz를 9배로 곱하면 위상 고정 루프 출력이 안정된 후 위상 고정 루프를 선택합니다. 시스템 클록으로 출력하여 시스템 클록이 8MHz에서 72MHz로 전환됩니다.

  • CSS 시계 보안 시스템
    CSS(시계 보안 시스템): 시계 보안 시스템은 시계 전환도 담당합니다. 외부 시계의 실행 상태를 모니터링할 수 있습니다. 외부 시계가 실패하면 자동으로 외부 시계를 내부 시계로 다시 전환하여 작동을 보장합니다. 시스템 시계의 정지 및 프로그램 중단 방지 사고로 인한 사망.

  • 클럭 분배 회로

    • AHB 버스: 먼저 시스템 클럭 72MHz가 AHB 버스에 들어갑니다. AHB 버스에는 SystemInit에 구성된 분배 계수가 1이므로 AHB 클럭은 72MHz입니다.
    • APB1 버스: 여기에 구성된 분배 계수는 2이므로 APB1 버스의 클럭은 72MHz/2=36MHz입니다.아래에서 APB1 프리스케일러 계수 = 1이면 주파수는 변경되지 않고 유지되고, 그렇지 않으면 주파수는*2, 그리고 오른쪽에는 타이머 2-7에 대해 별도로 열립니다. 여기서 프리스케일러 계수는 2이므로 여기의 주파수는 다음과 같아야 합니다.*2 따라서 타이머 2~7로 이어지는 클럭은 72MHz입니다. 따라서 고급 타이머, 일반 타이머, 기본 타이머 등 내부 기준 클럭은 72MHz입니다.
    • APB2 버스: APB2의 주파수 분할 계수는 1이므로 클럭은 72MHz입니다.그런 다음 APB2에 연결된 클록도 켜집니다. 즉, APB2 프리스케일러 계수 = 1이면 주파수는 변경되지 않고 그대로 유지됩니다.*2 . 주파수 분할 계수가 1이므로 타이머 1과 8의 클럭은 72MHz입니다.
    • 클록 출력 부분에는 출력 제어를 위한 AND 게이트가 있습니다. 제어 비트는 프로그램에서 RCC_APB2/1PeriphClockCmd를 쓰는 곳입니다. 이 위치에 1을 써서 클록을 켭니다. AND 게이트를 통해 주변 장치로 출력될 수 있습니다.

2. TIM 라이브러리 기능 및 코드

2.1 TIM 라이브러리 기능

// 恢复缺省配置
void TIM_DeInit(TIM_TypeDef* TIMx);

// 时基单元初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 结构体变量赋一个默认值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 使能计数器---运行控制
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

// 使能中断输出---中断输出控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

/*-----------------时基单元的时钟选择---------*/
// 选择内部时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

// 选择ITRx其他定时器的时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

// 选择TIx捕获通道的时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

// 选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

// 选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

/*--------------------------------------------------------*/
// 不是用来选择时钟的,单独用来配置ETR引脚的预分频器、极性、滤波参数的
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);

// 用来单独写预分频值的
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

// 用来改变计数器的计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

// 自动重装器预装功能配置
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

// 给计数器写入一个值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

// 给自动重装器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

// 获取当前计数器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

// 获取当前的预分频器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

/*-------------获取标志位和清除标志位的------------*/
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);