我想用定时器2的定时功能产生一个第一个脉冲波周期为200ms,以后波形周期为400ms的波形,如下图1:
图1
写了一个程序,不知错在哪里,产生如图波形如图2
图2
注:在time.c的程序中使用了定时器的的预装载功能,即ARPE=1,
主程序:
int main(void)
{
char c=0;
RCC_Configuration(); //使能外设时钟
GPIO_Configuration(); //初始化GPIO管脚
NVIC_Configuration();
TIM_Configuration() ;
while(1)
{
if (b==0)
if ((GPIOA->ODR & 1)==1)
{
delay_ms(10);//延时10ms
TIM2->ARR = 400 ;//计数器运行时修改ARR的值,由于ARPE=1,所以应该不会影响影子寄存器
c=1;
}
}
}
------------------------------------------------------------
RCC_Configuration(); //使能外设时钟
在这里面设置系统时钟为72MHz
GPIO_Configuration(); //初始化GPIO管脚
打开了GPIOA的时钟,并且设置GPIOA.0引脚为推挽输出
NVIC_Configuration();
设置相关的通道
--------------------------------------------------
中断服务程序设置如下:
char a=0x00;
void TIM2_IRQHandler(void)
{
a=~a;
GPIOA->ODR=(a & 0x01);
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); // 清除中断标志位
}
------------------------------------------------
定时器2配置设置如下:
TIM_Configuration() ;
{
TIM_DeInit(TIM2);
TIM2->SMCR &= 0xfff8 ; //配置 TIM 的内部时钟
TIM2->ARR = 200; // 自动重装载值
TIM2-> SC = 35999; //预分频
TIM2->CR1 |= 0x80 ; //方向向上计数,开启预装载功能
TIM2->EGR |= 0x01; // 软件产生更新事件,所有影子寄存器都被更新
TIM2->SR &= (~0x01) ; //清除中断标志
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器2时钟
TIM2->DIER |= 0x01; //使能定时器中断
TIM2->CR1 |= 0x01 ; //使能计数器
}
-----------------------------------------------------
在ARPE=1,并且在定时器运行时修改了ARR的值,所以影子寄存器的值只能在产生更新事件时更新,如果这样,就不会产生上图2的波形,
而能产生上图1的波形,所以不知错在哪里,请大神指点,O(∩_∩)O谢谢! |