注释有点乱码 应该是没有错误
但是两个定时器 TIM4 TIM2 一启动计时 SR寄存器里面的比较输出和更新中断标志就都置1
即使我中断没有开 没有设置中断使能 启动之前也清空了标志位
只要一启动定时器就全部置一 很急 在线等着
望大神指教啊
// Header: VGA_Sim
// File Name: VGA_Sim.h
// Author: zzy
// Date: 2013-12-3
#include "VGA_Sim.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
void Timer_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //??????×é
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //?ò??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //??????????
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //?ì????????
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //?ò??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //??????????
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //?ì????????
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void VGA_H_Timer_Init(void)
{
//Timer ?è??
TIM_TimeBaseInitTypeDef H_Timer_Init;
TIM_OCInitTypeDef H_SYNC;
TIM_OCInitTypeDef H_Active;
TIM_OCInitTypeDef H_F_Porch;
/**************************?????±?÷?è??********************/
H_Timer_Init.TIM_ClockDivision = TIM_CKD_DIV1;//2·???
H_Timer_Init.TIM_CounterMode = TIM_CounterMode_Up;
H_Timer_Init.TIM_Period = H_Period_T;
H_Timer_Init.TIM_Prescaler = 1;
TIM_TimeBaseInit(H_Timer , &H_Timer_Init );
TIM_ClearFlag(H_Timer,TIM_IT_Update);
/**************************?????±?÷?è?? ???????·********************/
H_SYNC.TIM_OCMode = TIM_OCMode_PWM1;
H_SYNC.TIM_OutputState = TIM_OutputState_Enable;
H_SYNC.TIM_Pulse = H_B_Porch_T ;
H_SYNC.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(H_Timer,&H_SYNC);
TIM_OC4PreloadConfig(H_Timer, TIM_OCPreload_Enable);
/**************************?????±?÷?è?? ?????á??********************/
H_Active.TIM_OCMode = TIM_OCMode_Timing;
H_Active.TIM_Pulse = H_Active_T ;
TIM_OC1Init(H_Timer,&H_Active);
TIM_ClearFlag(H_Timer,TIM_IT_CC1);
TIM_OC1PreloadConfig(H_Timer, TIM_OCPreload_Enable);
/**************************?????±?÷?è?? ????????********************/
H_F_Porch.TIM_OCMode = TIM_OCMode_Timing;
H_F_Porch.TIM_Pulse = H_F_Porch_T ;
TIM_OC2Init(H_Timer,&H_F_Porch);
TIM_ClearFlag(H_Timer,TIM_IT_CC2);
TIM_OC2PreloadConfig(H_Timer, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(H_Timer , ENABLE);
}
void VGA_V_Timer_Init(void)
{
//Timer ?è??
TIM_TimeBaseInitTypeDef V_Timer_Init;
TIM_OCInitTypeDef V_SYNC;
TIM_OCInitTypeDef V_Active;
TIM_OCInitTypeDef V_F_Porch;
V_Timer_Init.TIM_ClockDivision = TIM_CKD_DIV1;//1·???
V_Timer_Init.TIM_CounterMode = TIM_CounterMode_Up;
V_Timer_Init.TIM_Period = V_Period_T ;
V_Timer_Init.TIM_Prescaler = H_Period_T*2+1 ;//??????1055·??? ??????
TIM_TimeBaseInit(V_Timer , &V_Timer_Init );
TIM_ClearFlag(V_Timer,TIM_IT_Update);
V_SYNC.TIM_OCMode = TIM_OCMode_PWM1;
V_SYNC.TIM_OutputState = TIM_OutputState_Enable;
V_SYNC.TIM_Pulse = V_B_Porch_T ;
V_SYNC.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(V_Timer,&V_SYNC);
TIM_OC4PreloadConfig(V_Timer, TIM_OCPreload_Enable);
V_Active.TIM_OCMode = TIM_OCMode_Timing;
V_Active.TIM_Pulse = V_Active_T ;
TIM_OC1Init(V_Timer,&V_Active);
//TIM_OC1PreloadConfig(V_Timer, TIM_OCPreload_Enable);
TIM_ClearFlag(V_Timer,TIM_IT_CC1);
TIM_ITConfig(V_Timer,TIM_IT_CC1,ENABLE);
V_F_Porch.TIM_OCMode = TIM_OCMode_Timing;
V_F_Porch.TIM_Pulse = V_F_Porch_T ;
TIM_OC2Init(V_Timer,&V_F_Porch);
//TIM_OC2PreloadConfig(V_Timer, TIM_OCPreload_Enable);
TIM_ClearFlag(V_Timer,TIM_IT_CC2);
TIM_ITConfig(V_Timer,TIM_IT_CC2,ENABLE);
TIM_ARRPreloadConfig(V_Timer , ENABLE);
}
void VGA_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_AFIODeInit();
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE );//??????T2C4??????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits (GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}
void VGA_Sim_Init(void)
{
VGA_GPIO_Init();
//Timer_NVIC_Configuration();
VGA_H_Timer_Init();
VGA_V_Timer_Init();
TIM_Cmd(H_Timer , ENABLE);
TIM_Cmd(V_Timer , ENABLE);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(H_Timer,TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(H_Timer,TIM_IT_CC1);
}
else if(TIM_GetITStatus(H_Timer,TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(H_Timer,TIM_IT_CC2);
}
}
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(V_Timer,TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(V_Timer,TIM_IT_CC1);
TIM_ClearFlag(H_Timer,TIM_IT_CC1);
TIM_ITConfig(H_Timer,TIM_IT_CC1,ENABLE);
TIM_ClearFlag(H_Timer,TIM_IT_CC2);
TIM_ITConfig(H_Timer,TIM_IT_CC2,ENABLE);
}
else if(TIM_GetITStatus(V_Timer,TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(V_Timer,TIM_IT_CC2);
TIM_ClearFlag(H_Timer,TIM_IT_CC1);
TIM_ITConfig(H_Timer,TIM_IT_CC1,DISABLE);
TIM_ClearFlag(H_Timer,TIM_IT_CC2);
TIM_ITConfig(H_Timer,TIM_IT_CC2,DISABLE);
}
}
|