使用定时器做延时

使用103C8T6,使用8M无源晶振,系统时钟为72M

使用定时器2(TIMER2)

/*中断周期为10us*/

uint32_t time_dly;

void TIM2_Configuration(void)

{

        NVIC_InitTypeDef NVIC_InitStructure; 

        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

        TIM_DeInit(TIM2);

        NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;  

        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;

        NVIC_Init(&NVIC_InitStructure);
    
        //1us产生一个中断周期

        TIM_TimeBaseStructure.TIM_Period=10;    //自动重装载寄存器周期的值(计数值) 

         /* 累计 TIM_Period个频率后产生一个更新或者中断 */

        TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1);    //时钟预分频数 72M/720

        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 

        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);    // 清除溢出中断标志 

        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        TIM_Cmd(TIM2, ENABLE);    // 开启时钟    

}
void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) 

        {

                TIM_ClearITPendingBit(TIM1,TIM_IT_Update);  //清除中断标志位

                if(time_dly>0) 

                 {

                        time_dly--;

                }
        }
}

//毫秒的延时函数,以1ms为最小单位  

void delay_ms_tim(uint32_t nTimer)  

{  

time_dly=nTimer*100;

while(time_dly);

//微秒的延时函数,实际以10us为最小单位

void delay_us_tim(uint32_t nTimer)  

{  

time_dly=nTimer/10;

while(time_dly);

}
 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值