STM32 experiencia de aprendizaje nueve: Systick interpretación de pulsos del temporizador y la función de retardo

Grabarlo, para facilitar el futuro ~ leer
contenido principal:
1) y los registros asociados temporizador Systick;.
2) función de correlación Systick e interpretar el retraso código de función.
La información oficial: - "La guía definitiva a Chino Cortex-M3" Capítulo 8, la última sección temporizador --Systick
Qué 1. temporizadores Systick son?
1.1 temporizador Systick es un temporizador simple, para CM3, CM4 núcleo de chip, tiene temporizador Systick;
1,2 Systick comúnmente utilizado para los temporizadores de retardo, reloj del sistema en tiempo real o los latidos del corazón. Esto ahorra recursos MCU, no pierda un temporizador;
1,3 Systick pulsos del temporizador del sistema es un temporizador, un recuento de 24 bits por temporizadores, contadores a 0, de la auto-recarga de tiempo RECARGA registro del valor inicial. Con tal de que no bit de habilitación en el control y registro de estado SysTick aclaró, no cesa, sino que también puede funcionar en un modo de espera;
1.4 temporizador SysTick está ligada en el CNTV, para generar SYSTICK anormalidad (anormalidad No: 15 );
1,5 Systick prioridad de interrupción también se puede ajustar.
2. registros Systick asociados
2.1 CTRL (control SysTick y Registro de Estado)
Aquí Insertar imagen Descripción
1.1.1 Para el STM32, una fuente de reloj externa es HCLK (el reloj de bus AHB) 1/8, un reloj reloj HCLK núcleo;
1.1.2 Configuración Función: SysTick_CLKSourceConfig () ;
2,2 la carga (la adición SysTick valor del registro de auto-recarga)
Aquí Insertar imagen Descripción
2.3 VAL (la corriente SysTick registro de valor)
Aquí Insertar imagen Descripción
2.4 CALIB (SysTick valor de calibración Registro)
Aquí Insertar imagen Descripción
2.4.1 Valor de calibración Registro permiten que el sistema funcione en diferentes productos CM3, puede producir una interrupción SysTick frecuencia constante. El enfoque más simple es: escribir directamente al valor de recarga TeNMS registro, de modo que, siempre y cuando no hay límites del sistema de avance, será capaz de hacerlo una vez cada 10 ms SysTick excepción. Si el período de otras anomalías SysTick, la relación se puede calcular basándose en el valor de TeNMS. Pero, en algunos casos, el chip no puede proporcionar valores CM3 TeNMS (baja por ejemplo, la señal de entrada de calibración CM3 se tira) con precisión, a efectos del seguro, preferiblemente usando una referencia TeNMS manuales antes dispositivo de control.
3. Las funciones de la biblioteca Systick
3.1 firmware de la biblioteca función de correlación Systick:
3.1.1

SysTick_CLKSourceConfig()        //Systick时钟源选择(在misc.c文件中)//

3.1.2

SysTick_Config(uint32_t ticks)      //初始化systick,时钟为HCLK,并开启中断(在core_cm3.h/core_cm4.h文件中)

3,2 Systick función de servicio de interrupción:
3.2.1

void SysTick_Handler(void);

3.3 función SysTick_CLKSourceConfig:

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)    //该函数在misc.c文件中//
{
/*Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if
(SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;                   /*SysTick_CLKSource_HCLK 为0x00000004*/
}
Else
{
SysTick->CTRL &=
SysTick_CLKSource_HCLK_Div8;                               /* SysTick_CLKSource_HCLK_Div8为0xFFFFFFFB)*/
}
}

3.4 función SysTick_Config:

/* @brief  Initialize and start the SysTick counter and its interrupt.*/
/* @param  ticks   number of ticks between two interrupts*/
/* @return  1 = failed, 0 = successful*/
/* Initialise the system tick timer and its interrupt and start the system tick timer / counter in free running mode to generate periodical interrupts.*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)  //该文件位于core_cm3.h中,内核级别//
{ 
if (ticks >SysTick_LOAD_RELOAD_Msk)  return(1);               /* Reload value impossible */ 
/*SysTick_LOAD_RELOAD_Pos    0;*/  
/*SysTick_LOAD_RELOAD_Msk (0xFFFFFFul<<SysTick_LOAD_RELOAD_Pos);*/
/*将SysTick_LOAD_RELOAD_Msk的值设为0xFFFFFF*/
/* set reload register */                                                            
SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; 
/*set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn,(1<<__NVIC_PRIO_BITS) - 1);    /*设置优先级,暂时不细讲*/
SysTick->VAL   = 0;                                           /* Load the SysTick Counter Value */
SysTick->CTRL= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk;  
/* Enable SysTick IRQ and SysTick Timer */
/*SysTick_CTRL_CLKSOURCE_Pos          2;                                      */
/*SysTick_CTRL_CLKSOURCE_Msk         (1ul <<SysTick_CTRL_CLKSOURCE_Pos);      */
/*SysTick_CTRL_TICKINT_Pos            1;                                      */
/*SysTick_CTRL_TICKINT_Msk           (1ul<< SysTick_CTRL_TICKINT_Pos);        */
/*SysTick_CTRL_ENABLE_Pos             0;                                      */
/*SysTick_CTRL_ENABLE_Msk            (1ul<< SysTick_CTRL_ENABLE_Pos);         */
return (0);                                            /* Function successful */
}

3.5 Retardo de manera de lograr retraso interrumpido

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)              /*申明Delay()函数*/
{   
TimingDelay = nTime;  
while(TimingDelay != 0);
}
void SysTick_Handler(void)                   /*申明SysTick_Handler()函数,作用每隔1ms运行该函数*/
{
    if
(TimingDelay != 0x00)                        /*如果TimingDelay不等于0*/
     {       
TimingDelay--;                               /*则TimingDelay减1*/
     }
}
 int main(void)
 {if (SysTick_Config(SystemCoreClock/ 1000))    //systick时钟为HCLK,中断时间间隔1ms//
/*SysTick_Config()函数位于core_cm3.h中,请参考3.4小节,内核级别,若systick时钟选择为HCLK,不分频,则SystemCoreClock时钟频率为72MHz,因此SysTick_Config(72000),意思是以72MHz频率计数72000个ticks需要1ms*/
     {   
while (1);
     }   
while(1)
     {
Delay(200);                                 //延时200ms//}
}

3.6 delay_init función () lee:

void delay_init()
{
//**#if SYSTEM_SUPPORT_OS**//                                            //如果需要支持OS.//
//**u32 reload;**//                
//**#endif**//                  
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);                 //选择外部时钟  HCLK/8//
//**SysTick_CLKSource_HCLK_Div8为0xFFFFFFFB,选择外部时钟源的1/8,请参考3.3小节**//
  fac_us=SystemCoreClock/8000000;                                       //为系统时钟的1/8//  
//**SystemCoreClock时钟频率=HCLK=72MHz,SysTick时钟频率为9MHz,则1us时间内SysTick计数9次**//
//**#if SYSTEM_SUPPORT_OS                                               //如果需要支持OS.//
//**     reload=SystemCoreClock/8000000;                                //每秒钟的计数次数 单位为M//  
//**     reload*=1000000/delay_ostickspersec;                           //根据delay_ostickspersec设定溢出时间//
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右//
//**     fac_ms=1000/delay_ostickspersec;                               //代表OS可以延时的最少单位//          
//**     SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;                       //开启SYSTICK中断//
//**     SysTick->LOAD=reload;                                          //每1/delay_ostickspersec秒中断一次//      
//**     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;                        //开启SYSTICK//    
#else
  fac_ms=(u16)fac_us*1000;                                              //非OS下,代表每个ms需要的systick时钟数//   
#endif
}       

3.7 función void delay_us () lee:

//延时nus,nus为要延时的us数.  //   
void delay_us(u32 nus)
{              
  u32 temp;                   
  SysTick->LOAD=nus*fac_us;                                      //时间加载//                    
  SysTick->VAL=0x00;                                             //清空计数器//
  SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;                       //使能SysTick定时器//         
/*SysTick_CTRL_ENABLE_Pos              0;                                      */
/*SysTick_CTRL_ENABLE_Msk             (1ul<< SysTick_CTRL_ENABLE_Pos);         */  
  do
  {
         temp=SysTick->CTRL;
  }while((temp&0x01)&&!(temp&(1<<16)));                          //等待时间到达//  
//**temp为xxxx xxxx xxxx xxxx | xxxx xxxx xxxx xxx1,因此跟0x01与运算后,其值肯定不是0,而跟(1<<16)与运算后,不确定,若不为0,则说明COUNTFLAG值为1,经逻辑非运算符!后,值为0,则while(0),跳出循环。否则,while(1)**//
  SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;                       //关闭计数器//
  SysTick->VAL =0X00;                                            //清空计数器//       
}

3.8 Delay_ms función void () lee:

//延时nms//
//SysTick->LOAD为24位寄存器,所以,最大延时为: nms<=0xffffff*8*1000/SYSCLK//
//SYSCLK单位为Hz,nms单位为ms,对72M条件下,nms<=1864 //
void delay_ms(u16 nms)
{                            
  u32 temp;                 
  SysTick->LOAD=(u32)nms*fac_ms;                                     //时间加载(SysTick->LOAD为24bit)//
  SysTick->VAL =0x00;                                                //清空计数器//
  SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;                           //使能SysTick定时器// 
/*SysTick_CTRL_ENABLE_Pos              0;                                   */
/*SysTick_CTRL_ENABLE_Msk             (1ul<< SysTick_CTRL_ENABLE_Pos);      */
  do
  {
         temp=SysTick->CTRL;
  }while((temp&0x01)&&!(temp&(1<<16)));                              //等待时间到达//   
//**temp为xxxx xxxx xxxx xxxx | xxxx xxxx xxxx xxx1,因此跟0x01与运算后,其值肯定不是0,而跟(1<<16)与运算后,不确定,若不为0,则说明COUNTFLAG值为1,经逻辑非运算符!后,值为0,则while(0),跳出循环。否则,while(1)**//
  SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;                           //关闭计数器//
  SysTick->VAL =0X00;                                                //清空计数器//               
} 
#endif

El conocimiento
; 1) registrarse Systick familiarizados con su función de temporizador asociado
2) Sistema de revisión pertinente reloj de conocimiento, de referencia puede STM32 experiencia de aprendizaje VII: Interpretación funciones STM32 sistema de reloj diagrama de bloques relacionados y
3) revisar la dirección del registro de asignación de nombres, consulte STM32 aprende experiencia de seis: C relacionada con el aprendizaje de idiomas y la lectura de registro de direcciones de asignación de nombres

Publicado 24 artículos originales · ganado elogios 2 · Vistas 4123

Supongo que te gusta

Origin blog.csdn.net/Leisure_ksj/article/details/105273110
Recomendado
Clasificación