大家好,我是STM32初学者。最近在编写测脉冲周期的程序遇到点问题。想法是这样的:设置PB15为外部中断模式,上升沿触发;第一次进入中断处理程序启动SysTick计数,第二次进入时停止计数,得到(SysTick->LOAD-SysTick->VAL)/9应该就是脉冲的周期。现在的脉冲产生是由TIM3产生的PWM脉冲,周期100us。问题是测量出来的周期是变化的,而且是周期的变化。请问这是什么情况呀?
附主要程序:
void Delay_init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
}
void ExtiVelo_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStructure;
/* 时钟使能GPIOB*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*初始化GPIOB的Pin_15上拉输入*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
/*配置外部中断EXTI_15*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
//调用固件库函数 GPIO_EXTILineConfig(),其中2参数分别是中断口和中端口对应的引脚
EXTI_InitStructure.EXTI_Line=EXTI_Line15; //将中断映射到中断/事件源Line11
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //设置为上升沿中断
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断使能,即开中断
EXTI_Init(&EXTI_InitStructure);
//调用 EXTI_Init库函数,将结构体写入EXTI相关寄存器中
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn; //!!!!!不是EXTI15_10_IRQChannel
//选用通道15~10,即2选择Px10,Px11,Px12,Px13,Px14,Px15作为中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//0级抢占式优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;//0级副优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能引脚作为中断源
NVIC_Init(&NVIC_InitStruct);//调用NVIC_Init固件库函数进行设置
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line15)!= RESET)
{
if(V_Flag==0)
{
V_Flag=1;
SysTick->LOAD=(u32)0xffffff;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
printf("第①次进入中断:%d us\r\n",SysTick->VAL/9);
SysTick->CTRL=0x01; //开始倒数
}
else
{
V_Flag=0;
SysTick->CTRL=0x00; //关闭计数器
printf("第二次进入中断:%d us\r\n",(0xffffff-SysTick->VAL)/9);
SysTick->VAL =0X00; //清空计数器
}
}
EXTI_ClearITPendingBit(EXTI_Line15); //清除EXTI11线路挂起位
}
串口打印结果:
|