新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2015-4-27
- 在线时间
- 0 小时
|
5金钱
这个程序是别人的一个项目里的,程序的定时器部分里使能的是输出比较中断,并没有使能更新事件中断
在Keil的调试模式看了下TIM3的ARR寄存器的值为0x0063,CCR1寄存器的值为0x0064,DIER寄存器的值为0x0002,也就是并没有开启更新事件中断,按道里TIM3计数到了99后就会自动变成0重新计数,那么就永远无法计数到100,即永远不能触发中断函数,但是实际上他的板子跑起来中断函数是正常运行的,这让我十分疑惑,他的中断是怎么触发的呢?难道输出比较那里设置的100指的是计数了100次就触发中断而不是计数值为100时才触发?
希望原子哥或者各位解疑老师帮忙看下这个程序,解答下我的疑问,先在此谢谢了!
void TIM3_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 99;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_Pulse =100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); //禁止预装载寄存器
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void) /*timer interupt:time=((1+TIM_Prescaler )/72M)*(1+TIM_Period )*/
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
}
}
|
最佳答案
查看完整内容[请看2#楼]
TIM_TimeBaseStructure.TIM_Period = 99;
0~99 = 100次
至於為什麼沒進中斷 會不會是你編譯器把他優化掉了
看你裡面都沒寫函數
|