嵌入式运行环境多大是工业应用,输入信号的可靠采集就变得很重要了,一个外部信号的采集错误将会导致程序的的执行错误,及逻辑判断错误。此方法是在信号电平的反转检测都要经过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.youkuaiyun.com/download/dmjkun/10935098