你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S003K3如何用定时器中断处理捕获脉冲?

[复制链接]
hejun96 提问时间:2019-10-28 11:46 /
如果用STM8S的一个IO口检测一个脉冲电平,用在电话机上面,比方说是GPIO3用来检测脉冲电平变化后,MCU将接通电话的GPIO1置高,接通电话。当挂断电话后,GPIO3脉冲再次变化,GPIO1置低,电话挂断。那我的做法是用TIM1的中断检测脉冲,但是当脉冲再次变化时我该怎么做?timer1.c

#include "timer1.h"




#include <stdarg.h>
#include <stdio.h>




static  u32 TimingDelay;


//timer1_capture define
u32 TIM1ClockFreq = 25;//15Hz
u32 LSIClockFreq = 0;
u16 ICValue1 =0, ICValue2 =0;




//标志位放在TIM1中断中
volatile u8 pulse_change_flag = 0;//脉冲变化标志位,1:接通 2:挂断 0:重置
//
void Tim1_Init(void)
{
  TIM1_TimeBaseInit(16,TIM1_COUNTERMODE_UP,1000,0);//16分频,向上计数,计数完了触发中断,如果想
//再 1MS 触发中断,则计数器应该计数 1000 次,1MHZ/1000=1KHZ,正好就是 1ms。
  TIM1_ARRPreloadConfig(ENABLE);//使能自动重装
  TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//数据更新中断
  TIM1_Cmd(ENABLE);//开定时器
}


void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
{
    TimingDelay--;
  }
}


void delay_ms(u32 nTime)
{
  TimingDelay = nTime;


  while(TimingDelay != 0);
}




/*
*brief:timer1_capture输入捕获
*/
void timer1_capture(void)
{
  
        /* Capture only every 8 events!!! */
  /* Enable capture of TI1 */
  /*
  TIM1_Channel = TIM1_CHANNEL_1
  TIM1_ICPolarity = TIM1_ICPOLARITY_FALLING
  TIM1_ICSelection = TIM1_ICSELECTION_DIRECTTI
  TIM1_ICPrescaler = TIM1_ICPSC_DIV8
  TIM1_ICFilter = 0x0
  */
        //IC:Input Capture,下降沿优先
    TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI,  TIM1_ICPSC_DIV8, 0x0);
                  
        /* Enable CC1 interrupt */
        TIM1_ITConfig(TIM1_IT_CC1, ENABLE); //TIMER1 中断配置
       
        //TIM1 IT 里面用脉冲变化的标志位
        pulse_change_flag = 1;//接通       
               
       
        //
       
        /* Enable TIM1 */
  TIM1_Cmd(ENABLE);
       
        /* Clear CC1 Flag*/
  TIM1_ClearFlag(TIM1_FLAG_CC1);
         
        /* Connect LSI to CCO pin   PC4作为输出 */
     GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
        CLK_CCOConfig(CLK_OUTPUT_LSI);//时钟参数配置
        CLK_CCOCmd(ENABLE);//Configure Clock Output(CCO)使能
       
       
        /* wait a capture on CC1 */
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
        ICValue1 = TIM1_GetCapture1();
        TIM1_ClearFlag(TIM1_FLAG_CC1);
  
        /* wait a capture on cc1 */ //Configure Clock 1
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
        ICValue2 = TIM1_GetCapture1();//Input Capture
        TIM1_ClearFlag(TIM1_FLAG_CC1);
       
  /* Compute LSI clock frequency */
  LSIClockFreq = (8 * TIM1ClockFreq) / (ICValue2 - ICValue1);


}

收藏 评论8 发布时间:2019-10-28 11:46

举报

8个回答
mylovemcu 回答时间:2019-10-28 14:08:24
这个用定时器中断不太合适吧  定时器中断捕获主要用在高速检测外部信号的数量,或者测试外部信号的宽度

你这个情况直接使用IO口中断检测外部信号就可以  中断触发方式使用上升沿和下降沿触发,在中断函数中判断电平状态,就可以确定是上升沿还是下降沿,之后根据情况处理就行

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

hejun96 回答时间:2019-10-28 15:09:25
mylovemcu 发表于 2019-10-28 14:08
这个用定时器中断不太合适吧  定时器中断捕获主要用在高速检测外部信号的数量,或者测试外部信号的宽度

你 ...

用外部中断吗?
mylovemcu 回答时间:2019-10-28 15:14:38

对啊  外部中断检测就行  
hejun96 回答时间:2019-10-28 16:17:27
mylovemcu 发表于 2019-10-28 15:14
对啊  外部中断检测就行

外部中断的配置就一点,那怎么检测脉冲?

#include "exti.h"



void EXTI_Configuration(void)
{                                                //下降沿中断
  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
  EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);
}

mylovemcu 回答时间:2019-10-28 16:29:15
hejun96 发表于 2019-10-28 16:17
外部中断的配置就一点,那怎么检测脉冲?

#include "exti.h"

1、IO口配置成输入
2、使能IO口的中断
3、中断触发方式配置成上升沿和下降沿
4、配置中断函数
5、进入中断函数处理任务
butterflyspring 回答时间:2019-10-30 15:47:59
没太明白楼主说的挂断电话后脉冲是如何变化的。是由原来的电平翻转一下还是再次发出一个脉冲?不过关于捕获和外部中断倒是可以聊聊的。
1.外部中断可以判断电平变化,但是太快或者太多就不太适合,虽然配置简单,但因为没有标准位,所以变化快的脉冲不易用此方法。
2.输入捕获用作外部中断比较灵活,有相应的中断标志,甚至对于快速脉冲可是设置2个,4,等多个脉冲边沿再捕获一次,并且单个边沿可以设置简单的数字滤波。功能强大,相当灵活。

如果关注脉冲宽度,可以把一个定时器的两个通道同时连接到捕获信号,分别设置上升和下降沿。这样就知道先后和计算宽度了

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

hejun96 回答时间:2019-11-2 20:03:11
butterflyspring 发表于 2019-10-30 15:47
没太明白楼主说的挂断电话后脉冲是如何变化的。是由原来的电平翻转一下还是再次发出一个脉冲?不过关于捕获 ...

就是用一个GPIO口一直检测脉冲的变化,来电话的时候,脉冲有变化;挂断电话的时候,脉冲再次变化,控制接听和挂断的GPIO口就进行相应的置高或者是置低
butterflyspring 回答时间:2019-11-7 17:41:23
hejun96 发表于 2019-11-2 20:03
就是用一个GPIO口一直检测脉冲的变化,来电话的时候,脉冲有变化;挂断电话的时候,脉冲再次变化,控制接 ...

那就可以用捕获中断试试,一个脉冲总有一次上升或下降沿,产生中断就在软件中记录和判断拿起和挂断
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版