STM32 Capítulo VI - Contador de tiempo Comentarios

Temporizador (Timer) es el tiempo de la función más básica, tales como los datos de transmisión de temporización USART, los datos de tiempo y el anuncio adquirido similares. Si se utiliza el contador de tiempo, entonces se combinan con el GPIO puede lograrse una funcionalidad muy rica, puede medir el ancho de pulso de la señal de entrada, la forma de onda de salida puede ser producida. PWM Producción estado del temporizador de control del motor es común en el método de control industrial, este conocimiento es necesario conocimiento.
controlador de la serie STM32F4xx tiene dos temporizadores de control avanzadas, 10 temporizadores de uso general y dos temporizador básico.
Aquí Insertar imagen Descripción
Aquí la frecuencia de reloj temporizador común dividido por la relación de división de frecuencia determinada APB1, si la relación de división pre-APB1 1 es la frecuencia de reloj, la frecuencia de reloj es igual a la APB1 temporizador común es el reloj de otro modo APB1 dos veces.

Fuente de reloj

Para lograr el temporizador debe contar fuente de reloj, sustancialmente único reloj temporizador del reloj interno, temporizadores de uso general y control avanzado también pueden seleccionar una fuente de reloj externa o directamente desde el otro modo de temporizador de espera . Podemos configurar el registro de reloj utilizado RCC (RCC_DCKCFGR) el establecimiento de todas las frecuencias de reloj de bit temporizadores TIMPRE, generalmente nos fijamos en el valor predeterminado del bit 0, por lo que la tabla de selección de reloj temporizador máxima de 90 MHz, es decir, el temporizador básico reloj interno (CK_INT) la frecuencia de 90 MHz . El temporizador básico sólo puede utilizar el reloj interno , y cuando el control TIM6 TIM7 registrar una posición CEN 1 1 (TIMx_CR1), se inicia el temporizador básicos, la fuente de reloj y prescaler es CK_INT. Para el control de la fuente de reloj avanzados temporizadores de propósito general pueden llegar a un controlador externo reloj, temporizadores, etc. Otros patrones, más compleja.
Aquí Insertar imagen Descripción
Uso SystenInit inicialización de la función, cada uno de la frecuencia de reloj es la siguiente:
la SYSCLK = 72M
la AHB reloj 72M =
reloj APB1 = 36M
tan factor de división APB1 = AHB / APB1 = 2
frecuencia de reloj es de este modo disponible CK_INT 2 * 36M = 72M.
la necesidad contador de frecuencia final para ir a través de pre-escalador PSC calculada para dar
Aquí Insertar imagen Descripción

contador

Básica proceso de recuento del temporizador implica tres contenidos principales de registro, que están contador de registro (como TIMx_CNT) , Registro prescaler (TIMx_PSC) , registro de auto-recarga (en TIMx_ARR) , los tres registros son 16 dígitos significativos, es decir, valor puede ajustarse de 0 a 65.535.
Aquí Insertar imagen Descripción

se calcula período Timer

Un evento de temporización generada por el tiempo principal TIMx_PSC y TIMx_ARR determina dos valores de registro, es decir, el período del temporizador. Por ejemplo, necesitamos un ciclo de 1s temporizador, dos valores de registro específica cómo configurar?
Supongamos, fijamos TIMx_ARR valor del registro 9999, es decir, primero, cuando contados a partir de 0 TIMx_CNT, justo igual a la evento generado 9999, un total de 10.000 conteos, a continuación, si la fuente de reloj en este momento para obtener un período de 100us en el período de tiempo exactamente 1s.
La siguiente pregunta es dispuestos de manera que el valor del registro TIMx_PSC CK_CNT período 100us salida (10000Hz) reloj. CK_PSC reloj de entrada prescaler es 90 MHz, de modo que el valor prescaler (9000-1) puede ser satisfecho.

estructura de inicialización del temporizador detallada

typedef struct
 {
		uint16_t TIM_Prescaler;              // 预分频器
		uint16_t TIM_CounterMode;        // 计数模式
		uint32_t TIM_Period;                   // 定时器周期
		uint16_t TIM_ClockDivision;       // 时钟分频
		uint8_t TIM_RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;

(1) TIM_Prescaler: se proporciona Timer prescaler, a través del cual el prescaler reloj es el temporizador de reloj de fuente, que establece el valor de la TIMx_PSC registro. Se puede ajustar en el rango 0-65535, 1-65536 división logra. ¿Por qué participar en un pre-escalador, es debido a que la frecuencia de reloj del sistema es demasiado rápido, 90MHz ah, que la mayoría de la gente no puede soportar el contador de tiempo tan rápido, por lo que divide y dejar que su frecuencia de reloj al temporizador un poco menos, nada más.
(2) TIM_CounterMode: recuento del temporizador, pero para el conteo y recuento por el centro de tres tipos de modos de alineación. El temporizador básica está contando hasta solamente, es decir, solamente TIMx_CNT incrementa de 0, y no tiene por qué ser inicializado.
(3) TIM_Period: período del temporizador, el valor real se ajusta a registrar automáticamente recarga, actualización del registro sombra cuando la generación de eventos. Se puede establecer en el rango 0-65535.
valor de registro automático de recarga: por ejemplo, desea encender el agua en el interior del cubo, lleno de agua después de él drenado. Que el agua sobre las necesidades de agua ¿Cuánto hay que hacer? darle un valor establecido, gota gota gota era de más de 100.000, lo toma drenado. Después de drenado, la caída de restablecimiento 10.000 gotas, escurridos y llenan entonces ...
(4). TIM_ClockDivision: frecuencia de reloj, la frecuencia de reloj de muestreo filtro digital temporizador de reloj de ajuste CK_INT y la relación de división de frecuencia, esta función no está temporizador básico, no establecido.
(5) TIM_RepetitionCounter: repetición del contador, registros son de control avanzado bit de registro dedicado, que puede ser controlada muy fácilmente utilizando el número de salidas PWM. Aquí no se establece.

La configuración del programa

ajuste del temporizador de propósito general, y genera una interrupción correspondiente, dividido en los siguientes pasos (en el ejemplo TIM3)

  1. reloj TIM3 permiten
  2. TIM3_ARR y el valor de ajuste TIM3_PSC
  3. Conjunto TIM3_DIER autorizado a actualizar interrupción
  4. permiso de trabajo TIM3
  5. la configuración del grupo de interrupción TIM3
  6. Escribir la rutina de servicio de interrupción
void TIM3_Int_Init()
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef    NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	TIM_TimeBaseStructure.TIM_Prescaler =7199;     //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_Period  = 4999;        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;    //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 
	TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设							 
}

Debe activar el reloj temporizador antes de usar el temporizador, el temporizador básica pertenecen periféricos de bus APB1. APB1 de reloj de bus periférico = 72M.
Hemos establecido el reloj de recargar automáticamente el valor del temporizador registro 4999 arr proporcionado PSC reloj prescaler valor del registro de 7199, la conducción del contador: CK_CNT = APB1Periph / (7199 + 1) = 72M / 7200 = 10 K, un contador de tiempo es igual a: 1 / CK_CNT = 0.0001s = 0,1 ms = 100us, cuando el contador cuenta de 0 a 4999, se genera la interrupción, el tiempo de tiempo de interrupción: 100us 5000 0.0001s = 5,000 = 0,5 s = 500 ms es la mitad de un segundo.

void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		LED1=!LED1;
		}
}

Esta rutina de servicio de interrupción para iniciar con función de si las declaraciones, TIM_GetITStatus () para determinar si TIM3 interrupción ocurre, la interrupción se produce si es autorizado TIM3 interrupción bandera. Let LED1 luces de marcha atrás.

 int main(void)
 {	
	delay_init();	    	 //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	LED_Init();		  	//初始化与LED连接的硬件接口
	TIM3_Int_Init();   //10Khz的计数频率,计数到5000为500ms  
   	while(1)
	{
		LED0=!LED0;
		delay_ms(200);		   
	}
}

En primer lugar, la función principal de la función de retardo Inicializar interrupción paquetes de prioridad 2, inicializa interfaz de hardware conectado al LED, el temporizador 3 se inicializa. Hasta ahora LED0 le dará la vuelta aproximadamente cada 0,5 segundos. Al mismo tiempo, tenemos que hacer la comparación en 0,2 segundos, mientras que la función de la lámpara LED1 darle la vuelta a hacer la comparación.
Ahora usamos la simulación Keil para ver si no es LED0 es 0,2 ms darle la vuelta, LED1 se 0.5ms darle la vuelta.
1. Configurar la simulación Keil herramientas de depuración.
Aquí Insertar imagen Descripción
2. Abra la puesta en marcha, después de entrar en la interfaz de depuración, ventana de análisis lógica abierta, y establecer el pin de salida PWM
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
3. Haga clic correr a toda velocidad, observar el osciloscopio
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
puede ver claramente LED0 es 0,5 ms para voltear una vez.
4. Otra configuración LED1 misma manera y se encontró que aproximadamente 0,2 ms invertidos, y el mismo programa de configuración.
Aquí Insertar imagen Descripción
Resumen: Utilizamos un temporizador cuando sobre todo para borrar la relación de división y valor de recarga. Los dos decidieron midió el tiempo que desea que la otra STM32 En caso de que desee utilizar un temporizador, una función de temporizador, y luego midió el tiempo que necesita para realizar la acción apropiada, situado en el interior de la función de servicio de interrupción a escribir el código en la línea, con un descanso también, estar haciendo algo que ver directamente en su función de servicio de la respuesta en la línea. Hay temporizadores y contadores, temporizadores, contadores que ah. No se logra primer recuento, recuento, en cierta medida desbordamiento cronometré? Así que los principiantes no hacer maraña.

Publicado 34 artículos originales · ganado elogios 22 · vistas 9521

Supongo que te gusta

Origin blog.csdn.net/qq_39400113/article/details/105245441
Recomendado
Clasificación