语句C: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
A的执行时间是远小于B+C还是差不多?
2.程序输出的第一个脉冲的周期T 比后续脉冲的都要短。例如本程序中的第一个脉冲周期约12.2us,后续均为13.8~13.9左右
而在启用TIM3语句之后马上就进入了while循环
是什么导致此现象的?
3.中断不会打断TIM3这种外设的工作,即便是配置其相关的寄存器(如在CCMR1中关闭CH2)的语句,
只要片上外设的工作不涉及到占用CPU的代码就不会有影响,我这样的理解对吗?
4.感觉这种方式如果没有上一个问题,似乎是实现此功能的最好办法?而且也可以稍微改下就能在中断里实现纯计数功能
不知道大家有没有更高效的方法呢
附上代码
u8 steps = 0; //PWM脉冲计数全局变量
int main(void)
{
SystemInit();
pwm_MyInit();
while(1)
continue;
}
void pwm_MyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef Base_InitStructure;
TIM_OCInitTypeDef PWM_InitSturcture;
NVIC_InitTypeDef PWM_NVICStructure;
/*******************RCC********************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
/************************************************/
/*******************GPIO********************/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/************************************************/
/*******************NVIC********************/
PWM_NVICStructure.NVIC_IRQChannel = TIM3_IRQn;
PWM_NVICStructure.NVIC_IRQChannelCmd = ENABLE;
PWM_NVICStructure.NVIC_IRQChannelSubPriority = 1;
PWM_NVICStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_Init(&

WM_NVICStructure);
/************************************************/
/*******************TIM3 BASE********************/
Base_InitStructure.TIM_ClockDivision = 0;
Base_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
Base_InitStructure.TIM_Period = 999;
Base_InitStructure.TIM_Prescaler = 0;
Base_InitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&Base_InitStructure);
/************************************************/
TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);
/*******************TIM3 PWM********************/
PWM_InitSturcture.TIM_OCMode = TIM_OCMode_PWM1;
PWM_InitSturcture.TIM_OCPolarity = TIM_OCPolarity_High;
PWM_InitSturcture.TIM_OutputState= TIM_OutputState_Enable;
PWM_InitSturcture.TIM_Pulse = 750;
TIM_OC1Init(TIM3,&

WM_InitSturcture);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
PWM_InitSturcture.TIM_OutputState = TIM_OutputState_Enable;
PWM_InitSturcture.TIM_Pulse = 500;
TIM_OC2Init(TIM3,&

WM_InitSturcture);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
PWM_InitSturcture.TIM_OutputState = TIM_OutputState_Enable;
PWM_InitSturcture.TIM_Pulse = 250;
TIM_OC3Init(TIM3,&

WM_InitSturcture);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
PWM_InitSturcture.TIM_OutputState = TIM_OutputState_Enable;
PWM_InitSturcture.TIM_Pulse = 125;
TIM_OC4Init(TIM3,&

WM_InitSturcture);
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
/************************************************/
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
extern vu8 steps;
if (TIM_GetITStatus(TIM3,TIM_IT_CC2) != RESET)
{
if (steps >= 5)
{
TIM3->CCMR1 = 0x0868;
steps = 0;
}
else steps++;
TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
}
}