我现在使用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执行一次。
|