F407寄存器死区设置问题?

2019-07-20 20:18发布

各位大神,帮忙看一下,此程序不好使,不能输出PWM波?我用的是STM32F407ZGT6,寄存器版,我参考咱们群里的法F103精华帖改的,不知道哪里出错了! 00.png 11.png 22.png

//定时器8产生6路PWM实验  
//通过定时器的PWM2模式,在PA7、PC6~PC8、PB0、PB1,输出6路PWM
//输出互补PWM+死区
#include "sys.h"
#include "delay.h"
//端口宏定义
#define LED0 PFout(9)   //DS0
void TIM8_PWM_Init(u16 arr,u16 psc);
//定义IO口,和外部硬件连接
void LED_Init(void)
{
        RCC->AHB1ENR|=1<<5;//使能PORTF时钟
        GPIO_Set(GPIOF,PIN9,GPIO_MODE_OUT,GPIO_OTYPE_PP,
                GPIO_SPEED_100M,GPIO_PUPD_PU);//PF9,PF10设置
        LED0=1;//LED0关闭
}
//TIM8 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM8_PWM_Init(u16 arr,u16 psc)
{
    //此部分需手动修改IO口设置
        RCC->APB2ENR|=1<<1;   //外设时钟使能寄存器,TIM8时钟使能
        RCC->AHB1ENR|=1<<0;   //外设时钟使能寄存器,IO端口A时钟使能
        RCC->AHB1ENR|=1<<1;   //外设时钟使能寄存器,IO端口B时钟使能
        RCC->AHB1ENR|=1<<2;   //外设时钟使能寄存器,IO端口C时钟使能
        GPIO_Set(GPIOA,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_Set(GPIOB,PIN0|PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_Set(GPIOC,PIN6|PIN7|PIN8,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_AF_Set(GPIOA,7,3);//把IO口PA7,设置成复用AF3(TIM8)
        GPIO_AF_Set(GPIOB,0,3);//把IO口PB0,设置成复用AF3(TIM8)
        GPIO_AF_Set(GPIOB,1,3);//把IO口PB1,设置成复用AF3(TIM8)
        GPIO_AF_Set(GPIOC,6,3);//把IO口PC6,设置成复用AF3(TIM8)
        GPIO_AF_Set(GPIOC,7,3);//把IO口PC7,设置成复用AF3(TIM8)
        GPIO_AF_Set(GPIOC,8,3);//把IO口PC8,设置成复用AF3(TIM8)
       
        TIM8->ARR=arr;   //设定计数器自动重装值
        TIM8->PSC=psc;   //预分频器
       
        TIM8->CCER|=1<<0;   //TIM8CH1 输出使能       
        TIM8->CCER|=1<<2;   //TIM8CH1N 输出使能
       
        TIM8->CCER|=1<<4;   //TIM8CH2 输出使能
        TIM8->CCER|=1<<6;   //TIM8CH2N 输出使能       
       
        TIM8->CCER|=1<<8;   //TIM8CH3 输出使能
        TIM8->CCER|=1<<10;   //TIM8CH3N 输出使能
       
       
        TIM8->CCMR1|=7<<4;          //CH1 PWM2模式                 
        TIM8->CCMR1|=1<<3;                 //CH1预装载使能         
        TIM8->CCMR1|=7<<12;          //CH2 PWM2模式                 
        TIM8->CCMR1|=1<<11;         //CH2预装载使能         
        TIM8->CCMR2|=7<<4;          //CH3 PWM2模式                 
        TIM8->CCMR2|=1<<3;                 //CH3预装载使能         

        TIM8->BDTR|=1<<15;   //只有高级定时器需要设置MOE主输出使能
        TIM8->BDTR|=0x14;    //死区时间设置,2ms

        TIM8->CR1|=1<<7;    //ARPE使能
        TIM8->CR1|=1<<0;    //使能定时器8
}
int main(void)
{  
        Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
        delay_init(168);                    //延时初始化
        LED_Init();       
        TIM8_PWM_Init(500-1,8400-1);//1MHz的计数频率,50ms的PWM
           while(1)
        {
                delay_ms(200);       
                LED0=!LED0;
                TIM8->CCR1=250;//占空比50%,低电平时长25ms
                TIM8->CCR2=125;//占空比25%,
                TIM8->CCR3=50; //占空比10%,
        }
}




0条回答

一周热门 更多>