加了定时器中断配置就可以了,不过灯一直是常亮的,仿真PA。7,高低转换的时间为0.5秒,和我设置的一样!
大循环中50MS发一下调试信息,不过count变化好快,好像不是500MS进一次中断的样子!
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
GPIOA->CRL&=0X0FFFFFFF;//PA7输出
GPIOA->CRL|=0XB0000000;//复用功能输出
GPIOA->ODR|=1<<7;//PA7上拉
TIM3->ARR= 0xffff;//arr;//设定计数器自动重装值
TIM3-> SC=psc;//预分频器不分频
TIM3->CCMR1|=3<<12; //翻转模式
TIM3->CCR2=5000;
TIM3->DIER=1<<2; //CC2IE 允许捕获比较中断2
TIM3->CCER|=1<<4; //OC2 输出使能
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
void TIM3_IRQHandler(void)
{
Count++; //测试
if(TIM3->SR&0X0004) //查看CC2IF标记
{
TIM3->CNT=0x0000;
}
TIM3->SR&=~(1<<2); //清标记位
}
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
Timer4_Init(50,7199);//10Khz的计数频率,计数到50为5ms
//LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
PWM_Init(8000,7199); //不分频。PWM频率=72000/900=8Khz
while(1)
{
delay_ms(50);
printf("Count0:%d\n",Count); //10 进制
}
}
|