OpenEdv-开源电子网

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

主从定时器配置问题。我把TIM3改成TIM2后就不行了

[复制链接]

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2020-8-11 17:47:37 | 显示全部楼层 |阅读模式
1金钱
我只是把所有的TIM2改成了TIM3,中断还是能进去,但是输出的脉冲不对。

pwm.c

  1. #include "pwm.h"
  2. #include "usart.h"
  3. extern u8 ask_cycle_flag;
  4. extern u8 first_loop_flag;

  5. void TIM1_configtest(vu16 temp)
  6. {
  7.     GPIO_InitTypeDef GPIO_InitStructure; //GPIO设置,创建结构体
  8.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器设置结构体
  9.     TIM_OCInitTypeDef  TIM_OCInitStructure; //pwm波对应设置结构体
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //开启时钟
  11.                
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  //TIM1_CH4 PA11
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
  15.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  16. //    TIM1->ARR = temp;                                                  
  17.     TIM_TimeBaseStructure.TIM_Prescaler =7200-1;                    //设置用来作为TIMx时钟频率除数的预分频值                                                     
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS= Tck_tim            
  19.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  20.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!
  21.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);               //装载                        

  22.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //选择定时器模式:TIM脉冲宽度调制模式1      
  23.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  24.    
  25. //                TIM1->CCR1 = (temp/2);
  26.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性      
  27.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);     //装载通道1,PA8
  28.     TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
  29.     TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
  30.     TIM_ARRPreloadConfig(TIM1, ENABLE);  // 使能或者失能 TIMx 在 ARR 上的预装载寄存器
  31. }
  32. void TIM1_config()
  33. {
  34.   GPIO_InitTypeDef GPIO_InitStructure; //GPIO设置,创建结构体
  35.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器设置结构体
  36.   TIM_OCInitTypeDef  TIM_OCInitStructure; //pwm波对应设置结构体
  37. //                NVIC_InitTypeDef NVIC_InitStructure;
  38.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //开启时钟
  39.                
  40.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  //TIM1_CH4 PA11
  41.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  42.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
  43.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  44.                                                   
  45.   TIM_TimeBaseStructure.TIM_Prescaler =7200;                    //设置用来作为TIMx时钟频率除数的预分频值                                                     
  46.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS= Tck_tim            
  47.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  48.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!
  49.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);               //装载                        

  50.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //选择定时器模式:TIM脉冲宽度调制模式1      
  51.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  52.                    //设置待装入捕获寄存器的脉冲值                                   
  53.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性      

  54.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);     //装载通道1,PA8


  55.   TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
  56.     //设置或者重置 TIMx 主/从模式
  57.     //TIMx: x 可以是 2, 3 或者 4,来选择 TIM 外设
  58.     //TIM_MasterSlaveMode:定时器主/从模式,TIM 主/从模式使能
  59.    
  60.   TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
  61.     //选择 TIMx 触发输出模式
  62.     //TIMx: x 可以是 2, 3 或者 4,来选择 TIM 外设
  63.     //TIM_TRGOSource:触发输出模式
  64.     //TIM_TRGOSource_Update:使用更新事件作为触发输出(TRGO)
  65.    

  66. //    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能或者失能 TIMx 在 CCR3 上的预装载寄存器
  67. //    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能或者失能 TIMx 在 CCR3 上的预装载寄存器
  68.     TIM_ARRPreloadConfig(TIM1, ENABLE);  // 使能或者失能 TIMx 在 ARR 上的预装载寄存器
  69.     //允许或禁止在定时器工作时向ARR的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值
  70.                
  71.                 //打开中断
  72. //                TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
  73. //    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;        
  74. //    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  75. //    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     
  76. //    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  77. //    NVIC_Init(&NVIC_InitStructure);
  78. }

  79. /***定时器2从模式***/
  80. void TIM3_config(u32 PulseNum)
  81. {
  82.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //对应结构体声明
  83.     NVIC_InitTypeDef NVIC_InitStructure;  //NVIC 对应结构体声明
  84.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  85.     TIM_TimeBaseStructure.TIM_Period = PulseNum;   
  86.     TIM_TimeBaseStructure.TIM_Prescaler =0;   
  87.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
  88.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  89.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

  90.     TIM_SelectInputTrigger(TIM3,TIM_TS_ITR0);//选择 TIMx 输入触发源,TIM 内部触发 0      
  91.     TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1 );// 等同 TIM2->SMCR|=0x07 //设置从模式寄存器
  92.     //   TIM2->SMCR|=0x07;                                  //设置从模式寄存器      
  93.     TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); //

  94.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;        
  95.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  96.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     
  97.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  98.     NVIC_Init(&NVIC_InitStructure);
  99. }
  100. //入口设定函数
  101. void Pulse_output(u32 Cycle,u32 DutyCycle,u32 PulseNum)
  102. {
  103.         u32 ccr1;
  104.         u32 arr; //7200预分频,72Mhz时钟,所以是10 000hz
  105.         arr=(10000/Cycle);
  106.         ccr1 =(arr*DutyCycle/100);
  107.         TIM_Cmd(TIM3,DISABLE);
  108.         TIM3_config(PulseNum);//装载
  109.         TIM1_config();
  110. //        TIM1_configtest(Cycle);
  111.         TIM1->ARR = arr;
  112.         TIM1->CCR1 = ccr1;
  113.   TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx 的中断待处理位
  114.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  115.         TIM_Cmd(TIM3, ENABLE);//使能
  116.   TIM_Cmd(TIM1, ENABLE);//使能
  117.   TIM_CtrlPWMOutputs(TIM1, ENABLE);   //高级定时器一定要加上,主输出使能
  118. }
  119.   
  120. //中断处理函数
  121. void TIM3_IRQHandler(void)
  122. {
  123.     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)     // TIM_IT_CC1
  124.     {        

  125.       TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位
  126.       TIM_CtrlPWMOutputs(TIM1, DISABLE);  //主输出失能
  127.       TIM_Cmd(TIM1, DISABLE); // 关闭定时器
  128.       TIM_Cmd(TIM3, DISABLE); // 关闭定时器
  129.                         TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
  130.                         printf("\r\n脉冲发送完成:\r\n");
  131.     }
  132. }
复制代码



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

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
 楼主| 发表于 2020-8-11 17:56:34 | 显示全部楼层
入口函数是
Pulse_output(u32 Cycle,u32 DutyCycle,u32 PulseNum)  // Cycle是频率 范围是1hz-10000hz,DutyCycle是占空比范围0~100,PulseNum是输出个数范围1~65535
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-8-12 01:52:06 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-7-10
在线时间
2 小时
发表于 2022-1-6 08:12:45 来自手机 | 显示全部楼层
ITR没挂对
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 18:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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