2# 香水城
不好意思,我贴上我的部分程序说吧:
首先是TIM 的配置。
初始化的时候定义了TIM2的溢出和通道一,但只开启了TIM2 的溢出
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = 800;//定时器计数值1
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基础设置,其中AHB1为20M,分频值为2000,所以定时器速度为10K,计数值是1000,所以0.1S溢出*/
TIM_TimeBaseStructure.TIM_Period = 1000; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 2000-1; //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* 比较通道1*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //输出比较非主动模式
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为正
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* 4个通道和溢出都配置中断*/
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* 允许TIM2开始计数 */
TIM_Cmd(TIM2, ENABLE);
}
然后就是TIM2 的中断处理函数,在溢出中处理 Key_Scan()函数,是一个键盘扫描函数
在通道一中断处理中是display()函数,是一个显示函数。
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
Key_Scan();
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
/*必须清空标志位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
display();
}
}
然后,是键盘扫描函数Key_Scan()中开启和关闭通道1 的部分函数
。。。。。。。。
else if(Key==KEY_SET_LONG)
{
if(menu_num==MENU) //当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);/*预先清除通道1的中断位*/
TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE);/* 关闭通道1的中断*/
menu_num=MENU_PW;
}
}
else if(Key==KEY_MAN_LONG) //当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面
{
if(menu_num==MENU_PW)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);/*预先清除通道1的中断位*/
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);/* 开启通道1的中断*/
menu_num=MENU;
}
}
。。。。。。。
想要实现是功能如注释,当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面;
当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面;
可调试的时候发现,只能实现在当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面
但是当在主界面的时候,长按SET键,无法关闭TIM2通道1的中断,跳回密码界面;
我说的程序没啥问题是指,我用TIM2和TIM3两个定时器,在TIM2中处理键盘扫描,在TIM3里处理显示,TIM2的优先级高于TIM3就可以实现
当在主界面的时候,长按SET键,关闭TIM2通道1的中断,跳回密码界面;
当在密码界面的时候,长按MAN键,开启TIM2通道1的中断,跳回主菜单界面;
所以想问的是,如果只用TIM2一个定时器,用里面的溢出和四个通道,怎么去定义TIM2的溢出中断和四个通道它们的优先级?
语言组织能力不佳,也不晓得香主能不能看懂。。
|