您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > stm32定时器参考资料
一、本课内容概述这一课的主要内容是STM32系统时钟定时器systick的配置以及如何产生精确延时。通常实现Delay(N)函数的方法为:for(i=0;i=x;i++);x---对应于对应于N毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。注:全局变量TimingDelay必须定义为volatile二、SysTick的配置使用方法外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为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.c9、修改工程设置,把中断向量表指向FLASH空间:project-option-C/C++Complier-Processor-Definedsymbols改为VECT_TAB_FLASH相关程序1.(1)建立systick.c文件2.新建systick.c文件,作为systick相关函数的子函数,子函数里面应包括:SysTick_Init,SysTickDelayUs,TimingDelayMs_Decrement三个函数,由于程序用到一个存放中断计数值的全局变量,而我们将次变量与main.c文件中定义,因此还要在这个文件中做外部引用定义:externvu32TimingDelay;,再把系统初始化头文件包括,就完成了此文件的建立:#includesystemInit.h。3.(2)修改systemInit.h文件4.由于在其他C文件中要用到systick.c定义的一些函数,因此我们在systemInit.h中进行外部函数声明:5.externvoidSysTick_Init(void);6.externvoidSysTickDelayUs(u32);7.externvoidTimingDelay_Decrement(void);8.(3)修改中断文件stm32f10x_it.c9.由于我们用到了systick系统时钟计数器中断计数的方法来产生延时,因此,我们必须在此文件中修改相应的中断函数,打开stm32f10x_it.c找到相应的函数,加入中断计数函数。10.11.voidSysTickHandler(void)12.{13.TimingDelay_Decrement();//中断计数函数14.}15.由于在此文件中调用了TimingDelay_Decrement()函数,因此必须将对此函数进行了外部声明的头文件systemIni.h包括进来:16.17.#includestm32f10x_it.h18.#includesystemInit.h19.(3)修改main.c文件20.由于使用了全局变量TimingDelay,因此要进行定义:vu32TimingDelay;,而要完成sistick的初始化,我们要在系统初始化总程序System_Init()里引用SysTick_Init();函数。21.根据需要编写我们的应用主程序,给出一个实现流水灯的例程:22.23.intmain(void)24.{25.System_Init();26.while(1)27.{28.LED1_H;29.SysTickDelayUs(500000);30.LED1_L;31.SysTickDelayUs(500000);32.LED2_H;33.SysTickDelayUs(500000);34.LED2_L;35.SysTickDelayUs(500000);36.LED3_H;37.SysTickDelayUs(500000);38.LED3_L;39.SysTickDelayUs(500000);40.LED4_H;41.SysTickDelayUs(500000);42.LED4_L;43.SysTickDelayUs(500000);44.}45.}46.#includesystemInit.h47.externvu32TimingDelay;48.SysTick初始化函数49.50.//SysTick设置51.voidSysTick_Init(void)52.{53.54.SysTick_CounterCmd(SysTick_Counter_Disable);55.56.57.SysTick_ITConfig(DISABLE);58.59.60.SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);61.62.SysTick_SetReload(9);63.64.SysTick_ITConfig(ENABLE);65.}66.SysTickDelayMs延迟一微秒函数67.68.voidSysTickDelayUs(u32nTime)69.{70.71.SysTick_CounterCmd(SysTick_Counter_Enable);72.73.TimingDelay=nTime;74.while(TimingDelay!=0);75.76.SysTick_CounterCmd(SysTick_Counter_Disable);77.78.SysTick_CounterCmd(SysTick_Counter_Clear);79.}80.TimingDelayMs_Decrement中断调用函数81.82.voidTimingDelay_Decrement(void)83.{84.if(TimingDelay!=0x00)85.{86.TimingDelay--;87.}88.}89.SysTickHandler中断进入函数90.91.voidSysTickHandler(void)92.{93.TimingDelay_Decrement();94.}95.NVIC_Configuration中断向量表配置96.97.voidNVIC_Configuration(void)98.{99.#ifdefVECT_TAB_RAM100.101.NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);102.#else103.104.NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);105.#endif106.}对定时器的基本配置TIM_TimeBaseStructure.TIM_Period=1000;//设置自动装载寄存器TIM_TimeBaseStructure.TIM_Prescaler=35999;//分频计数TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择向上计数TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_Cmd(TIM2,ENABLE);//是能定时器始能定时器的中断:TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);在开启时钟里一定要打开TIM2的时钟,函数表达式如下:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);4:中断向量函数的编写:voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;#ifdefVECT_TAB_RAM//如果程序在ram中调试那么定义中断向量表在Ram中否则在Flash中/*SettheVectorTablebaselocationat0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#else/*VECT_TAB_FLASH*//*SettheVectorTablebaselocationat0x08000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif/*EnabletheTIM2globalInterrupt*/NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}5:中断函数的编写:当有TIM2的无论哪个中断触发中断发生那么就会进入这个函数TIM2_IRQHandler(void)所以这个更新事件的中断判断要依靠以下语句:if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)按照以上步骤配置可以顺利进行定时器的基本定时应用第二种方法:/*EnableTIM2Updateinterrupt[TIM2溢出中断允许]*/TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);中断中的设置为:if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)STM32定时器定时时间的计算假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的RCC-CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler)/72M)*(1+TIM_Period)=((1+7199)/72M)*(1+9999)=1秒*/定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler=7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period=9999;//自动重装载寄存器周期的值(定时时间)累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up;//定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision=0x0;//时间分割值5、TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初
本文标题:stm32定时器参考资料
链接地址:https://www.777doc.com/doc-4358352 .html