原子:
我现在在做报警信号测试,用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)后系统时钟还是没有稳定下来?请教原子。
|