void TIM2_Init(void)//通用定时器16位,用于PWM输出{ CLK_PCKENR1_PCKEN10=1;//开启定时器2外设时钟
TIM2_ARRH=0x00;//设定重装载值 TIM2_ARRL=50;
TIM2_CCER1=0x01;//高电平有效 TIM2_CCMR1=0x60;//PWM模式1
TIM2_CCR1H=0;//占空比 TIM2_CCR1L=25; TIM2_CR1|=0x01;//向上计数,无缓存,使能 TIM2_BKR=0x80;//开启总输出使能}
void TIM3_Init(void)//用于采样定时{CLK_PCKENR1_PCKEN11=1;//开启定时器3外设时钟 TIM3_CR1=0x80;TIM3_PSCR=0x00;//预分频器TIM3_SMCR=0x77;//外部计数模式1TIM3_ARRH = 0x00; //TIM3_ARRL = 50; // TIM3_IER = 0x01; // 允许更新中断TIM3_CR1 |= 0x01; // 计数器使能,开始计数}
void GPIO_Init(void){ PD_DDR=0x00; PB_DDR=0xff; PC_DDR=0x80; PD_CR1=0x02; PB_CR1=0xff; PC_CR1=0xff; PD_CR2|=0x02; PC_CR2|=0x02; EXTI_CR1=0x08;//开PC1外部电平中断}
#pragma vector = EXTI1_vector __interrupt void EXIT_PORTC_01(void) //中断服务函数 { //PC_ODR^=0x80;EXTI_SR1=0xff;}
#pragma vector = TIM3_OVR_UIF_vector __interrupt void TIM3_OVR_CC(void) //中断服务函数 { PC_ODR^=0x80;TIM3_SR1=0xff;//清溢出中断标志} int main(void)
{ CLK_ICKCR|=0x04; CLK_SWR=0x02; CLK_SWCR|=0x02; CLK_CKDIVR=0x00;//使用内部LSI时钟,无分频 asm("sim"); GPIO_Init(); TIM2_Init(); TIM3_Init(); asm("rim"); //开总中断 while(1) { }}
使用的是STM8L152C6T6,PC7接了LED,程序如上,TIM2产生PWM从PB0输出,频率调节,占空比调节,一切正常。PB0连接到PD1(TIM3的外部时钟输入口),TIM3对PWM进行计数,溢出中断中对LED电平进行翻转,程序实际执行时,PWM频率780HZ,LED点亮,示波器测LED电压频率为390HZ,为啥是一半频率 |