OpenEdv-开源电子网

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

怎么TIM2模仿原子兄的PWM没有输出的,不明白

[复制链接]

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-6-13 00:21:36 | 显示全部楼层 |阅读模式
5金钱
/*********************************************************************
*名    称:TIM2_PWM_Init()
*功    能:使用定时器输出4路PWM控制RGBW4个灯
*入口参数:(u16)arr 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  (u16)psc 设置用来作为TIMx时钟频率除数的预分频值
*出口参数:无
*说    明: 典型应用 TIM4_PWM_Init(899,0); //初始化
  PA15 = TIM_SetCompare1(TIM4,899);
PB3  = TIM_SetCompare2(TIM4,899);
PB10 = TIM_SetCompare3(TIM4,800);
PB11 = TIM_SetCompare4(TIM4,899);
*********************************************************************/
void TIM2_PWM_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef   TIM_OCInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //Timer2部分重映射  TIM3_CH2->B5    
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //这个是什么意思呢
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_10 | GPIO_Pin_11; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //这个是什么意思呢?PWM的频率是怎么算的,妈逼的,现在都不会算的
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
 
   //初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM3 Channel2 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM2, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM3 OC2

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);   //使能TIM3在CCR2上的预装载寄存器
 
TIM_Cmd(TIM2, ENABLE);  //使能TIM3
}

TIM_SetCompare1(TIM2,100); //PA15
TIM_SetCompare2(TIM2,200); //PB3
TIM_SetCompare3(TIM2,500); //PB10
TIM_SetCompare4(TIM2,800); //PB11


最佳答案

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

回复【6楼】正点原子: --------------------------------- void TIM2_PWM_Init(u16 arr,u16 psc) {     //此部分需手动修改IO口设置 RCC->APB1ENR|=1<<0;  //TIM2时钟使能 RCC->APB2ENR|=1<<2;     //使能PORTA时钟      RCC->APB2ENR|=1<<3;     //使能PORTB时钟 // GPIOB->CRL&=0XFF0FFFFF; //PB5输 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 00:21:37 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
void TIM2_PWM_Init(u16 arr,u16 psc)
{    
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<0;  //TIM2时钟使能
RCC->APB2ENR|=1<<2;     //使能PORTA时钟     
RCC->APB2ENR|=1<<3;     //使能PORTB时钟

// GPIOB->CRL&=0XFF0FFFFF; //PB5输出
GPIOB->CRL&=0XFFFF0FFF; //PB3输出
GPIOB->CRH&=0XFFFF00FF; //PB10/PB11输出
GPIOA->CRH&=0X0FFFFFFF; //PA15输出

// GPIOB->CRL|=0X00B00000; //PB5复用功能输出          
GPIOB->CRL|=0X0000B000; //PB3复用功能输出
GPIOB->CRH|=0X0000BB00; //PB10/PB11复用功能输出
GPIOA->CRH|=0XB0000000; //PA15复用功能输出
   
RCC->APB2ENR|=1<<0;     //开启辅助时钟    
// AFIO->MAPR&=0XFFFFF3FF; //清除MAPR的[11:10]
AFIO->MAPR&=0XFFFFFCFF; //清除MAPR的[9:8]
// AFIO->MAPR|=1<<11;      //部分重映像,TIM3_CH2->B5
AFIO->MAPR|=0X02000300; //关闭JTAG-DP启用SW-DP和完全映像

TIM2->ARR=arr; //设定计数器自动重装值 
TIM2->SC=psc; //预分频器不分频

// TIM2->CCMR1|=7<<12;   //CH2 WM2模式
TIM2->CCMR1|=0X7070;   //CH2 WM2模式  
// TIM2->CCMR1|=1<<11;  //CH2预装载使能
TIM2->CCMR1|=0X0808;  //CH2预装载使能
TIM2->CCMR2|=0X7878;    /*这个是我抄袭上面,PB10/PB11出效果PWM*/
// TIM2->CCER|=1<<4;    //OC2 输出使能
TIM2->CCER|=0X1111;    //OC2 输出使能    
TIM2->CR1=0x0080;    //ARPE使能 
TIM2->CR1|=0x01;     //使能定时器3    
}

示波器能看到PWM波形了,就是觉得库函数都不知道怎么设置,还是看寄存器可以很方便直接的操作
原子很强大,呵呵
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-13 00:21:37 | 显示全部楼层
回复【12楼】宋子谦:
---------------------------------
1,可以.
2,可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 00:22:12 | 显示全部楼层
自己先顶一下,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-13 00:31:41 | 显示全部楼层
PB3,PA15要先禁止JTAG,才可以输出PWM。
其它PB10,PB11应该可以正常输出才对。
仿真看看寄存器状态吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 00:43:27 | 显示全部楼层


PB9可以输出,这里的配置都是一样的,就是不知道怎么输不出来的?
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 00:44:33 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子老大,这里配置都是一样的,PB6/7/8/9可以输出,PB10/11就是不能?奇怪
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-13 10:39:20 | 显示全部楼层
回复【5楼】wyudcl:
---------------------------------
看定时器寄存器配置.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 14:57:53 | 显示全部楼层


对着TIM3一直来修改TIM2到输出效果
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-13 23:08:02 | 显示全部楼层
恭喜恭喜...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-13 23:18:29 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
还得请教,现在我的TIM1可以输出7个pwm了,
但是TIM8复制了TIM1的代码,出不来PWM,软件仿真也没有TIM8的配置,又苦逼了,原子兄,帮忙看看
void TIM8_PWM_Init(u16 arr,u16 psc)

GPIO_InitTypeDef  GPIO_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
TIM_OCInitTypeDef   TIM_OCInitStructure;

TIM_DeInit(TIM8);//初始化TIM1寄存器
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 | RCC_APB2Periph_GPIOC 
| RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7
| GPIO_Pin_8 | GPIO_Pin_9 ; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO

// AFIO->MAPR|=0X02000300; //关闭JTAG-DP启用SW-DP和完全映像
 
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr;  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc;  //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM1 Channel1 WM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  //选择定时器模式:TIM脉冲宽度调制模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //比较输出使能 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = arr/2;

TIM_OC1Init(TIM8, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM1 OC1
TIM_OC2Init(TIM8, &TIM_OCInitStructure); 
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC4Init(TIM8, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);   //使能TIM1在CCR1上的预装载寄存器
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); 

  TIM_ARRPreloadConfig(TIM8, ENABLE);                 //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM8, ENABLE);   //使能TIM1
TIM_CtrlPWMOutputs(TIM8, ENABLE); //设置PMW主输出
}
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-5
在线时间
0 小时
发表于 2014-8-13 16:51:02 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
哈哈,谢谢原子哥,正准备提这个问题来着!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-3-17
在线时间
0 小时
发表于 2015-3-17 21:11:34 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
想请教个问题,您帮忙给看下吧,谢谢
stm32f103vbt6,
一、串口占用了PA9,PA10;
二、modbus占用了TIM2,
三,想要4路频率可调占空比无需调节的PWM方波,帮忙看看对PWM输出端口能不能这样进行设置???
TIM1-CH4,端口为PA11;
TIM3-CH2,端口为PA7;
TIM4-CH2,端口为PB7;
TIM5-CH4,端口为PA3;
疑问在于:
1、用了串口1,还能不能用PA11产生PWM波,PA11为串口1的CTS,TIM1-CH4,端口为PA11?
2、TIM5-CH4能不能产生PWM波形?
谢谢o(∩_∩)o
回复

使用道具 举报

29

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2015-4-26
在线时间
5 小时
发表于 2015-7-1 18:10:02 | 显示全部楼层
帮了我一个大忙,谢谢!
回复

使用道具 举报

4

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2016-2-3
在线时间
51 小时
发表于 2016-4-11 11:26:02 | 显示全部楼层
模仿官方给的不就行啦
/**
  ******************************************************************************
  * @file    TIM/TIM10_PWMOutput/main.c
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    08-April-2011
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/** @addtogroup STM32F10x_StdPeriph_Examples
  * @{
  */

/** @addtogroup TIM10_PWMOutput
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
uint16_t CCR1Val = 249;
uint16_t PrescalerValue = 0;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief   Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
      
  /* GPIO Configuration */
  GPIO_Configuration();

  /* -----------------------------------------------------------------------
    TIM10 Configuration: generate 1 PWM signal.
    The TIM10CLK frequency is set to SystemCoreClock (72 MHz), to get TIM10 counter
    clock at 24 MHz the Prescaler is computed as following:
     - Prescaler = (TIM10CLK / TIM10 counter clock) - 1

    The TIM10 is running at 36 KHz: TIM10 Frequency = TIM10 counter clock/(ARR + 1)
                                                  = 24 MHz / 666 = 36 KHz
    TIM10 Channel1 duty cycle = (TIM10_CCR1/ TIM10_ARR)* 100 = 37.5%
  ----------------------------------------------------------------------- */
  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 665;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM10, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM10, ENABLE);

  /* TIM10 enable counter */
  TIM_Cmd(TIM10, ENABLE);

  while (1)
  {}
}

/**
  * @brief  Configure TIM10 pin.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable TIM10 and GPIOF clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10 | RCC_APB2Periph_GPIOF |
                         RCC_APB2Periph_AFIO, ENABLE);

  /* Remap TIM10_CH1 on PF6 pin */
  GPIO_PinRemapConfig(GPIO_Remap_TIM10, ENABLE);       
  
  /* GPIOF Configuration: TIM10 Channel1 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOF, &GPIO_InitStructure);
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  while (1)
  {}
}

#endif

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
回复

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-10-14
在线时间
23 小时
发表于 2016-11-22 09:09:11 | 显示全部楼层
wyudcl 发表于 2014-6-13 00:43
PB9可以输出,这里的配置都是一样的,就是不知道怎么输不出来的?

请教楼主,logic analyzer如何显示pwm输出脚的波形?如何设置?我这边只能显示定义的全局变量的波形,,单片机的IO口不能显示,提示说是未知的signal。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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