原创 【STM32技术笔记】(三) 系统时钟定时器

2009-9-27 23:04 5233 2 3 分类: MCU/ 嵌入式

(三) 系统时钟定时器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


一、 本课内容概述


这一课的主要内容是STM32系统时钟定时器systick的配置以及如何产生精确延时。 



通常实现Delay(N)函数的方法为:


for(i = 0; i <= x; i ++); 


 x  ---  对应于 对应于毫秒的循环值


对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)


对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)



注: 全局变量TimingDelay    必须定义为volatile




二、 SysTick的配置使用方法


外部晶振为8MHz9倍频,系统时钟为72MHzSysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9,将SysTick 时钟设置为9MHz, 就能够产生1us的时间基值,即SysTick产生1us的中断。


使用ST的函数库使用systick的方法


1、调用SysTick_CounterCmd() 失能SysTick计数器


2、调用SysTick_ITConfig () 失能SysTick中断 


3、调用SysTick_CLKSourceConfig() 设置SysTick时钟源。


4、调用SysTick_SetReload() 设置SysTick重装载值。


5、调用SysTick_ITConfig ()     使能SysTick中断


6、调用SysTick_CounterCmd() 开启SysTick计数器


7、去掉stem32f10x_conf.c文件里面关于SysTick的注释,包含编译相关文件


8、在FWLIB里面加入stm32f10x_systick.c


9、修改工程设置,把中断向量表指向FLASH空间:project-option-C/C++ Complier-Processor-Defined symbols改为VECT_TAB_FLASH






三、 相关程序



(1)建立systick.c文件


新建systick.c文件,作为systick相关函数的子函数,子函数里面应包括:SysTick_Init,SysTickDelayUs, TimingDelayMs_Decrement三个函数,由于程序用到一个存放中断计数值的全局变量,而我们将次变量与main.c文件中定义,因此还要在这个文件中做外部引用定义:extern vu32 TimingDelay;,再把系统初始化头文件包括,就完成了此文件的建立:#include "systemInit.h"



#include "systemInit.h"


extern vu32 TimingDelay;



SysTick   初始化函数


/*******************************************************************************


* Function Name  : SysTick_Config


* Description    : Configures SysTick


* Input          : None


* Output         : None


* Return         : None


*******************************************************************************/


//SysTick设置


void SysTick_Init(void)


{


    /* Disable SysTick Counter */


    SysTick_CounterCmd(SysTick_Counter_Disable);


  


    /* Disable the SysTick Interrupt */


    SysTick_ITConfig(DISABLE);


  


    /* Configure HCLK clock as SysTick clock source */


    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);



    /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */


    SysTick_SetReload(9);



    /* Enable the SysTick Interrupt */


    SysTick_ITConfig(ENABLE);


}



SysTickDelayMs  延迟一微秒函数


/*******************************************************************************


* Function Name  : SysTickDelayUs


* Description    : Inserts a delay time.


* Input          : nTime: specifies the delay time length, in milliseconds.


* Output         : None


* Return         : None


*******************************************************************************/


void SysTickDelayUs(u32 nTime)


{


  /* Enable the SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Enable);


  


  TimingDelay = nTime;



  while(TimingDelay != 0);



  /* Disable SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Disable);


  /* Clear SysTick Counter */


  SysTick_CounterCmd(SysTick_Counter_Clear);


}



TimingDelayMs_Decrement    中断调用函数 


/*******************************************************************************


* Function Name  : TimingDelayMs_Decrement


* Description    : Decrements the TimingDelay variable.


* Input          : None


* Output         : TimingDelay


* Return         : None


*******************************************************************************/


void TimingDelay_Decrement(void)


{


  if (TimingDelay != 0x00)


  { 


    TimingDelay--;


  }


} 



SysTickHandler  中断进入函数


/*******************************************************************************


* Function Name  : SysTickHandler


* Description    : This function handles SysTick Handler.


* Input          : None


* Output         : None


* Return         : None


*******************************************************************************/


void SysTickHandler(void)


{


  TimingDelay_Decrement();


}


NVIC_Configuration 中断向量表配置



/*******************************************************************************


* Function Name  : NVIC_Configuration


* Description    : Configures NVIC and Vector Table base location.


* Input          : None


* Output         : None


* Return         : None


*******************************************************************************/


void NVIC_Configuration(void)


{


#ifdef  VECT_TAB_RAM


  /* Set the Vector Table base location at 0x20000000 */


  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);


#else  /* VECT_TAB_FLASH  */


  /* Set the Vector Table base location at 0x08000000 */


  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);


#endif


}



(2)修改systemInit.h文件


由于在其他C文件中要用到systick.c定义的一些函数,因此我们在systemInit.h中进行外部函数声明:


extern void SysTick_Init(void);


extern void SysTickDelayUs(u32);


extern void TimingDelay_Decrement(void);



(3)修改中断文件stm32f10x_it.c


由于我们用到了systick系统时钟计数器中断计数的方法来产生延时,因此,我们必须在此文件中修改相应的中断函数,打开stm32f10x_it.c找到相应的函数,加入中断计数函数。



/*******************************************************************************


* Function Name  : SysTickHandler


* Description    : This function handles SysTick Handler.


* Input          : None


* Output         : None


* Return         : None


*******************************************************************************/


void SysTickHandler(void)


{


  TimingDelay_Decrement(); //中断计数函数


}



由于在此文件中调用了TimingDelay_Decrement()函数,因此必须将对此函数进行了外部声明的头文件systemIni.h包括进来:



/* Includes ------------------------------------------------------------------*/


#include "stm32f10x_it.h"


#include "systemInit.h"



(3)修改main.c文件


由于使用了全局变量TimingDelay,因此要进行定义:vu32 TimingDelay;,而要完成sistick的初始化,我们要在系统初始化总程序System_Init()里引用SysTick_Init();函数。


根据需要编写我们的应用主程序,给出一个实现流水灯的例程:



/*******************************************************************************


* Function Name  : main


* Description    : Main program.


* Input          : None


* Output         : None


* Return         : None


*******************************************************************************/


int main(void)


{


  System_Init();


  while (1)


  {


    LED1_H;


    SysTickDelayUs(500000);


    LED1_L;


    SysTickDelayUs(500000);


    LED2_H;


    SysTickDelayUs(500000);


    LED2_L;


    SysTickDelayUs(500000);  


    LED3_H;


    SysTickDelayUs(500000);


    LED3_L;


    SysTickDelayUs(500000);


    LED4_H;


    SysTickDelayUs(500000);


    LED4_L;


    SysTickDelayUs(500000);


  }


}



至此,全部的修改与配置结束,enjoy it


 


工程文件:https://static.assets-stash.eet-china.com/album/old-resources/2009/9/27/2cae4dab-e58f-4b18-8b79-c463fcf8cf49.rar


PDF教程:点击下载

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户243633 2009-10-31 12:52

呵呵,太感谢啦,继续努力吧,支持!~~~
相关推荐阅读
用户1622812 2009-09-27 23:03
【STM32技术笔记】(一)IAR工程的创建及LED跑马灯
(一)IAR工程的创建及LED跑马灯<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />...
用户1622812 2009-09-27 23:02
【STM32技术笔记】(二)按键驱动
(二)按键驱动<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />一、    本课内容概...
EE直播间
更多
我要评论
1
2
关闭 站长推荐上一条 /3 下一条