OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8540|回复: 2

用SysTick测脉冲周期的问题

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-7-11
在线时间
0 小时
发表于 2012-8-15 19:22:34 | 显示全部楼层 |阅读模式

大家好,我是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线路挂起位
}

串口打印结果:

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-15 21:04:56 | 显示全部楼层
直接用定时器的输入捕获模式即可.
你的printf放在这里,能准确才怪.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-15 21:30:24 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
呵呵,果然是printf影响的,谢谢原子哥的提醒!!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 05:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表