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
Parte da base de tempo do cronômetro
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
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 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