早上有个朋友问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
}
|