OpenEdv-开源电子网

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

原子请教:系统刚开始几秒钟定时器定时不准确,几秒钟以后定时就正常?

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-9-12
在线时间
2 小时
发表于 2013-3-21 14:25:32 | 显示全部楼层 |阅读模式
原子:
    我现在在做报警信号测试,用PWM产生音频报警,音频报警的程序在时钟中断里,刚开机时发现定时器进入中断的时间不是我所设定的,声音没规律的响,指示灯无规律的闪,但是几秒钟后就正常了。程序如下:

主函数:
int main(void)
{  
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化

LED_Init();
Time1Init();
Time2Init(1000,7199);
while(1)
{
  

}  
}

定时器和PWM的配置
//本工程中,定时器2用于产生100ms的定时,定时器1用于产生500HZ频率的PWM
//定时器2的中断函数
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)
{
  TimeTick++;
  if(TimeTick==5)
  {
 TimeTick=0;
 LED0=~LED0;
  }
  SoundAlarmMid();      
}

TIM2->SR&=~(1<<0);
}


//psc=7199   arr=10时定时为1ms      定时时间根据ARR值来调整
void Time2Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;
TIM2->ARR=arr;
TIM2->SC=psc;

TIM2->DIER|=1<<0;
TIM2->DIER|=1<<6;
TIM2->CR1|=0X01;
MY_NVIC_Init(0,0,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}

//定时器1用来产生PWM
void Time1Init(void)
{
RCC->APB2ENR|=1<<11;//TIM1时钟使能
RCC->APB2ENR|=1<<2;    //使能PORTA时钟
GPIOA->CRH &= 0XFFFF0FFF;
GPIOA->CRH |= 0X0000B000;
GPIOA->ODR &= ~(1<<11);

TIM1->ARR=19;
TIM1->SC=7199;
TIM1->CCMR2|=6<<12;
TIM1->CCMR2|=1<<11;
TIM1->CCER|=1<<12;
TIM1->CR1|=1<<7;
TIM1->BDTR|=1<<15;
TIM1->CR1|=0X01;
TIM1->CCR4=0;
TIM1->EGR|=1<<0;
while((TIM1->EGR&0x01));
}

void PwmOn(void)
{
TIM1->CCR4=9;
TIM1->EGR|=1<<0;
while((TIM1->EGR&0x01));
}

void PwmOff(void)
{
TIM1->CCR4=0;
TIM1->EGR|=1<<0;
while((TIM1->EGR&0x01));
}

声音报警程序
void SoundAlarmHigh(void)
{
switch(SoundAlarmHighTime)
{
case 0:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 2:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 4:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 8:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 10:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 21:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 23:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 25:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 29:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
case 31:
{
SoundAlarmHighTime++;
PwmOn();
LED1=0;
break;
}
default:
{
SoundAlarmHighTime++;
if(SoundAlarmHighTime>81)
{
SoundAlarmHighTime=0;
}
PwmOff();
LED1=1;
break;
}
}
}

如果我在main函数做如下修改

int main(void)
{     
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
        delay_ms(1500);
LED_Init();
Time1Init();
Time2Init(1000,7199);
while(1)
{
   

}  
}

添加如上延时,原本是让它延时1.5S,但是延时的时间超过好几秒(显然延时不对),然后才初始化后面的定时器,这样进入定时的中断的时间也正常,灯闪烁正常,声音响的间隔也正常。
目前查不到原因。我猜测是不是执行了 Stm32_Clock_Init(9)后系统时钟还是没有稳定下来?请教原子。






















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

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-9-12
在线时间
2 小时
 楼主| 发表于 2013-3-21 14:53:25 | 显示全部楼层
追加描述:我如果通过USB串口烧写程序后自动运行程序,就不会出现这个问题,如果我是关掉开关一段时间后,在按下开关启动,就会出现如上问题。我直接烧写了光盘里的定时器中断的文件,也是会出现这个问题。求解?
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-9-12
在线时间
2 小时
 楼主| 发表于 2013-3-21 15:27:46 | 显示全部楼层
问题找到了,用示波器测量复位管脚,发现每次开机复位了5次。在原子的STM32不完全手册的26页有提到过,看资料没看仔细。换了外接电源就稳定了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 23:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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