输入输出的可靠处理

嵌入式运行环境多大是工业应用,输入信号的可靠采集就变得很重要了,一个外部信号的采集错误将会导致程序的的执行错误,及逻辑判断错误。此方法是在信号电平的反转检测都要经过10次的信号采集确认,每次10ms,总检测时间是100ms,中途有一个异样的采集都会将此次采样中断,并从重新开始,采集时间较长,适合信号变化不太快的外部信号触发使用,当然也可以修改次数及采样间隔时间。另外处理LED输出信号,可配置闪烁的时间,闪烁的次数等

static void ioc_read_io(void){
	
	//读入输入IO,滤波
	g_extio_input.read_io.bit.gpio1 = gpio1_read();
	g_extio_input.read_io.bit.gpio2 = gpio2_read();
	g_extio_input.read_io.bit.gpio3 = gpio3_read();
	g_extio_input.read_io.bit.gpio4 = gpio4_read();
	
	uint8_t io;
	io = g_extio_input.read_io.byte^g_extio_input.save_io.byte;
	if( io!=0 ){
		
		uint8_t i;
		for( i=0; i<EXTIO_INPUT_NUM; i++ ){
			
			if( io&(1<<i) ){
				if( g_extio_input.timer[i]++>EXTIO_INPUT_TIME ){
					g_extio_input.timer[i] = 0;
					if( g_extio_input.read_io.byte&(1<<i) )
						g_extio_input.save_io.byte |= (1<<i);
					else
						g_extio_input.save_io.byte &= ~(1<<i);
				}
			}
			else{
				g_extio_input.timer[i] = 0;
			}
		}
	}
	
	//处理LED的闪烁时间,计数,及亮灭
	uint8_t i;
	for(i=0; i<EXTIO_LED_NUM; i++){
		if( g_extio_led.state[i]!=LED_BLINK ){
			ioc_led_set(i,g_extio_led.state[i]);
			if( g_extio_led.state==LED_OFF ){
				g_extio_led.cnt[i] = 0;
				g_extio_led.timer[i] = 0;
				g_extio_led.blink_flag[i] = 0;
			}
		}
		else{
			if( g_extio_led.timer[i]++>g_extio_led.blink_time[i] ){
				g_extio_led.timer[i] = 0;
				if( g_extio_led.blink_flag[i]==1 ){
					g_extio_led.blink_flag[i]=0;
					ioc_led_set(i,LED_OFF);
					
					if( g_extio_led.blink_cnt[i]!=0xff ){
						if( ++g_extio_led.cnt[i]>=g_extio_led.blink_cnt[i] ){
							
							g_extio_led.state[i] = LED_OFF;
							g_extio_led.cnt[i] = 0;
						}
					}
				}
				else{
					g_extio_led.blink_flag[i]=1;
					ioc_led_set(i,LED_ON);
				}
			}
		}
	}
}

利用RTOS建立线程,定时调用这个函数即可。
以全局变量及宏方法向外提供的调用接口
ioc_read_dect(num) 读取IO状态
ioc_led_on(led) LED亮
ioc_led_off(led) LED灭
ioc_led_blink(led,time) 长期闪烁时间配置
ioc_led_blink_cnt(led,time,ts) 指定时间闪烁次数配置,次数到后灭
源码下载地址:https://download.csdn.net/download/dmjkun/10935098

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵向深耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值