搜索
查看: 1627|回复: 8

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

[复制链接]

该用户从未签到

14

主题

76

帖子

9

蝴蝶豆

金牌会员

最后登录
2023-12-5
发表于 2019-10-28 11:46:19 | 显示全部楼层 |阅读模式
如果用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);


}

回复

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-10-28 14:08:24 | 显示全部楼层
这个用定时器中断不太合适吧  定时器中断捕获主要用在高速检测外部信号的数量,或者测试外部信号的宽度

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

76

帖子

9

蝴蝶豆

金牌会员

最后登录
2023-12-5
 楼主| 发表于 2019-10-28 15:09:25 | 显示全部楼层
mylovemcu 发表于 2019-10-28 14:08
这个用定时器中断不太合适吧  定时器中断捕获主要用在高速检测外部信号的数量,或者测试外部信号的宽度

你 ...

用外部中断吗?
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-10-28 15:14:38 | 显示全部楼层

对啊  外部中断检测就行  
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

76

帖子

9

蝴蝶豆

金牌会员

最后登录
2023-12-5
 楼主| 发表于 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);
}

回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-10-28 16:29:15 | 显示全部楼层
hejun96 发表于 2019-10-28 16:17
外部中断的配置就一点,那怎么检测脉冲?

#include "exti.h"

1、IO口配置成输入
2、使能IO口的中断
3、中断触发方式配置成上升沿和下降沿
4、配置中断函数
5、进入中断函数处理任务
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-10-30 15:47:59 | 显示全部楼层
没太明白楼主说的挂断电话后脉冲是如何变化的。是由原来的电平翻转一下还是再次发出一个脉冲?不过关于捕获和外部中断倒是可以聊聊的。
1.外部中断可以判断电平变化,但是太快或者太多就不太适合,虽然配置简单,但因为没有标准位,所以变化快的脉冲不易用此方法。
2.输入捕获用作外部中断比较灵活,有相应的中断标志,甚至对于快速脉冲可是设置2个,4,等多个脉冲边沿再捕获一次,并且单个边沿可以设置简单的数字滤波。功能强大,相当灵活。

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

76

帖子

9

蝴蝶豆

金牌会员

最后登录
2023-12-5
 楼主| 发表于 2019-11-2 20:03:11 | 显示全部楼层
butterflyspring 发表于 2019-10-30 15:47
没太明白楼主说的挂断电话后脉冲是如何变化的。是由原来的电平翻转一下还是再次发出一个脉冲?不过关于捕获 ...

就是用一个GPIO口一直检测脉冲的变化,来电话的时候,脉冲有变化;挂断电话的时候,脉冲再次变化,控制接听和挂断的GPIO口就进行相应的置高或者是置低
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-11-7 17:41:23 | 显示全部楼层
hejun96 发表于 2019-11-2 20:03
就是用一个GPIO口一直检测脉冲的变化,来电话的时候,脉冲有变化;挂断电话的时候,脉冲再次变化,控制接 ...

那就可以用捕获中断试试,一个脉冲总有一次上升或下降沿,产生中断就在软件中记录和判断拿起和挂断
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-7 17:07 , Processed in 0.191553 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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