TIM3是归于通用守时器,程序中选用APB1的时钟(PCLK1),72MHz。
程序中TIM3采纳上溢出,即0—ARR时溢出。
上述程序的TIM3的频率为(PCLK1*2)/(36000-1+1)=2KHz,其间PCLK1为36MHz,故计数2000次为1s
运用守时器守时的过程:
1、在RCC里翻开相应的守时器时钟
2、在NVIC里翻开相应的中止
3、在TIMx_Configuration()进行相应的设置,大致过程为
a)TIM_TimeBaseStructure.TIM_Period = 2000-1; // 主动重装载寄存器周期的值(守时时刻) 累计 2000个频率后产生个更新或许中止(也是说守时时刻到),也便是ARR的值
b) TIM_TimeBaseStructure.TIM_Prescaler =36000-1;//时钟预分频数 例如:时钟频率=72M/(时钟预分频+1)
c) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //守时器形式 向上计数
d) TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时刻切割值
e) TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化守时器3
f) TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //翻开中止 溢出中止
g) TIM_Cmd(TIM3, ENABLE);//翻开守时器
/*****************************************************************************例程称号:TIM3硬件衔接:指示灯衔接 PE0功用描绘:用TIM3守时1s,指示灯闪耀一下**/#include "stm32f10x_lib.h"/******************************************************************************************* 函数称号 :void RCC_Configuration()* 功用描绘 : 复位和时钟操控 装备* 参数 : 无* 返回值 : 无* 大局变量 : 无* 大局静态变量: 无* 部分静态变量: 无******************************************************************************************/void RCC_Configuration(){ErrorStatus HSEStartUpStatus; //界说外部高速晶振发动状况枚举变量RCC_DeInit(); //复位RCC外部寄存器到默认值RCC_HSEConfig(RCC_HSE_ON); //翻开外部高速晶振HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等候外部高速时钟准备好if(HSEStartUpStatus==SUCCESS){ //外部高速时钟现已准备好FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //敞开FLASH预读缓冲功用,加快FLASH的读取。一切程序中有必要的用法,方位:RCC初始化子函数里边,时钟起振之后FLASH_SetLatency(FLASH_Latency_2); //FLASH时序推迟几个周期,等候总线同步操作。引荐依照单片机体系运转频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。RCC_HCLKConfig(RCC_SYSCLK_Div1); //装备AHB(HCLK)==体系时钟/1RCC_PCLK2Config(RCC_HCLK_Div1); //装备APB2(高速)(PCLK2)==体系时钟/1 RCC_PCLK1Config(RCC_HCLK_Div2); //装备APB1(低速)(PCLK1)==体系时钟/2//注:AHB首要担任外部存储器时钟。APB2担任AD,I/O,高档TIM,串口1。APB1担任DA,USB,SPI,I2C,CAN,串口2345,一般TIM。RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //装备PLL时钟==(外部高速晶体时钟/1)* 9 ==72MHzRCC_PLLCmd(ENABLE); //使能PLL时钟while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等候PLL时钟安排妥当RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //装备体系时钟==PLL时钟while(RCC_GetSYSCLKSource()!=0x08); //等候体系时钟源的发动}//------------------------以下为敞开外设时钟的操作-----------------------//// RCC_AHBPeriphClockCmd (ABP2设备1 | ABP2设备2 , ENABLE); //发动AHB设备// RCC_APB2PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //发动ABP2设备// RCC_APB1PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //发动ABP1设备RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //翻开GPIOE 和 AFIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //翻开TIM2时钟} /******************************************************************************************* 函数称号 : NVIC_Configuration(void)* 功用描绘 : NVIC(嵌套中止操控器)装备* 参数 : 无* 返回值 : 无* 大局变量 : 无* 大局静态变量: 无* 部分静态变量: 无******************************************************************************************/ void NVIC_Configuration( ){NVIC_InitTypeDef NVIC_InitStructure; //界说一个中止结构体//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //设置中止向量表的开始地址为0x08000000//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先等级设置为无抢占优先级//注:总共16个优先级,分为抢占式和呼应式。两种优先级所占的数量由此代码确认,NVIC_PriorityGroup_x可所以0、1、2、3、4,//别离代表抢占优先级有1、2、4、8、16个和呼应优先级有16、8、4、2、1个。规则两种优先级的数量后,一切的中止等级有必要在其间挑选,//抢占等级高的会打断其他中止优先履行,而呼应等级高的会在其他中止履行完优先履行。NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;; //指定中止源NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定呼应优先等级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定抢占优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //翻开 中止通道 NVIC_Init(&NVIC_InitStructure); //初始化}