打印

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

[复制链接]
246|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
スモモ|  楼主 | 2020-4-26 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学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,但是找不到理由。
求解~~~已经困扰好几天了!

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

458

主题

484

帖子

1

粉丝