我想让TIM3工作于PWM1模式 向上计数,并产生CCR1中断,现在情况是我用软件仿真时,在main的while循环时,计数到CCR1时可以进如中断,但在硬件仿真的时候,当执行完TIM_Cmd(TIM3,ENABLE); 时,CNT立马从0x0000变成0x6F10,直接超出了ccr1的值,并且CC4IF CC3IF CC2IF CC1IF 都置位了,无法进入CCR1的中断函数,但是点 运行到光标处 又可以进入中断函数,但CNT并不等于CCR1啊 怎么感觉程序乱跑了...求指教了 谢谢了
int main(void)
{
NVIC_Configuration();
TM3_GPIO_Config();
TM3_PWM_Config();
while(1)
{
}
// add your code here ^_^。
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//设置中断的优先级类型
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//PWM的比较值
u16 CCR1_Val=10000;
void TM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void TM3_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; //比较捕获模式初始化
TIM_InternalClockConfig(TIM3);
//基本的初始化
TIM_TimeBaseStructure.TIM_Prescaler=0; //PSC预分频 不分频72MHZ
TIM_TimeBaseStructure.TIM_Period=30000; //自动重载寄存器
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //不分频 见TIMx_CR1寄存器位9 位8
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
// TIM_ClearFlag(TIM3,TIM_FLAG_Update);
//比较捕获配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;//PWM模式1 CCMR1寄存器中OC1M[2:0]
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //CCER寄存器中CCIE为1 (默认为输出)
TIM_OCInitStructure.TIM_Pulse=CCR1_Val; //设定比较值
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //设置CCER中的CC1P为0,OC1高电平有效,
TIM_OC1Init(TIM3,&TIM_OCInitStructure); //初始化了通道1
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能CCR1寄存器的预装载功能,那么只有在产生更新事件
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);
//使能TM3重载寄存器ARR
TIM_ARRPreloadConfig(TIM3,ENABLE);
//使能TM3
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1); //软件清0
CCR1_Val+=10000;
TIM_SetCompare1(TIM3,CCR1_Val); //这里是写CCR1预装载寄存器,但是不会直接写到影子寄存器
if(CCR1_Val==30000)
CCR1_Val=10000;
}
else if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
}
}
求救了 谢谢了...
此帖出自
小平头技术问答
CNT超过CCR1值也是对的,比较中断不影响计数CNT.
一周热门 更多>