我在原子的程序(PWM输出实验)改为如下:
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB2ENR|=1<<11; //TIM1时钟使能
// GPIOB->CRH&=0XFFF0FFFF;//PB12输入
// GPIOB->CRH|=0X00080000;//浮空输入
// GPIOB->ODR|=1<<12;//PB12上拉
/*
GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X0000000B;//浮空输入
GPIOA->ODR|=1<<8;//PA8上拉
GPIOA->CRH&=0XFFFFFF0F;//PA9输出
GPIOA->CRH|=0X000000B0;//浮空输入
GPIOA->ODR|=1<<9;//PA9上拉
GPIOA->CRH&=0XFFFFF0FF;//PA10输出
GPIOA->CRH|=0X00000B00;//浮空输入
GPIOA->ODR|=1<<10;//PA10上拉
*/
GPIOA->CRH&=0XFFFFF000;//PA8.9.10.输出
GPIOA->CRH|=0X00000BBB;//浮空输入
// GPIOA->ODR|=0X00000BBB;//PA8.9.10上拉
/*
GPIOB->CRH&=0XFF0FFFFF;//PB13输出
GPIOB->CRH|=0X00B00000;//浮空输入
GPIOB->ODR|=1<<13;//PB13上拉
GPIOB->CRH&=0XF0FFFFFF;//PB14输出
GPIOB->CRH|=0X0B000000;//浮空输入
GPIOB->ODR|=1<<14;//PB14上拉
GPIOB->CRH&=0X0FFFFFFF;//PB15输出
GPIOB->CRH|=0XB0000000;//浮空输入
GPIOB->ODR|=1<<15;//PB15上拉
*/
GPIOB->CRH&=0X000FFFFF;//PB13.14.15输出
GPIOB->CRH|=0XBBB00000;//浮空输入
// GPIOB->ODR|=0XBBB00000;//PB13.14.15输出
TIM1->ARR=arr;//设定计数器自动重装值
TIM1-> SC=psc;//预分频器不分频
/*
TIM1->CCMR1|=7<<4; //CH1 PWM2模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCMR1|=7<<12; //CH2 PWM2模式
TIM1->CCMR1|=1<<11; //CH2预装载使能
TIM1->CCMR2|=7<<4; //CH3 PWM2模式
TIM1->CCMR2|=1<<3; //CH3预装载使能
*/
TIM1->CCMR1|=0X7878; //CH1 CH2PWM2模式预装载使能
TIM1->CCMR2|=0X7878; //CH3 CH4PWM2模式预装载使能
/*
TIM1->CCER|=1; //OC1 输出使能
TIM1->CCER|=0<<1; //OC1 输出极性高有效
TIM1->CCER|=1<<2; //OC1N 输出使能
TIM1->CCER|=0<<3; //OC1N 输出极性高有效
TIM1->CCER|=1<<4; //OC2 输出使能
TIM1->CCER|=0<<5; //OC2 输出极性高有效
TIM1->CCER|=1<<6; //OC2N 输出使能
TIM1->CCER|=0<<7; //OC2N 输出极性高有效
TIM1->CCER|=1<<8; //OC3 输出使能
TIM1->CCER|=0<<9; //OC3 输出极性高有效
TIM1->CCER|=1<<10; //OC3N 输出使能
TIM1->CCER|=0<<11; //OC3N 输出极性高有效
*/
TIM1->CCER|=0X0FFF; //OC1.OC1N.OC2.OC2N.OC3.OC3N 通道开,输出极性低有效
// TIM1->SR|=1<<7; //OC1 刹车中断标记
// TIM1->DIER|=1<<7; //允许刹车中断
// TIM1->EGR|=1<<7; //产生一个刹车事件
TIM1->BDTR|=0X8400;//CH1主输出使能
TIM1->CR1|=1<<7; //ARPE使能
TIM1->CR1|=3<<5; //中央对齐模式3
TIM1->CR1|=1<<0; //使能定时器1
}
//通过改变TIM3->CCR2的值来改变占空比,从而控制LED0的亮度
#define LED0_PWM_VAL TIM1->CCR1
#define LED1_PWM_VAL TIM1->CCR2
#define LED2_PWM_VAL TIM1->CCR3
void Timerx_Init(u16 arr,u16 psc);
void PWM_Init(u16 arr,u16 psc);
#endif
int main(void)
{
u16 led0pwmval=300;
u16 led1pwmval=400;
u16 led2pwmval=500;
// u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
  WM_Init(900,0); //不分频。PWM频率=72000/900=8Khz
while(1)
{
// delay_us(1);
// if(dir)led0pwmval++;
// else led0pwmval--;
//
// if(led0pwmval>800)dir=0;
// if(led0pwmval==0)dir=1;
LED0_PWM_VAL=led0pwmval;
LED1_PWM_VAL=led1pwmval;
LED2_PWM_VAL=led2pwmval;
}
}
请大家指教,仿真有三相PWM输出,死区,我也试过有,刹车也可以,但是写到实验板上就不行,只有PA8.PA10有信号PA9高电平,其它都低电平,开发板是原子的,我把液晶屏拆下。
|