我单独用定时器1 PA8输出PWM波形,控制LED0灯的亮暗变化,输出正常。
单独使用定时器3产生定时中断控制LED1的闪烁,也正常。
可是当我把这两个功能一起使用时就出现了问题:定时器1的输出占空比就发生变化,不再是我设定的值。而且不能调节。把定时器3 中断屏蔽掉又正常了。
手册上说两个定时器是相互独立的啊。为什么会出现这种情况呢,求高手解惑。
附上代码如下:
定时器1初始化:
void time1_pwm_init(u16 arr,u16 soc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);
//初始化IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化定时器1
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = soc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
//初始化TIM1_OC1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
//使能预装载寄存器
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
//使能定时器
TIM_Cmd(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
************************************************8
定时器3 初始化
void time3_init(u16 arr,u16 soc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//初始化定时器
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = soc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//NVIC初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//中断使能
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//打开定时器
TIM_Cmd(TIM3,ENABLE);
}void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
LED1 = !LED1;
printf("OK\r\n");
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
*******************************************
main函数
int main(void)
{
u8 i;
u8 len;
u16 time = 0;
u8 dir = 1;
u16 pwm_val = 0;
delay_init();
led_init();
uart_init(9600);
extix_init();//外部中断
//time3_init(59999,7199);//定时器3中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
time1_pwm_init(899,0);//pwm输出设置
while(1)
{
delay_ms(15);
if(dir) pwm_val++;
else pwm_val--;
if(pwm_val==300) dir = 0;
if(pwm_val == 0) dir = 1;
TIM_SetCompare1(TIM1,pwm_val);//设置占空比
}
}
|