中级会员
 
- 积分
- 312
- 金钱
- 312
- 注册时间
- 2013-6-26
- 在线时间
- 0 小时
|
编个程序自己玩玩,构思好了,编写出来,发现软件仿真的结果与自己预期的的不太一样,有图
构想:以0.5S的速度翻转,看到led灯闪烁;如果某一刻按下按键 PA8 则改变频率 1S翻转一次,然后就没有然后了。
先放上定时器配置:
void GP_Timer_Configuration(void)//通用定时器配置
{
TIM_TimeBaseStructure.TIM_Period =4999;//定时500毫秒
TIM_TimeBaseStructure.TIM_Prescaler = 7199;//分频数=7200=7199+1
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;//时钟分频因子在这里没有用,选为缺省值即可
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数模式
//TIM_TimeBaseStructure.TIM_RepetitionCounter=? 这个参数是高级定时器需要的,不配置也可以
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE); //也不知道这句到底有没有意义
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
}
外部中断处理程序
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8)!= RESET)//确认是来自EXIT_8的中断 SW5被按下
{
//TIM_UpdateDisableConfig(TIM3, DISABLE);
TIM_TimeBaseStructure.TIM_Period =9999;//定时1000毫秒
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// TIM_UpdateDisableConfig(TIM3, ENABLE);
EXTI_ClearITPendingBit(EXTI_Line8);
}
}
然后上图:
从软件的仿真来看,效果似乎实现了,但是问题的关键是从0.5s翻转变到1s翻转的那一小段。
我设置的定时器向上计数,中断是更新中断,在其中断处理程序中翻转LED状态。逻辑分析仪的显示仿佛在说按下按键时,发生了两件事:
1、进入了外部中断 修改了ARR的值
2、进入了定时器中断,翻转的led
问题是,有可能进入定时器中断吗?有事件更新发生吗?
上文档图:
如果按照文档的时序图,我预期按下按键时,ARR被载入新值,等到以0.5秒为间隔的更新事件发生,再载入到影子寄存器,然后再以1s为间隔发生更新事件。
仿真与预期不符,是我预期错了,还是仿真(软件)错了。望指教。
PS,要不拿示波器看看? |
|