本文主要是介绍STM8S003F3 使用定时器来计算方波周期的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们的需求是stm8做从机,然后使用一根线接收方波,来实现不同的功能,比如亮红灯,亮黄灯,打开蜂鸣器等等等等。
那么问题来了,之前我尝试着通过一次发送多少个方波来实现不同的功能,但是到最后我发现这个方法行不通。后来我想了一下可以通过主机发过来的方波频率来实现不同的功能,即知道每次发过来的方波的周期。
那么如何计算方波周期呢?这里感谢我的同事给了我思路,可以实现这个功能。
首先是要做gpio的外部中断,这里以gpio PD4在主函数里进行设置,当有下降沿的时候就会进入中断处理函数:
GPIO_Init(GPIOD,GPIO_PIN_4, GPIO_MODE_IN_FL_IT );//接收方波初始化
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD , EXTI_SENSITIVITY_FALL_ONLY);
定时器timer2在主函数的配置如下:
//内部时钟为16M,因此这个设置时以10ms进入一次中断
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 9999);
TIM2_PrescalerConfig(TIM2_PRESCALER_16, TIM2_PSCRELOADMODE_UPDATE);
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
TIM2_SetCounter(0x0000);
TIM2_Cmd(ENABLE);
TIM2_ClearFlag(TIM2_FLAG_UPDATE);TIM2_ITConfig( TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE);
在gpio的外部中断函数里,这样设置:
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*///GPIO_WriteReverse(GPIOD,GPIO_PIN_3); flag ^= 0x01;if(flag == 0)test_time = 0;else{tmp_count = test_time;}
}
在timer2的外部中断处理函数里,这样设置:
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/TIM2_ClearFlag( TIM2_FLAG_UPDATE);//记得要清除标志位,否则会出问题test_time++;}
这样一来当flag为0的时候就会清零,为1的时候就会将数据传出去,也就是等于知道一个周期的时间。
存在问题:这样的写法虽然可以解决问题,但是在程序刚开始的时候还是会出现问题,因为可能定时器先走了,主函数比定时器慢,一开始可能会丢,不过后面就很稳定了。
这篇关于STM8S003F3 使用定时器来计算方波周期的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!