如果用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); } |
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
如何使用ST官网例程_LIN总线通讯_STM8AF
STM8 LIN
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
想问一下各位大佬,IAR下载调试代码时出现 warning: is an illegal data sample expression IAR是什么意思啊?
STM8S标准库TIM1编码器功能不计数,请大师帮我看看
你这个情况直接使用IO口中断检测外部信号就可以 中断触发方式使用上升沿和下降沿触发,在中断函数中判断电平状态,就可以确定是上升沿还是下降沿,之后根据情况处理就行
评分
查看全部评分
用外部中断吗?
对啊 外部中断检测就行
外部中断的配置就一点,那怎么检测脉冲?
#include "exti.h"
void EXTI_Configuration(void)
{ //下降沿中断
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);
}
1、IO口配置成输入
2、使能IO口的中断
3、中断触发方式配置成上升沿和下降沿
4、配置中断函数
5、进入中断函数处理任务
1.外部中断可以判断电平变化,但是太快或者太多就不太适合,虽然配置简单,但因为没有标准位,所以变化快的脉冲不易用此方法。
2.输入捕获用作外部中断比较灵活,有相应的中断标志,甚至对于快速脉冲可是设置2个,4,等多个脉冲边沿再捕获一次,并且单个边沿可以设置简单的数字滤波。功能强大,相当灵活。
如果关注脉冲宽度,可以把一个定时器的两个通道同时连接到捕获信号,分别设置上升和下降沿。这样就知道先后和计算宽度了
评分
查看全部评分
就是用一个GPIO口一直检测脉冲的变化,来电话的时候,脉冲有变化;挂断电话的时候,脉冲再次变化,控制接听和挂断的GPIO口就进行相应的置高或者是置低
那就可以用捕获中断试试,一个脉冲总有一次上升或下降沿,产生中断就在软件中记录和判断拿起和挂断