跪求,我的STM32f1不能输出PWM
我是初学者,现在用STM32F1.用定时器1,PA8的口输出PWM,但怎样配置都不能有效果输出,求大神支招int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600);//串口初始化
LED_Init(); //初始化与LED连接的硬件接口
TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
LED0_PWM_VAL=led0pwmval;
}
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOD
|RCC_APB2Periph_GPIOC
|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8; //选择P8口
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //50Mhz
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
void time_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
TIM_OCInitTypeDef TIM_OCInitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //1
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStrue.TIM_Period =1000; //重装载值
TIM_TimeBaseInitStrue.TIM_Prescaler =72; //预分频
TIM_TimeBaseInitStrue.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStrue);
// TIM_OCInitStrue.TIM_OCIdleState
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;
// TIM_OCInitStrue.TIM_OCNIdleState
// TIM_OCInitStrue.TIM_OCNPolarity
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High; //输出极性
// TIM_OCInitStrue.TIM_OutputNState
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStrue.TIM_Pulse=300;
TIM_OC1Init(TIM1,&TIM_OCInitStrue);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //预重装载值(可用可不用)
TIM_Cmd(TIM1,ENABLE); //使能定时器
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
}
本帖最后由 toofree 于 2018-7-17 00:30 编辑
程序仿真试过了,没问题。PA8,有0、1交替变化。
查看一下你的SystemCoreClock,是不是72M。如果不是72M的话,肯定是不行的。
但你可以把TIM1的分频系数“TIM_TimeBaseInitStrue.TIM_Prescaler =72;”改小,改小后时钟会快一些。
本帖最后由 wenyangzeng 于 2018-7-17 07:31 编辑
ST官方代码修改一下就可以了
正在学习STM32产生PWM波,学习学习!谢谢分享
页:
[1]