OpenEdv-开源电子网

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

STM32F103RC定时器3PWM输出不正常

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-3-17
在线时间
0 小时
发表于 2014-3-17 15:26:01 | 显示全部楼层 |阅读模式
我现在使用STM32F103RC定时器3输出PWM,通道1,3老是输出不了,换以前用过的48PIN的还是103,代码完全不改,PWM输出完全正常,找了好久都没找出原因在哪,希望这里能帮我找到问题在哪。
void Ppm_Out_Init(u16 arr,u16 psc)
{
#if 0  
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能    
RCC->APB2ENR|=1<<2;   //使能PORTA口时钟

GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
 
GPIOA->CRL&=0X00FFFFFF;//PA6,7输出
GPIOA->CRL|=0XBB000000;//复用功能输出  
GPIOA->ODR|=((1<<6)|(1<<7));//PA7上拉
#else
/******** T3 PC 6,7,8,9 *********/
/******** 部分重映像 *********/
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能    
//RCC->APB2ENR|=1<<3;    //使能PORTB时钟
//RCC->APB2ENR|=1<<2;   //使能PORTA口时钟
RCC->APB2ENR|=1<<4;   //使能PORTC口时钟

// //端口映射
RCC->APB2ENR|=1<<0;       //AFIO时钟使能 
// //关闭JTAG功能
// AFIO->MAPR &= ~(0x7<<24); // 关闭JTAG功能
// AFIO->MAPR |= (0x2<<24); // 关闭JTAG功能

AFIO->MAPR &= ~(0x3<<10); // TIM3_REMAP[1:0] = 00,没有重映射
//AFIO->MAPR |= ((0x2<<10)|(1<<28)); // TIM3_REMAP[1:0] = 10,部分重映射
AFIO->MAPR |= (0x3<<10); // TIM3_REMAP[1:0] = 11,完全重映射

//GPIOA->CRL&=0X00FFFFFF;//PA 6,7 输出
//GPIOA->CRL|=0XBB000000;//复用功能输出  
//GPIOA->ODR|=((1<<6)|(1<<7));//PA 6,7 上拉
#endif

//GPIOB->CRL&=0XFFFFFF00;//PB 0,1 输出
//GPIOB->CRL|=0X000000BB;//复用功能输出  
//GPIOB->ODR|=((1<<0)|(1<<1));//PB 0,1 上拉

GPIOC->CRL&=0X00FFFFFF;//PC 6,7 输出
GPIOC->CRL|=0XBB000000;//复用功能输出  
GPIOC->ODR|=((1<<6)|(1<<7));//PA 6,7 上拉

GPIOC->CRH&=0XFFFFFF00;//PC 8,9 输出
GPIOC->CRH|=0X000000BB;//复用功能输出  
GPIOC->ODR|=((1<<8)|(1<<9));//PC 8,9 上拉

TIM3->ARR=arr;//设定计数器自动重装值 
TIM3->SC=(psc-1);//预分频器不分频 ,f CK_PSC /(PSC[15:0]+1).
//TIM3->CCMR1 &= ~(0x3<<8);
TIM3->CCMR1|=7<<12;  //CH2 PWM2模式  
TIM3->CCMR1|=1<<11; //CH2预装载使能
//TIM3->CCMR1 &= ~(0x3<<5);
TIM3->CCMR1|=7<<4;  //CH1 PWM2模式  
TIM3->CCMR1|=1<<7; //CH1预装载使能

//TIM3->CCMR2 &= ~(0x3<<8);
TIM3->CCMR2|=7<<12;  //CH4 PWM2模式  
TIM3->CCMR2|=1<<11; //CH4预装载使能
//TIM3->CCMR2 &= ~(0x3<<5);
TIM3->CCMR2|=7<<4;  //CH3 PWM2模式  
TIM3->CCMR2|=1<<7; //CH3预装载使能

//设置极性,高电平
TIM3->CCER|=((1<<1)|(1<<5)|(1<<9)|(1<<13));   //设置极性
TIM3->CCER|=((1<<0)|(1<<4)|(1<<8)|(1<<12));   //OC2 输出使能   

TIM3->CR1=0x8000;   //ARPE使能 
TIM3->CR1|=0x01;    //使能定时器3 

TIM3->CCR2 = 0;
TIM3->CCR1 = 0;
TIM3->CCR3 = 0;
TIM3->CCR4 = 0;

// /******** PC 6,7,8,9 *********/
// /******** 部分重映像 *********/
// //此部分需手动修改IO口设置
// RCC->APB1ENR|=1<<1;       //TIM3时钟使能    
// //RCC->APB2ENR|=1<<3;    //使能PORTB时钟
// //RCC->APB2ENR|=1<<2;   //使能PORTA口时钟
// RCC->APB2ENR|=1<<4;   //使能PORTC口时钟
// //GPIOA->CRL&=0X00FFFFFF;//PA 6,7 输出
// //GPIOA->CRL|=0XBB000000;//复用功能输出  
// //GPIOA->ODR|=((1<<6)|(1<<7));//PA 6,7 上拉
// //GPIOB->CRL&=0XFFFFFF00;//PB 0,1 输出
// //GPIOB->CRL|=0X000000BB;//复用功能输出  
// //GPIOB->ODR|=((1<<0)|(1<<1));//PB 0,1 上拉
// GPIOC->CRL&=0X00FFFFFF;//PC 6,7 输出
// GPIOC->CRL|=0X33000000;//复用功能输出  
// GPIOC->ODR|=((1<<6)|(1<<7));//PA 6,7 上拉
// GPIOC->CRH&=0XFFFFFF00;//PC 8,9 输出
// GPIOC->CRH|=0X00000033;//复用功能输出  
// GPIOC->ODR|=((1<<8)|(1<<9));//PC 8,9 上拉

/******** T4 PB 6,7,8,9 *********/
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<2;       //TIM4时钟使能    
RCC->APB2ENR|=1<<3;    //使能PORTB时钟

AFIO->MAPR &= ~(0x3<<12); // TIM4_REMAP[1:0] = 00,没有重映射

GPIOB->CRL&=0X00FFFFFF;//PB 6,7 输出
GPIOB->CRL|=0XBB000000;//复用功能输出  
GPIOB->ODR|=((1<<6)|(1<<7));//PB 6,7  上拉

GPIOB->CRH&=0XFFFFFF00;//PB 8,9 输出
GPIOB->CRH|=0X000000BB;//复用功能输出  
GPIOB->ODR|=((1<<8)|(1<<9));//PB 8,9 上拉

TIM4->ARR=arr;//设定计数器自动重装值 
TIM4->SC=(psc-1);//预分频器不分频 ,f CK_PSC /(PSC[15:0]+1).
TIM4->CCMR1|=7<<12;  //CH2 PWM2模式  
TIM4->CCMR1|=1<<11; //CH2预装载使能
 
TIM4->CCMR1|=7<<4;  //CH1 PWM2模式  
TIM4->CCMR1|=1<<7; //CH1预装载使能

TIM4->CCMR2|=7<<12;  //CH4 PWM2模式  
TIM4->CCMR2|=1<<11; //CH4预装载使能
 
TIM4->CCMR2|=7<<4;  //CH3 PWM2模式  
TIM4->CCMR2|=1<<7; //CH3预装载使能

//设置极性,高电平
TIM4->CCER|=((1<<1)|(1<<5)|(1<<9)|(1<<13));   //设置极性
TIM4->CCER|=((1<<0)|(1<<4)|(1<<8)|(1<<12));   //OC2 输出使能   

TIM4->CR1=0x8000;   //ARPE使能 
TIM4->CR1|=0x01;    //使能定时器4 

TIM4->CCR2 = 0;
TIM4->CCR1 = 0;
TIM4->CCR3 = 0;
TIM4->CCR4 = 0;

/******** T5 PA 0,1,2,3 *********/
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<3;       //TIM5时钟使能    
RCC->APB2ENR|=1<<2;    //使能PORTA时钟

AFIO->MAPR &= ~(0x1<<16); // TIM5_REMAP[0] = 0,没有重映射

GPIOA->CRL&=0XFFFF0000;//PA 0,1,2,3 输出
GPIOA->CRL|=0X0000BBBB;//复用功能输出  
GPIOA->ODR|=((1<<0)|(1<<1)|(1<<2)|(1<<3));//PA 0,1,2,3  上拉

TIM5->ARR=arr;//设定计数器自动重装值 
TIM5->SC=(psc-1);//预分频器不分频 ,f CK_PSC /(PSC[15:0]+1).
TIM5->CCMR1|=7<<12;  //CH2 PWM2模式  
TIM5->CCMR1|=1<<11; //CH2预装载使能
 
TIM5->CCMR1|=7<<4;  //CH1 PWM2模式  
TIM5->CCMR1|=1<<7; //CH1预装载使能

TIM5->CCMR2|=7<<12;  //CH4 PWM2模式  
TIM5->CCMR2|=1<<11; //CH4预装载使能
 
TIM5->CCMR2|=7<<4;  //CH3 PWM2模式  
TIM5->CCMR2|=1<<7; //CH3预装载使能

//设置极性,高电平
TIM5->CCER|=((1<<1)|(1<<5)|(1<<9)|(1<<13));   //设置极性
TIM5->CCER|=((1<<0)|(1<<4)|(1<<8)|(1<<12));   //OC2 输出使能   

TIM5->CR1=0x8000;   //ARPE使能 
TIM5->CR1|=0x01;    //使能定时器4 

TIM5->CCR2 = 500;
TIM5->CCR1 = 500;
TIM5->CCR3 = 500;
TIM5->CCR4 = 500;
}
经测试,定时器4,5 四路PWM输出正常,将PC 6,7,8,9用做普通IO测试翻转也正常,可就是有两路PWM输出不了,不知道为什么。
主循环中的测试代码如下:
flag++;
count += 10;
if(count>1000)count=0;
// TIM8->CCR2 = 500;
// TIM8->CCR1 = 500;
// TIM8->CCR3 = 500;
// TIM8->CCR4 = 500;
TIM3->CCR2 = 500;
TIM3->CCR1 = 500;
TIM3->CCR3 = 500;
TIM3->CCR4 = 500;
TIM4->CCR2 = count;
TIM4->CCR1 = count;
TIM4->CCR3 = count;
TIM4->CCR4 = count;
TIM5->CCR2 = count;
TIM5->CCR1 = count;
TIM5->CCR3 = count;
TIM5->CCR4 = count;
//if(flag&0x1)GPIOC->ODR|=((1<<6)|(1<<7)|(1<<8)|(1<<9));//PC 8,9 上拉
//else GPIOC->ODR&=~((1<<6)|(1<<7)|(1<<8)|(1<<9));//PC 8,9 上拉
这段代码没50ms执行一次。





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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-17 19:37:32 | 显示全部楼层
是不是芯片挂了,呵呵。或者电路有问题?
试试让PA6,PB0输出高低电平,看看正常么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 16:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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