研究生
最后登录1970-1-1
在线时间 小时
注册时间2019-5-23
|
楼主 |
发表于 2019-7-18 07:59:45
|
显示全部楼层
请问一下为什么我的程序用两个外部中断触发时,一个中断触发计数一个关闭计数时,我的读取到的计数值是错误的,还有每次显示的值都是一样的,我已经清零了,我试过两个外部中断的触发是正常的,一个外部中断触发时开显示器,另一个触发时关闭显示器,用这个检测到外部中断触发是正常的,但是不知道为什么我的计数值就是不对,定时器的配置跟例程的定时配置是一样的,还有一个为什么有时候我用整形时赋值给0出来的结果显示值为1,给一显示值其实为2的,有时候又是正常的值,请求知道的大佬解答一下,谢谢了
代码
time=TIM_GetCounter(TIMX); //获取计数器值
time+=(TIME_A_B)*60000; //定时器3中断计数值一次最大计数为60000us,计算出总时间
time=time*0.000001; //转换单位为 s
testCNT3 =time;
sprintf(dispBuff3 ,"TIME= %f s",testCNT3); //使用c标准库把变量转化成整形
display_string_5x8_1(7,1,dispBuff3 ); //dispBuff为转换后的整形
//#define TIMX TIM3
//#define TIM_RCC_APB1Periph_TIMX RCC_APB1Periph_TIM3
//#define TIM_RCC_APB1PeriphClockCmd RCC_APB1PeriphClockCmd
//#define TIMX_IRQ TIM3_IRQn
//#define BASE_TIMX_IRQHandle TIM3_IRQHandler
static void BASIC_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断组为2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 设置中断来源.
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQ ;
// 设置主优先级为 2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0x02;
// 设置抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static void BASIC_TIM_Config(uint16_t ARR,uint16_t PSC)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 开启定时器时钟,即内部时钟CK_INT=72M
TIM_RCC_APB1PeriphClockCmd(TIM_RCC_APB1Periph_TIMX,ENABLE);
// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Period = ARR;
TIM_TimeBaseStructure.TIM_Prescaler= PSC;// 时钟预分频数为
// 时钟分频因子
TIM_TimeBaseStructure.TIM_ClockDivision=0;
// 计数器计数模式向上计数
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//初始化定时器
TIM_TimeBaseInit(TIMX, &TIM_TimeBaseStructure);
// // 清除计数器中断标志位
// TIM_ClearFlag(TIMX, TIM_FLAG_Update);
// 开启计数器中断
TIM_ITConfig(TIMX,TIM_IT_Update,ENABLE);
BASIC_TIM_NVIC_Config();//调用NVIC设置
TIM_Cmd(TIMX, DISABLE); // 暂时关闭计数器
}
void BASIC_TIM_Init(void)
{
BASIC_TIM_Config(59999,71);//最大为60000us
}
//TIM3的中断服务函数
void BASE_TIMX_IRQHandle(void )
{
if (TIM_GetITStatus(TIMX,TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIME_A_B++; //记录发生了多少次中断
TIM_ClearITPendingBit(TIM3,TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
//外部中断3服务程序
void KEY2_IRQHandler(void)
{
TIM_SetCounter(TIMX,0); //定时器3计数器清零
if(KEY2==0) //按键KEY2
{
time=0; //时间清零
// TIM_SetCounter(TIM3,0); //定时器3计数器清零
TIME_A_B=0; //溢出中断标志位清零
TIM_Cmd(TIM3, ENABLE); //使能TIM3
EXTIx_KEY2=1;
}
EXTI_ClearITPendingBit(KEY2_EXTI_LINE); //清除LINE3上的中断标志位
}
void KEY1_IRQHandler(void)
{
if(KEY1==0) //按键KEY1
{
TIM_Cmd(TIM3, DISABLE); //失能TIMx外设
EXTIx_KEY1=1;
}
EXTI_ClearITPendingBit(KEY1_EXTI_LINE); //清除LINE4上的中断标志位
}
|
|