各位大哥,小弟最近用stm32f429做pwm输出实验,就是想改一下原子哥的事例程序
l两种程序如下
原子哥程序:
void TIM3_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
RCC->AHB1ENR|=1<<2; //使能PORTB时钟
GPIO_Set(GPIOB,PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
GPIO_AF_Set(GPIOB,1,2); //PB1,AF2
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器不分频
TIM3->CCMR2|=6<<12; //CH4 PWM1模式
TIM3->CCMR2|=1<<11; //CH4 预装载使能
TIM3->CCER|=1<<12; //OC4 输出使能
TIM3->CCER|=1<<13; //OC4 低电平有效
TIM3->CR1|=1<<7; //ARPE使能
TIM3->CR1|=1<<0; //使能定时器3
}
xt-size-adjust: auto; -webkit-text-strint main(void)
{
u16 led0pwmval=0;
u8 dir=1;
Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
delay_init(180); //初始化延时函数
LED_Init(); //初始化与 LED 连接的硬件接口
TIM3_PWM_Init(500-1,90-1); //1Mhz 的计数频率,2Khz 的 PWM.
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 TIM2_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR |= 1<<0;
RCC->AHB1ENR |=1<<1; //open the clock of GPIOB
GPIO_Set(GPIOB,PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOB,1,1); //PB1,AF1
TIM2->ARR =arr;
TIM2->PSC =psc;
TIM2->CCMR2 |= 6<<12; //CH4 PWM1 模式
TIM2->CCMR2 |= 1<<11; //CH4 预装载使能
TIM2->CCER|=1<<12; //OC4 输出使能
TIM2->CCER|=1<<13; //OC4 低电平有效
TIM2->CR1|=1<<7; //ARPE 使能
TIM2->CR1|=1<<0; //使能定时器 2
}
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
Stm32_Clock_Init(360,25,2,8);
delay_init(180);
//uart_init(90,115200);
LED_Init();
//TIM2_Int_Init(5000-1,9000-1); //10Khz的计数频率,计数5K次为500ms
TIM2_PWM_Init(500-1,90-1);
//EXTIX_Init();
LED0=0;
//delay_ms(10);
//delay_ms(300);
//IWDG_Init(4,1000);
//WWDG_Init(0x7f,0x5f,3);
//WWDG_Init(u8 tr,u8 wr, u8 fprer);
while(1)
{
delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval>300)
dir=0;
if(led0pwmval==0)
dir=1;
LED0_PWM_VAL1=led0pwmval;
}
}
这个时候我怀疑定时器2有问题,就用定时器2做了定时器溢出中断实验 发现无任何异常,现在很困惑为什么TIM3能输出pwm,而TIM2就输出不了!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好,谢谢了,我试试!!!
一周热门 更多>