OpenEdv-开源电子网

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

两个定时器TIM1和TIM3产生冲突的问题

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-25 15:05:12 | 显示全部楼层 |阅读模式
10金钱
如题,我用TIM1产生一个PWM波形;用TIM3做500ms的led灯闪烁。注释掉分别验证两个功能都是好的。将两个功能放在一起,就只有led闪烁,没有PWM输出。将TIM3和led相关的函数屏蔽掉就有PWM输出,怀疑是两个定时器的优先级没有配置好或者哪里有冲突了,代码如下,求解~
  1. int main(void)
  2. {       
  3.         LED_Init();       
  4.         TIM3_Int_Init(4999,7199);         
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级  
  6.         TIM1_PWM_Init(999,71);         //不分频。PWM频率=72000000/1000/72=1Khz   周期为1ms
  7.          while(1)
  8.         {                                       
  9.                 TIM_SetCompare1(TIM1,200);          //占空比20%                                                
  10.         }         
  11. }
  12. /******************************************************************/
  13. void TIM1_PWM_Init(u16 arr,u16 psc)
  14. {  
  15.         GPIO_InitTypeDef GPIO_InitStructure;
  16.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  17.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  18.        
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);        //使能定时器1时钟
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设
  21.              
  22.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形        GPIOA8
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8_CH1
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
  27.        
  28.          
  29.    //初始化TIM1
  30.         TIM_TimeBaseStructure.TIM_Period = arr; //
  31.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //
  32.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
  33.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //
  34.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //
  35.        
  36.         //初始化TIM1 Channel2 PWM模式         
  37.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //
  38.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
  39.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //
  40.         TIM_OCInitStructure.TIM_Pulse=0;//占空时间144中有40的时间为高,互补的输出正好相反         
  41.         TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;//空闲状态下的非工作状态下           
  42.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //            
  43.                
  44.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //          
  45.         TIM_Cmd(TIM1, ENABLE);  //
  46.         TIM_CtrlPWMOutputs(TIM1,ENABLE);  //输出使能  通用定时器没有这个
  47. }


  48. ///////////////////////////////////////////////
  49. void TIM3_Int_Init(u16 arr,u16 psc)
  50. {
  51.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  52.         NVIC_InitTypeDef NVIC_InitStructure;

  53.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  54.        
  55.         //定时器TIM3初始化
  56.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       
  57.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  58.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  59.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  60.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

  61.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

  62.         //中断优先级NVIC设置
  63.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  64.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  65.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  66.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  67.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


  68.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
  69. }
  70. //定时器3中断服务程序
  71. void TIM3_IRQHandler(void)   //TIM3中断
  72. {
  73.         static int i=0;       
  74.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  75.                 {               
  76.                 LED1=~LED1;  
  77.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
  78.                 }
  79. }
复制代码


最佳答案

查看完整内容[请看2#楼]

问题找到了,TIM1里面没有加中断的设置。加了中断的配置就好了,但是TIM1要设置比TIM3中断优先级高才可以两个功能都实现,这个问题还需要思考下,个人觉得可能是因为我把TIM1写在while(1)里面的缘故~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-25 15:05:13 | 显示全部楼层
问题找到了,TIM1里面没有加中断的设置。加了中断的配置就好了,但是TIM1要设置比TIM3中断优先级高才可以两个功能都实现,这个问题还需要思考下,个人觉得可能是因为我把TIM1写在while(1)里面的缘故~
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-25 15:30:32 | 显示全部楼层
设置中断优先级的步骤 1. 系统运行开始的时候设置中断分组。 确定组号,也就是确定抢占优先级和子优先级的 分配位数。 调用函数为 NVIC_PriorityGroupConfig(); 2. 设置所用到的中断的中断优先级别。 对每个中断调用函数为 NVIC_Init();
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-7-25 18:46:45 | 显示全部楼层
定时器初始化放到中断分组之后
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-27 08:44:43 | 显示全部楼层
login_FAE 发表于 2020-7-25 18:46
定时器初始化放到中断分组之后

试过了,还是一样不行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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