STM32F407 关于TIM1输出PWM

通过 CCxE、 CCxNE、 MOE、 OSSI 和 OSSR 位(TIMx_CCER 和TIMx_BDTR 寄存器)的组合使能 OCx 输出。实际上,需要将TIMx_BDTR 寄存器的 MOE和AOE位置1。这就是和普通配置PWM输出的不同点。代码如下↓


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*******************************************************************
* 功  能:   
* 作  者:   Jahol Fan  
* 参  数:  
* 返回值:   
* 其  他:   PA9 PWM输出控制转速,PA9的复用功能1是TIM1_CH2,
             TIM1:168MHZ
*******************************************************************/
void TIM1_PwmInit(u16 psc,u16 arr)
{
    GPIO_Init(GPIOA,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
    GPIO_AFSet(GPIOA,9,1);  //PA9,AF1 
    RCC->APB2ENR |= 1<<0;//使能定时器1的时钟
    TIM1->CR1 |= 1<<7;//使用 TIM1_ARR 寄存器的影子寄存器
    TIM1->CR1 &=~(1<<3);//选择定时模式:循环定时
    TIM1->CR1 &=~(1<<2);//选择更新事件源:计数器上溢或者UG位置一都可生成更新事件
    TIM1->CR1 &=~(1<<1);//使能更新事件生成
    TIM1->PSC = psc-1;//设置预分频值
    TIM1->ARR = arr-1;//设置ARR自动重装载值(上限值)。
    TIM1->CCMR1 &=~(7<<12); //清零
    TIM1->CCMR1 |= 6<<12;//设置为PWM模式1
    TIM1->CCMR1 |=(1<<11);//使能TIM1_CCR2 的影子寄存器
    TIM1->CCMR1 &=~(3<<8);//定时器通道配置为输出。
    TIM1->CCER |=(1<<5);//配置定时器通道的有效电平为低电平
    TIM1->CCR2  = arr/2;//设置CCR2的值。
    TIM1->BDTR |= 1<<15;//主输出使能
    TIM1->BDTR |= 1<<14;//MOE 可由软件置 1,也可在发生下一更新事件时自动置 1(如果断路输入无效)
    //TIM1->BDTR |= 1<<10;
    //TIM1->BDTR |= 1<<11;
    TIM1->EGR |= 1<<0;//UG位置1,主动生成更新事件,目的:初始化寄存器包括更新影子寄存器。
    TIM1->SR = 0;//将状态标志位清零
    TIM1->CCER|=1<<4;//开启PWM输出
    TIM1->CR1 |= 1<<0;//使能计数器
}

你可能感兴趣的:(STM32)