OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6486|回复: 7

请教关于stm32 TIM比较中断

[复制链接]

24

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2013-3-11
在线时间
22 小时
发表于 2013-4-28 21:38:33 | 显示全部楼层 |阅读模式
我想让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); 
        

                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);        
                                
                }
}


 谢谢...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-28 23:14:34 | 显示全部楼层
这个第一次设置,比如进入中断,明明都设置好了,不会进中断,但是老会进入,貌似老是怪怪的,不只是定时器,还有哦外部中断,其他外设等,都存在这种问题,也表示不解
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-4-29 08:15:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原来原子哥也有不解的啊…………嘿嘿
努力努力
回复 支持 反对

使用道具 举报

24

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2013-3-11
在线时间
22 小时
 楼主| 发表于 2013-4-29 09:19:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
晚上再试试,现在有点后悔了,不如直接操作寄存器,用库心里没底啊
回复 支持 反对

使用道具 举报

18

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2012-8-27
在线时间
21 小时
发表于 2013-4-29 09:30:49 | 显示全部楼层
能否设成这样:
把定时器设为计数方式,然后计到比如1000个脉冲时,才进入中断呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-29 12:57:22 | 显示全部楼层
回复【3楼】happy:
---------------------------------
我不解的多了去了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-29 12:57:35 | 显示全部楼层
回复【5楼】etkl:
---------------------------------
可以啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2012-8-27
在线时间
21 小时
发表于 2013-4-29 13:05:34 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我现在就设成这样了,可以用。
在修改定时器的寄存器后,要先清除一下标志位,然后再开启中断不会先进入一次更新事件中断了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 18:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表