野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9882|回复: 2

(新人求助)基本定时器延时函数延时不准的问题

[复制链接]
发表于 2018-1-26 19:42:25 | 显示全部楼层 |阅读模式
    初学32 自己写了个延时1秒的函数,但是执行时发现延时不准确,总是小于1秒(0.8秒左右)。查了半天不知道问题在哪里,没头绪了。把程序贴上来求大神帮忙解答下:1、主程序:
#include "stm32f10x.h"
#include "led.h"
#include "excute.h"

uint16_t t=0;//定义计数变量,赋初值为0,每次定时器记1毫秒后进入中断服务函数,t+1,当t=1000,即为1秒
int main()
{
        LED_GPIOConfig();                                //初始化LEDB GPIOB连接LED灯
        TIMER6Config();                                        //配置初始化TIM6定时器
        while(1)
        {
                Delays();                                                                        //延时1秒
                GPIOB->ODR=~GPIOB->ODR;                //GPIOB电平翻转一次
        }
================================================================================================
2、定时器配置函数和延时函数
#include "excute.h"
extern uint16_t t;


void TIMER6Config()
{
        NVIC_InitTypeDef NVICTIM6Initstrut;
        TIM_TimeBaseInitTypeDef TIM6Initstruct;//定义结构体
               
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);        //开TIM6时钟
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVICTIM6Initstrut.NVIC_IRQChannel=TIM6_IRQn;
        NVICTIM6Initstrut.NVIC_IRQChannelPreemptionPriority=0;
        NVICTIM6Initstrut.NVIC_IRQChannelSubPriority=0;
        NVICTIM6Initstrut.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVICTIM6Initstrut);                                           //中断优先级初始化配置

        TIM6Initstruct.TIM_Period=1000;                                      //计数值1000
        TIM6Initstruct.TIM_Prescaler=71;                                      //内部时钟72M 71+1分频 即每次进入中断间隔1ms
        TIM_TimeBaseStructInit(&TIM6Initstruct);                          //时基初始化
        
        TIM_ClearFlag(TIM6, TIM_FLAG_Update);//清除中断标志
        TIM_ITConfig(TIM6, TIM_FLAG_Update, ENABLE);//更新中断打开
        TIM_Cmd(TIM6,ENABLE);//计数器使能

        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, DISABLE);//暂时关闭TIM6时钟,等待使用
}
void Delays(void)
{
        t=0;                                                   //t值清零 在中断服务函数中,t自增,进一次中断,t加1,即延时1毫秒.等待t到1000 即延时1秒
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);                               //打开TIM6时钟
        while(t<1000)                                                                                             //在此等待t到达1000 当t到达1000时 跳出延时函数
        {}
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,DISABLE);                            //延时完毕  关闭时钟
}
================================================================================================
3、中断服务函数:

void TIM6_IRQHandler(void)
{        
        if(TIM_GetITStatus(TIM6, TIM_IT_Update)!=RESET)
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
        t++;
}


============================================================================================================================

我感觉是中断那里有问题,像是进入中断一次,有时t不止加了1,但是找不到理由。
求解~~~已经困扰好几天了!

回复

使用道具 举报

发表于 2018-1-26 20:51:31 | 显示全部楼层
1000应该是0-999吧,还有就是t用清零不,我也是新手
回复 支持 反对

使用道具 举报

发表于 2018-1-27 08:22:36 | 显示全部楼层
用花 {} 把中断中的  TIM_ClearITPendingBit(TIM6, TIM_IT_Update); 和  t++; 都包含进去
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-6 02:51 , Processed in 0.030006 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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