初学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,但是找不到理由。
求解~~~已经困扰好几天了! |