• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

请教关于stm32 TIM比较中断

gtrjolin1992 2013-04-28 浏览量:1912
我想让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);                                                        } } 求救了 谢谢了...
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 程序没看,就你说的问题描述来看都是正常的现象,硬件仿真是有个时间差的,进入断点后CNT值有变化是正常的,你可以把每次的CNT数存到一个数组里验证相信是对的.
    CNT超过CCR1值也是对的,比较中断不影响计数CNT.
    • 发布于 2013-04-29
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • 可是我在while里循环 根本进不了CCR1的匹配中断啊
    • 发布于2013-04-29
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

请教关于stm32 TIM比较中断