void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
TIM3->CR1=0x8000; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
pdf里面14.4.1 控制寄存器1(TIMx_CR1) 是:
位15:10 保留,始终读为0。
位7 ARPE :自动重装载预装载允许位 (Auto-reload preload enable) 位7
0:TIMx_ARR 寄存器没有缓冲;
1:TIMx_ARR 寄存器被装入缓冲器。
还有就是 我对照着楼主的 程序 我在PB5上结了一个LED,高电平亮。
不过到了这个里面全就灭了。 仿真的时候 PB5是高电平的呢
我的代码是:
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
//GPIOA->CRH&=0XFFFFFFF0;//PA8输出
// GPIOA->CRH|=0X00000004;//浮空输入
GPIOB->CRL&=0XFF0FFFFF;//PA7输出
GPIOB->CRL|=0X00B00000;//复用功能输出
GPIOB->ODR|=1<<5;//Pb5上拉
TIM3->ARR=arr;//设定计数器自动重装值
TIM3-> SC=psc;//预分频器不分频
TIM3->CCMR1|=7<<12; //CH2 PWM2模式 位14:12 OC2M[2:0] :输出比较2模式 (Output compare 2 mode)
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCER|=1<<4; //OC2 输出使能 CC2E:输入/ 捕获2输出使能 (Capture/Compare 2 output enable)
TIM3->CR1=0x8000; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
主函数:
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
// PWM_Init(900,0);
uart_init(72,9600); //串口初始化
  WM_Init(900,0);
while(1)
{
delay_ms(10);
if(dir) led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
LED0_PWM_VAL=led0pwmval;
}
}
|