OpenEdv-开源电子网

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

TIM1 CH2(PA9) 输出PWM例程,用我们的 STM32开发板可以直接下载测试

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-9-15 11:26:18 | 显示全部楼层 |阅读模式

 早上有个朋友问PA9不能输出PWM,即TIM1_CH2无法输出PWM,说和串口有关,因为PA9又是串口的TXD,同时是TIM1_CH2的输出口。
于是测试了下,发现没什么问题,只是复用的时候,串口1的TXD具有优先权,也就是两个复用功能都开启的时候,TXD占优,这就和之前遇到的FSMC和PWM共用一个引脚的时候,FSMC的复用功能占优一样,看来定时器在复用引脚的时候,优先级很低啊,呵呵。

解决办法很简单,就是不使用串口1,那么TIM1_CH2就可以输出PWM了。
附件是例程,源码也很简单,如下:
#define PA9_PWM_VAL   TIM1->CCR2 //LCD PWM背光设置


void PA9_PWM_TEST(void)
{
 TIM1_PWM_Init(900,0);//80Khz 频率
 while(1)
 {
  A9_PWM_VAL+=10;
  if(PA9_PWM_VAL>900)PA9_PWM_VAL=0;
  delay_ms(10);
 }


int main(void)
{       
  Stm32_Clock_Init(9);  //系统时钟设置
 delay_init(72);       //延时初始化
 //uart_init(72,9600);   //串口初始化,屏蔽掉
 LED_Init();       //初始化与LED连接的硬件接口
 A9_PWM_TEST();   //PA9输出PWM             
}

TIM1_PWM_Init初始化代码如下:

//TIM1 CH2 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{        
 //此部分需手动修改IO口设置
 RCC->APB2ENR|=1<<11;  //TIM1时钟使能   
 RCC->APB2ENR|=1<<3;     //使能PORTB时钟    
  RCC->APB2ENR|=1<<2;     //使能PORTA时钟    
    
 GPIOB->CRH&=0XF0FFFFFF; //PB14输出
 GPIOB->CRH|=0X0B000000; //复用功能输出   
 GPIOB->ODR|=1<<14;  //PB14上拉 

 GPIOA->CRH&=0XFFFFFF0F; //PA9输出
 GPIOA->CRH|=0X000000B0; //复用功能输出   
 GPIOA->ODR|=1<<9;  //PA9上拉 

 TIM1->ARR=arr;   //设定计数器自动重装值
 TIM1->SC=psc;   //预分频器不分频
 
 TIM1->CCMR1|=7<<12;  //CH2 PWM2模式  
 TIM1->CCMR1|=1<<11;  //CH2预装载使能   

  TIM1->CCER|=1<<6;    //OC2互补输出使能   
  TIM1->CCER|=1<<4;    //OC2 输出使能   
 
   TIM1->BDTR|=1<<15;    //MOE主输出使能   

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

TIM1 PWM输出实验.rar

28.59 KB, 下载次数: 1322

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-9-15
在线时间
0 小时
发表于 2013-9-15 12:24:10 | 显示全部楼层
谢谢原子兄,问题已经解决了,程序里面必须加把RCC关闭才能关闭串口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);

这句话才行
否则只要时钟打开了,不管怎么配置寄存器,关闭输出TX什么的,都会有高电平在AFIO上

不知算不算是STM的一个小BUG...

用下面这句话的朋友要小心了:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE);
回复 支持 反对

使用道具 举报

25

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2015-5-6
在线时间
19 小时
发表于 2015-7-18 16:40:00 | 显示全部楼层
回复【2楼】Sun1123:
---------------------------------
关闭了还是不行啊。。
回复 支持 反对

使用道具 举报

37

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
485
金钱
485
注册时间
2015-5-5
在线时间
34 小时
发表于 2015-9-24 18:21:30 | 显示全部楼层
为什么我关闭了还是那样。就是tim1的通道1,3,4都可以。就是2不行。屏蔽了// uart_init(72,9600);   //串口初始化为9600。。。。。还是输不出波形呢
弹起华丽的乐章 撕下最后的伪装
回复 支持 反对

使用道具 举报

37

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
485
金钱
485
注册时间
2015-5-5
在线时间
34 小时
发表于 2015-9-24 18:22:07 | 显示全部楼层
int main(void)
{     
   
JTAG_Set(SWD_ENABLE);
Stm32_Clock_Init(9); //系统时钟设置
// uart_init(72,9600);   //串口初始化为9600
delay_init(72);       //延时初始化 
LED_Init();    //初始化与LED连接的硬件接口
TIM1_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz
    while(1)
{
TIM1->CCR1=100;
TIM1->CCR2=300;
TIM1->CCR3=450;
TIM1->CCR4=700;
}
}
弹起华丽的乐章 撕下最后的伪装
回复 支持 反对

使用道具 举报

37

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
485
金钱
485
注册时间
2015-5-5
在线时间
34 小时
发表于 2015-9-24 18:22:27 | 显示全部楼层
void TIM1_PWM_Init(u16 arr,u16 psc)
{    
//此部分需手动修改IO口设置
RCC->APB2ENR|=1<<11;  //TIM1时钟使能
   
RCC->APB2ENR|=1<<2;     //使能PORTA时钟
GPIOA->CRH&=0XFFFF0000; //PA891011输出
GPIOA->CRH|=0X0000BBBB; //复用输出   

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

TIM1->CCMR1|=6<<12;   //CH2 WM2模式    //7低电平有效,PWM越大,低电平持续的时间越长//
TIM1->CCMR1|=6<<4;   //CH1 WM2模式  
TIM1->CCMR1|=1<<11;  //CH2预装载使能    
TIM1->CCMR1|=1<<3;    //CH1预装载使能

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

TIM1->CCER|=1<<4;    //OC2 输出使能
TIM1->CCER|=1<<0;    //OC1 输出使能   
TIM1->CCER|=1<<8;    //OC3 输出使能
TIM1->CCER|=1<<12;    //OC4 输出使能

TIM1->BDTR|=1<<15;
TIM1->CR1=0x0080;    //ARPE使能 
TIM1->CR1|=0x01;     //使能定时器2    
}
弹起华丽的乐章 撕下最后的伪装
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-5-16
在线时间
5 小时
发表于 2016-5-16 00:27:32 | 显示全部楼层
原子你好,请问可不可以只在PB14上输出互补极性,而PA9上不输出PWM,正常使用串口
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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