STM32F4xx_高级定时器 PWM+互补+断路+死区(已验证)

注:原创, 已验证, 随便复制,无版权要求~~

PWM的教程刨了四五天, 高级定时器的PWM一直没法打开, 心都差点凉了.
打了半天王者荣耀, 然后参考野火哥的例程,结合STM库函数, 一点点打散, 用寄存器操作, 终于有点眉目了.

以下代码, 按STM库函数内的顺序码的,已输出验证过.
弯路心得 :
1_代码顺序, 有几行先后要求的, 小心无法正确输出
2_三个概念比较重要: 更新(中断时汲及广) \ 影子寄存器(作用时效) \ 对齐方式(不同的电机)
3_代码分组写易理解

// GPIO 初始化部分
// ***********************************************
    RCC->AHB1ENR |= 0x1 << 0;           // 使能时钟 PA
    RCC->AHB1ENR |= 0x1 << 2;           // 使能时钟 PC   
    GPIOC->MODER   |= 0x2 << 2*6;       // 主信号输出引脚   PC6  TIM8_CH1_	 复用,开漏,   无效(速度,上下拉,ODR)    
    GPIOA->MODER   |= 0x2 << 2*5;       // 互补输出引脚     PA5  TIM8_CH1_	 复用,开漏,   无效(速度,上下拉,ODR)   
    GPIOA->MODER   |= 0x2 << 2*6;       // 断路保护        PA6   TIM8_CH1_ 复用,开漏,   无效(速度,上下拉,ODR)   
   
    GPIOC->AFR[0]  |= 0x3 << 4*6;       // 引脚复用  0x3 = GPIO_AF_TIM8
    GPIOA->AFR[0]  |= 0x3 << 4*5;       // 引脚复用  0x3 = GPIO_AF_TIM8
    GPIOA->AFR[0]  |= 0x3 << 4*6;       // 引脚复用  0x3 = GPIO_AF_TIM8   



 // TIM 初始化部分
 // ************************************************
    RCC->APB2ENR |= 1<<1;       // 使能时钟 TIM8   
    
    // 时基配置
    TIM8->CR1 = 0;
    TIM8->CR1 = 0 << 4;         // 方向,递增
    TIM8->CR1 = 0 << 5;         // 对齐,边沿
    TIM8->CR1 = 0 << 8;         // 分频,不分频      
    TIM8->ARR = 1000-1;
    TIM8->PSC = 1800-1;
    TIM8->RCR = 0;              // 重复计数器      
    TIM8->EGR = 1;       
    TIM8->CCR1  = 900-1 ;   
       
    // 通道x配置
    TIM8->CCER  = 0;            // 关闭通道1 
    // CR2   输出模式:闲时极性   输入模式:DMA等    
    TIM8->CR2   = 0;
    TIM8->CR2  |= 1<<8;         // [  ; 8] 通道1 闲时极性      1:高电平
    TIM8->CR2  |= 0<<9;         // [  : 9] 通道1 互补闲时极性  0:低电平   
    
    // CCMR1  通道x 模式配置
    TIM8->CCMR1  =0;
    TIM8->CCMR1 |=  0x6<<4;     // [ 6: 4] 通道1 输出模式   110:PWM1_CNT<ARR_有效     
                
    // CCER  通道 闲时极性 \ 使能
    TIM8->CCER |=  0 << 1;      // [  : 1] 通道1 输出极性      0:高电平有效
    TIM8->CCER |=  1 << 0;      // [  : 0] 通道1 输出使能      
    TIM8->CCER |=  0 << 3;      // [  : 3] 通道1 互补输出极性  0:高电平有效      
    TIM8->CCER |=  1 << 2 ;     // [  : 2] 通道1 互补输出使能  1:低电平有效   
      
	// BDTR  断路\死区控制   	
    TIM8->BDTR  =  11 << 0;     // [ 7: 0] 死区持续时间
    TIM8->BDTR |=   0 << 8;     // [ 9: 8] 锁定配置
    TIM8->BDTR |=   1 << 10;    // [  :10] MOE=0的关闭状态
    TIM8->BDTR |=   1 << 11;    // [  :11] MOE=1的关闭状态
    TIM8->BDTR |=   0 << 12;    // [  :12] 断路使能
    TIM8->BDTR |=   0 << 13;    // [  :13] 断路极性   00:低电平有效
    TIM8->BDTR |=   1 << 14;    // [  :14] 自动输出使能  00:只能软件置1  01:软件\更新置1

// 使能 开始工作
// *****************************************************
	TIM8->BDTR |=   1 << 15;    // 主动输出使能 , 高级定时器必须置些位
	TIM8->CR1  |= 1;            // 使能定时器        

猜你喜欢

转载自blog.csdn.net/zhouml_msn/article/details/90933648