OpenEdv-开源电子网

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

贴块 STM32 用高级定时器 T1 生成CH1 CH4 的PWM 的初始化程序,大家小走弯路

[复制链接]

5

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-5-12
在线时间
27 小时
发表于 2012-5-12 11:12:39 | 显示全部楼层 |阅读模式

贴块 STM32 用高级定时器 T1 生成CH1  CH4  的PWM 的初始化程序,大家小走弯路

 RCC->APB2ENR|=1<<11;       //TIM1时钟使能   


//////////////////////////////////////// 
 GPIOA->CRH&=0XFFFF0FF0;//PA8 11 输出
 GPIOA->CRH|=0X0000B00B;//复用功能输出   
 
////////////////////////////////////////
 TIM1->BDTR |=0xC0;   //ARPE使能
 TIM1->ARR=arr;//设定计数器自动重装值
 TIM1->SC=psc;//预分频器不分频
 
 TIM1->CCMR1|=6<<4;  //CH2 PWM2模式 CH1/2 
 TIM1->CCMR1|=1<<3; //CH2预装载使能

 TIM1->CCMR2|=6<<12;  //CH2 PWM2模式 CH3/4  
 TIM1->CCMR2|=1<<11; //CH2预装载使能

 

 TIM1->CCER|=1<<0;   //OC2 输出使能
 TIM1->CCER|=1<<12;   //OC2 输出使能


 TIM1->CR1 |=0x80;   //ARPE使能
 TIM1->CR1|=0x01;    //使能定时器1

 TIM1->BDTR|=0x8000;  //使能定时器1输出



T1  和其它的定时器不一样,T2  T3  T4 都不需要最后这一句,  而调T1时,没有最后的这个BDTR,死活不出PWM。感谢  正点原子的指导。


做好的软件为人类服务
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2012-5-12 11:47:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-3-25
在线时间
0 小时
发表于 2012-5-13 10:56:52 | 显示全部楼层
谢谢楼主!
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-3-25
在线时间
0 小时
发表于 2012-5-15 20:53:53 | 显示全部楼层
楼主,我用你的程序怎么调不出来啊?求指导!
回复 支持 反对

使用道具 举报

5

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-5-12
在线时间
27 小时
 楼主| 发表于 2012-5-18 08:28:55 | 显示全部楼层
不可能吧,你直接将上面的程序 代换原子哥的PWM程序中的PWM_Init(u16 arr,u16 psc)就行了, 你再查查你初始化完PWM后有没有将这些引脚又用了做其它功能吧。我的产品都出来好几天了,在STM32F103和100都实现了的,有点信心,一定能调出来的
做好的软件为人类服务
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2012-4-15
在线时间
4 小时
发表于 2012-5-26 16:14:26 | 显示全部楼层

确实不行   仿真也不能输出波形,楼主用的是比较输出波形吧   修改如下即可
void Tim1_init(u16 arr,u16 psc)
{
     RCC->APB2ENR|=1<<11;       //TIM1时钟使能   


    ////////////////////////////////////////
     GPIOA->CRH&=0XFFFF0FF0;//PA8 11 输出
     GPIOA->CRH|=0X0000B00B;//复用功能输出   
    
    ////////////////////////////////////////
     TIM1->BDTR |=0xC0;   //ARPE使能
     TIM1->ARR=arr;//设定计数器自动重装值
     TIM1->SC=psc;//预分频器不分频
    
     TIM1->CCMR1|=6<<4;  //CH2 PWM2模式 CH1/2 
     TIM1->CCMR1|=1<<3; //CH2预装载使能
   
     TIM1->CCMR2|=6<<12;  //CH2 PWM2模式 CH3/4  
     TIM1->CCMR2|=1<<11; //CH2预装载使能
   
    
   
     TIM1->CCER|=1<<0;   //OC2 输出使能
     TIM1->CCER|=1<<12;   //OC2 输出使能
   
     TIM1->CCR1=3000; 
        TIM1->CCR4=4000;
   
     TIM1->CR1 |=0x80;   //ARPE使能
     TIM1->CR1|=0x01;    //使能定时器1
   
     TIM1->BDTR|=0x8000;  //使能定时器1输出
}


 

回复 支持 反对

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-7-28
在线时间
6 小时
发表于 2012-8-2 15:21:21 | 显示全部楼层

 TIM1->CCMR1|=6<<4;  //CH2 WM2模式 CH1/2  
 TIM1->CCMR1|=1<<3; //CH2预装载使能
 
 TIM1->CCMR2|=6<<12;  //CH2 WM2模式 CH3/4   
 TIM1->CCMR2|=1<<11; //CH2预装载使能
这里是不是应该改成这样子

 TIM1->CCMR1|=7<<4;  //CH2 WM2模式 CH1  
 TIM1->CCMR1|=1<<3; //CH2预装载使能

 TIM1->CCMR1|=7<<12;  //CH2 WM2模式 CH2 
 TIM1->CCMR1|=1<<11; //CH2预装载使能
 
 TIM1->CCMR2|=7<<4;  //CH2 WM2模式 CH3   
 TIM1->CCMR2|=1<<3; //CH2预装载使能

 TIM1->CCMR2|=7<<12;  //CH2 WM2模式 CH3   
 TIM1->CCMR2|=1<<11; //CH2预装载使能
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-11-26
在线时间
0 小时
发表于 2013-5-10 16:57:25 | 显示全部楼层
楼主是个好人  完美解决
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-6
在线时间
0 小时
发表于 2013-5-28 17:43:02 | 显示全部楼层
INT8 IOTimer::Init( UINT8 timer, UINT8 tchnl, HRESULT &hr )
{
    if (timer >= TIM_COUNT) return FALSE;

    ptr_TIM_TypeDef treg = g_Timers[timer - 1];

//debug_printf("TIM%d_%d IOTimer::Init \r\n", timer, tchnl);

// 检查并保护针脚
GPIO_PIN pin = g_IOTimer_Pins[(timer - 1) * 4 + tchnl];
if (CPU_GPIO_ReservePin(pin, TRUE) == FALSE) {
debug_printf("TIM%d_%d IOTimer::Init Failed %c%d was Reserved\r\n", timer, tchnl, ('A' + (pin >> 4)), (pin & 0x0F));
return FALSE;
}

    // relevant RCC register & bit
    __IO uint32_t* enReg = &RCC->APB1ENR;
    if ((UINT32)treg & 0x10000) enReg = &RCC->APB2ENR;
    int enBit = 1 << (((UINT32)treg >> 10) & 0x1F);

    if (!(*enReg & enBit)) { // not yet initialized
        *enReg |= enBit; // enable timer clock
        treg->CR1 = TIM_CR1_URS | TIM_CR1_ARPE; // double buffered update
        treg->EGR = TIM_EGR_UG; // enforce first update
        if (timer == 1 || timer == 8) {
            treg->BDTR |= TIM_BDTR_MOE; // main output enable (timer 1 & 8 only)
        }
    }
    
    *(__IO uint16_t*)&((uint32_t*)&treg->CCR1)[tchnl] = 0; // reset compare register
    
    // 激活PWM通道
    UINT32 mode = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE; // WM1 mode, double buffered
    if (tchnl & 1) mode <<= 8; // 1 or 3
    __IO uint16_t* reg = &treg->CCMR1;
    if (tchnl & 2) reg = &treg->CCMR2; // 2 or 3
    *reg |= mode;
    
    return TRUE;
}

TIM1和TIM8都需要设置那个
我不相信神话,我只相信汗水!我不相信命运,我只相信双手!.Net/逆向/.Net Micro Framework嵌入式http://www.NewLifeX.com,Q群:1600838
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-3-14 11:03:40 | 显示全部楼层
我用的是库函数写的,定时器1怎么没有输出PWM波呢?
#include "stm32f10x.h"
void TIM1_Config(void)
{
  TIM_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;
  TIM_OCInitTypeDef TIM1_OCInitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure; 
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   //使能TIM1时钟
  //GPIO配置为:PA8输出
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;    //推免输出
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //I/O电平翻转速度
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  //定时器基本配置
  TIM1_TimeBaseStructure.TIM_Period=1000-1;   //计数值为1000
  TIM1_TimeBaseStructure.TIM_Prescaler=3-1;   //3分频
  TIM1_TimeBaseStructure.TIM_ClockDivision=0;   //采样分频0
  TIM1_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);
  TIM1_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //管脚输出模式
  TIM1_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  //PWM1模式通道1
  TIM1_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  TIM1_OCInitStructure.TIM_Pulse=250;
  TIM_OC1Init(TIM1,&TIM1_OCInitStructure);    //初始化TIM1
  TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM1,ENABLE);  //使能TIM1在ARR上的预装载寄存器
  TIM_ClearFlag(TIM1,TIM_FLAG_CC1);//清除中断
  TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE); //开启中断
  TIM_CtrlPWMOutputs(TIM1,ENABLE);  //PWM主输出使能,即使刹车寄存器的MOE位置1
  TIM_Cmd(TIM1,DISABLE);   //失能定时器1
}
void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn;    //输出比较
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
    SystemInit();
    TIM1_Config();
    NVIC_Config();
    TIM_Cmd(TIM1,ENABLE);   //开启TIM1,TIM1开始输出PWM
    while(1);
}
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2014-2-9
在线时间
22 小时
发表于 2014-4-24 07:59:41 | 显示全部楼层
回复【楼主位】lele182:
---------------------------------
感谢楼主,麻烦问一下,PA9和PA10能设置PWM输出么?我参考你的配置了寄存器但是timer1的2、3通道无效
回复 支持 反对

使用道具 举报

33

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
506
金钱
506
注册时间
2014-1-24
在线时间
102 小时
发表于 2014-4-28 20:49:35 | 显示全部楼层
回复【10楼】STM32学徒:
---------------------------------
请问你这个调好了吗?
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-4-28 21:25:37 | 显示全部楼层
回复【12楼】北方的马克思:
---------------------------------
调好啦
回复 支持 反对

使用道具 举报

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2016-6-18
在线时间
40 小时
发表于 2016-8-2 12:54:21 | 显示全部楼层
感谢楼主
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-8-25
在线时间
61 小时
发表于 2017-3-1 22:11:13 | 显示全部楼层
liushuifong 发表于 2012-5-26 16:14
确实不行&nbsp;&nbsp; 仿真也不能输出波形,楼主用的是比较输出波形吧&nbsp;&nbsp; 修改如下即可
void Ti ...

用了楼主的程序还是没有图上的波形出来额,不知道是不是还要设置哪个地方。
回复 支持 反对

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2017-6-15
在线时间
17 小时
发表于 2017-8-3 16:53:12 | 显示全部楼层
谢谢。。。。。。。。。。
回复 支持 反对

使用道具 举报

4

主题

103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3294
金钱
3294
注册时间
2016-7-23
在线时间
269 小时
发表于 2017-8-3 17:05:47 | 显示全部楼层
Jerry299 发表于 2014-4-24 07:59
回复【楼主位】lele182:
---------------------------------
感谢楼主,麻烦问一下,PA9和PA10能设置PWM输 ...

能,PA9是USART1_TX/TIM1_CH2,PA10是USART2_RX/TIM1_CH3。不过,一般都用串口功能。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 05:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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