主页 > 互联网 > 内容页

PSOC6-GPIO的控制_天天消息

2023-06-07 10:08:09 来源:互联网电子设计


(资料图)

GPIO是一种具有输入和输出功能的数字引脚,简称IO口。

IO口一般具有以下几个功能模式:

输入上拉:内部具有弱上拉,也就是高电平输入模式。输入下拉:内部具有弱下拉,也就是低电平输入模式。输入:只具有读取io口电平功能,同时引脚悬空,容易被外部影响而改变电平状态。模拟输入:输入功能从数字变为模拟。输出:IO口具有输出功能,高低电平的输出。推挽输出:IO口利用功率管进行驱动、开漏输出:IO口的低电平具有输出功能,而高电平则变为悬空,也就是隔离。复用开漏输出:将IO口交由外设处理开漏输出。复用推挽输出:将IO口交由外设处理推挽输出。

我们基于上一个项目所使用的demo继续。

名称详细
PIN_MODE_OUTPUT 0x00输出
PIN_MODE_INPUT 0x01输入
PIN_MODE_INPUT_PULLUP 0x02输入上拉
PIN_MODE_INPUT_PULLDOWN0x03输入下拉
PIN_MODE_OUTPUT_OD 0x04开漏输出

我们开始初始化定时器吧!

#define HWTIMER_DEV_NAME   "time2"     /* 定时器名称 *//* 定时器超时回调函数 */static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size){    rt_kprintf("this is hwtimer timeout callback fucntion!n");    rt_kprintf("tick is :%d !n", rt_tick_get());    return 0;}static int hwtimer_sample(void){    rt_err_t ret = RT_EOK;    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */    rt_device_t hw_dev = RT_NULL;   /* 定时器设备句柄 */    rt_hwtimer_mode_t mode;         /* 定时器模式 */    /* 查找定时器设备 */    hw_dev = rt_device_find(HWTIMER_DEV_NAME);    if (hw_dev == RT_NULL)    {        rt_kprintf("hwtimer sample run failed! can"t find %s device!n", HWTIMER_DEV_NAME);        return RT_ERROR;    }    /* 以读写方式打开设备 */    ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);    if (ret != RT_EOK)    {        rt_kprintf("open %s device failed!n", HWTIMER_DEV_NAME);        return ret;    }    /* 设置超时回调函数 */    rt_device_set_rx_indicate(hw_dev, timeout_cb);    /* 设置模式为周期性定时器 */    mode = HWTIMER_MODE_PERIOD;    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);    if (ret != RT_EOK)    {        rt_kprintf("set mode failed! ret is :%dn", ret);        return ret;    }    /* 设置定时器超时值为5s并启动定时器 */    timeout_s.sec = 0;      /* 秒 */    timeout_s.usec = 1000;     /* 微秒 */    if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))    {        rt_kprintf("set timeout value failedn");        return RT_ERROR;    }    /* 延时3500ms */    rt_thread_mdelay(3500);    /* 读取定时器当前值 */    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));    rt_kprintf("Read: Sec = %d, Usec = %dn", timeout_s.sec, timeout_s.usec);    return ret;}

我们进入rtthead进行组件设置,打开time的组件和硬件使能即可!

硬件定时器设置驱动程序开启

我们修改定时器回调函数的内容!

/* 定时器超时回调函数 */static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size){    //rt_kprintf("this is hwtimer timeout callback fucntion!n");    //rt_kprintf("tick is :%d !n", rt_tick_get());    ledDelay++;    if(ledDelay>=ledDelayVal){        ledDelay=0;        ledStatus=~ledStatus;    }    buttonShadeTime++;    if(buttonShadeTime>=buttonShadeTimeVal){        buttonShadeTime=0;        buttonShadeFlag=1;    }    mnbn1S++;    if(mnbn1S>=mnbn1SVal){        mnbn1S=0;        rt_kprintf("button is :%d !n", rt_pin_read(Button_PIN));    }    return 0;}

我们添加方法:

#define LED_PIN     GET_PIN(0, 0)#define Button_PIN  GET_PIN(5,0)#define ledDelayVal 500unsigned char buttonDownFlag=0;unsigned char ledDownFlag=0;unsigned short ledDelay=0;unsigned char ledStatus=0;#define buttonShadeTimeVal 10unsigned char buttonShadeTime=0;#define buttonShadeCountVal 5unsigned char buttonShadeCount=0;unsigned char buttonShadeFlag=0,buttonFinshFlag=0;unsigned char buttonDownLast=0;#define mnbn1SVal 1000unsigned short mnbn1S=0;#define HWTIMER_DEV_NAME   "time2"     /* 定时器名称 */void ButtonShadeHandler(void){    if(!buttonShadeFlag){           return;    }    buttonShadeFlag=0;    if((!rt_pin_read(Button_PIN))==buttonDownLast){        buttonShadeCount++;        if(buttonShadeCount>=buttonShadeCountVal){            buttonShadeCount=0;            buttonFinshFlag=1;        }    }else{        buttonDownLast=!rt_pin_read(Button_PIN);        buttonShadeCount=0;    }}void ButtonHandler(void){    if(!buttonFinshFlag){           return;    }    buttonFinshFlag=0;    if(!buttonDownLast){      if(!buttonDownFlag){       buttonDownFlag=1;       ledDownFlag=~ledDownFlag;      }   }else{      buttonDownFlag=0;   }}

我们修改main方法为:

int main(void){    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);    rt_pin_mode(Button_PIN, PIN_MODE_INPUT_PULLUP);    hwtimer_sample();    while(1)    {        ButtonShadeHandler();        ButtonHandler();        if(!ledDownFlag){            if(!ledStatus){                rt_pin_write(LED_PIN, PIN_HIGH);            }else{                rt_pin_write(LED_PIN, PIN_LOW);            }        }else{            rt_pin_write(LED_PIN, PIN_HIGH);        }    }}

运行效果:

点击P5.0接口的button来实现主板的灯控制!按一下开始闪烁,按一下关。

运行效果审核编辑:汤梓红

标签:

上一篇:拆解海康威视摄像头DS-2SCD2612F4
下一篇:最后一页