//=========================================================================
// TIM_Configuration(void)
// 设置TIMER-2定时器 为计数溢出中断,1毫秒中断一次
// TIM2、3、4的时钟源是 APB1 即是 PCLK1 ( APB1 对应 PCLK1 )
// PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ)
// 结果 自动倍频器*2;还原为72MHZ!!!!
//=========================================================================
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure ;
//TIM_DeInit( TIM3);//复位TIM3定时器
STM32_Rcc_Regs->apb1rstr.all |= RCC_TIM3RST;
STM32_Rcc_Regs->apb1rstr.all &= ~RCC_TIM3RST;
/* TIM3 configuration */
//TIM_TimeBaseStructure.TIM_Period = 1000; // 定时1毫秒
//TIM_TimeBaseStructure.TIM_Prescaler = 72; // 72分频
//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时钟分割
//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
//TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
STM32_Tim3_Regs->arr.all=1000; // 定时1毫秒
STM32_Tim3_Regs->psc.all=72; // 72分频
STM32_Tim3_Regs->cr1.bit.CKD=0; // 时钟分频因子
STM32_Tim3_Regs->cr1.bit.DIR=0; // 0:计数器向上计数
/* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
//TIM_ClearFlag(TIM2, TIM_FLAG_Update);
STM32_Tim3_Regs->sr.bit.UIF=0; // 更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化
/* TIM2 enable counter [允许tim3计数]*/
//TIM_Cmd(TIM3, ENABLE);
STM32_Tim3_Regs->cr1.bit.CEN=1;// 开启计数器
/* Immediate load of TIM3 Precaler value */
STM32_Tim3_Regs->egr.bit.UG=1;//1:重初始化计数器,并产生一个更新事件。注意预分频器的计数器也被清0
STM32_Tim3_Regs->sr.bit.UIF=0;// 更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化
/* Enable TIM3 Update interrupt [TIM2溢出中断允许]*/
//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
STM32_Tim3_Regs->dier.bit.UIE=1;// UIE:允许更新中断 1:允许更新中断
}
//=====================================//
//在 stm32f10x_it.c内的中断函数
// STM32的外设中断 要 软件来清零。
//
// STM32的外设中断 要 软件来清零。
void TIM3_IRQHandler(void)
{
// if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//((u16)0x0001)
if (STM32_Tim3_Regs->sr.bit.UIF && STM32_Tim3_Regs->dier.bit.UIE)
{
//TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //((u16)0x0001)
STM32_Tim3_Regs->sr.bit.UIF=0;//更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化
if(++myclock.nSec>=500) //500 ms
{
myclock.nSec=0;
CPLBIT( myclock.flag,F_nSec);
}
if(CHECKBIT(myclock.flag,F_nSec)){
// GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED4
STM32_Gpioc_Regs->bsrr.bit.BR4 =1;// 1:清除对应的ODRy位为0
}
else {
//GPIO_SetBits(GPIOC, GPIO_Pin_4); //开LED4
STM32_Gpioc_Regs->bsrr.bit.BS4 =1;// 1:设置对应的ODRy位为1
}
}
}//END SUB
用户1311798 2011-1-17 17:36
用户31586 2007-3-22 09:54
用户70771 2006-12-31 16:35