我们的需求是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 内部时钟初始化以及定时器做延时的使用
下一篇:STM8学习笔记---Modbus通信协议简单移植
推荐阅读最新更新时间:2024-10-26 11:17