OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2744|回复: 1

stm32f2定时器3做延时

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-12-17
在线时间
4 小时
发表于 2016-4-6 09:33:59 | 显示全部楼层 |阅读模式
10金钱
我拿定时器3,写了个延时函数,但是不行,跑不过去,思路就是每进一次中断就加1,加满某个数就关定时器,求各位大神为小女子解疑释惑。。跪谢
代码如下:
定时器3的初始化函数
void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
       
    TIM_TimeBaseInitStructure.TIM_Period = arr;         //自动重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
//        TIM_Cmd(TIM3,ENABLE); //使能定时器3
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
}

定时器3的中断服务函数
void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {          

    if (SignalTime_delay > 0x00)
    {
      SignalTime_delay--;
          DS4=!DS4;
    }                                                 
    else
    {
      TIM_Cmd(TIM3,DISABLE);
          DS2=!DS2;
    }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  }
}

延时函数的写法
void Time_sy_delay_Signal(unsigned int value)
{  
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  SignalTime_delay=value;
  TIM_Cmd(TIM3,ENABLE);
  while(SignalTime_delay)
  {
  ;
  }

}
上述函数中DS1、2、3、4为我板子上的小灯,调试的时候用的。。。我主函数如下:
int main(void)
{       

        u16 AD_Value1;          
    SystemInit();
        NVIC_Configuration();
    delay_init(120);      
        LED_Init();
        deep_Init();
        uart1_init(115200);
    uart6_init(115200);
        SPI1_Init();
        TIM3_Int_Init(200-1,6000-1);           //20ms

          while(1)
          {         
            DS1=0;

               
                DS3=0;
                Time_sy_delay_Signal(20);
                DS3=1;
                Time_sy_delay_Signal(20);
}
}

想的是DS3可以亮灭循环,但实际上DS3一直亮,DS4亮灭10次,就没有了、、、、、

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-6 22:00:55 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 07:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表