Série STM32CubeMX | Interrupção do temporizador

Interrupção do temporizador

1. Introdução à interrupção do cronômetro

A função de cronômetro do STM32 é muito poderosa, incluindo cronômetros avançados (TIM1 e TIM8), cronômetros gerais (TIM2 ~ TIM5) e cronômetros básicos (TIM6 e TIM7); este experimento apresenta principalmente cronômetros gerais com dificuldade moderada, cronômetros gerais É um contador de carregamento automático de 16 bits acionado por um prescaler programável. É adequado para muitas ocasiões, incluindo a medição do comprimento do pulso do sinal de entrada (captura de entrada) ou geração de formas de onda de saída (comparação de saída e PWM). Usando o prescaler temporizador e o prescaler controlador de clock RCC, a duração do pulso e o período da forma de onda podem ser ajustados de vários microssegundos a vários milissegundos. Cada cronômetro é totalmente independente e não compartilha nenhum recurso entre si.
Funções de temporizador TIMx comuns (TIM2, TIM3, TIM4 e TIM5) incluem:

  • Contador de carga automática de 16 bits para cima, para baixo, para cima / para baixo
  • Prescaler programável de 16 bits (pode ser modificado em tempo real), o coeficiente de divisão da frequência do relógio do contador é qualquer valor entre 1 e 65536
  • 4 canais independentes:
    ─ Captura de entrada
    ─ Comparação de saída
    ─ Geração de PWM (modo de alinhamento de borda ou centro)
    ─ Saída de modo de pulso único
  • Use o sinal externo para controlar o temporizador e o circuito de sincronização de interconexão do temporizador
  • A interrupção / DMA é gerada quando os seguintes eventos ocorrem:
    ─ Atualização: estouro / downflow do contador, inicialização do contador (por software ou gatilho interno / externo)
    ─ Evento do gatilho (início do contador, parada, inicialização ou contagem por gatilho interno / externo)
    ─ Captura de
    entrada - comparação de saída
  • Suporta codificador incremental (quadratura) e circuitos de sensor Hall para posicionamento
  • Entrada de disparo como relógio externo ou gerenciamento de corrente de ciclo

Diagrama de bloco do cronômetro de uso geral

Insira a descrição da imagem aqui
Parte da base de tempo do cronômetro

Insira a descrição da imagem aqui

2. Design de hardware

Este experimento usa a interrupção de TIM3 para controlar a ativação e desativação de D1, que requer recursos de hardware

  • Luzes indicadoras D1 e D2
  • Timer TIM3

Insira a descrição da imagem aqui

3. Design de software

3.1 Configurações STM32CubeMX
  • RCC definido HSE externo, relógio definido para 72 MHz; relógio TIM3 montado em APB1 Time Clocks é 72 MHz
  • PC0 / PC1 está definido para o modo de saída push-pull GPIO, pull-up, alta velocidade e o nível de saída padrão é alto
  • Ative o temporizador TIM3, selecione o relógio interno como a fonte do relógio, defina o prescaler PSC para 7200-1, conte e defina o valor de recarga automática (ARR) para 10000-1. Ative a interrupção do temporizador TIM3 na configuração NVIC; de acordo com a fórmula Pode ser calculado: o contador CK_CNT = 72M / 7200 = 10000Hz, o tempo de interrupção do temporizador é ARR / 10000 = 1s

Insira a descrição da imagem aqui

  • Insira o nome do projeto, selecione o caminho do projeto (sem chinês), selecione MDK-ARM V5; marque Inicialização de periféricos gerados como um par de arquivos '.c / .h' por IP; clique em GERAR CÓDIGO para gerar o código do projeto
3.2 Programação MDK-ARM
  • Você pode ver a função de inicialização do temporizador no arquivo tim.c
void MX_TIM3_Init(void){
    
    
  TIM_ClockConfigTypeDef sClockSourceConfig = {
    
    0};
  TIM_MasterConfigTypeDef sMasterConfig = {
    
    0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 7200-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 10000-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
    
    
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){
    
    
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){
    
    
    Error_Handler();
  }
}

Encontre o ciclo de símbolo fraco para executar o protótipo da função de retorno de chamada e personalize a função de retorno de chamada em tim.c
__weak void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    
    
	if(htim == &htim3){
    
    
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);	//LED1状态每1s翻转一次
	}
}
  • Escreva o código relevante na função principal e faça o LED2 virar a cada 500ms enquanto
int main(void){
    
    
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);		//启动定时器中断模式计数
  /* USER CODE END 2 */
  while (1){
    
    
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);	//LED2状态每500ms翻转一次
	HAL_Delay(500);
  }
}

4. Baixar verificação

Depois que a compilação estiver correta, baixe para a placa de desenvolvimento, você pode ver que o estado do LED1 muda uma vez a cada 1s, e o estado do LED2 muda uma vez a cada 500ms

Acho que você gosta

Origin blog.csdn.net/Chuangke_Andy/article/details/108590136
Recomendado
Clasificación