0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PSOC6-GPIO的控制

互联网电子设计 来源:互联网电子设计 作者:互联网电子设计 2023-06-07 09:04 次阅读

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

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

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

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

名称 详细
PIN_MODE_OUTPUT 0x00 输出
PIN_MODE_INPUT 0x01 输入
PIN_MODE_INPUT_PULLUP 0x02 输入上拉
PIN_MODE_INPUT_PULLDOWN 0x03 输入下拉
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的组件和硬件使能即可!

pYYBAGR_VOSAazB8AAGUzYNAX9s810.png硬件定时器设置poYBAGR_VO2AYVAEAAG3tChAr90060.png驱动程序开启

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

/* 定时器超时回调函数 */
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 500
unsigned char buttonDownFlag=0;
unsigned char ledDownFlag=0;
unsigned short ledDelay=0;
unsigned char ledStatus=0;
#define buttonShadeTimeVal 10
unsigned char buttonShadeTime=0;
#define buttonShadeCountVal 5
unsigned char buttonShadeCount=0;
unsigned char buttonShadeFlag=0,buttonFinshFlag=0;
unsigned char buttonDownLast=0;
#define mnbn1SVal 1000
unsigned 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来实现主板的灯控制!按一下开始闪烁,按一下关。

pYYBAGR_XaiAZbwIAEFOSmfOCCQ381.png运行效果

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620871
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50580
  • IO口
    +关注

    关注

    3

    文章

    164

    浏览量

    23757
  • psoc6
    +关注

    关注

    1

    文章

    9

    浏览量

    4789
收藏 人收藏

    评论

    相关推荐

    PSoC3内部模拟布线和管脚选择

    本文是对PSoC3内部模拟布线和管脚选择的一个简单介绍,对PSoC3芯片设计规定的IDAC和Opamp直接连接到GPIO做了详细的说明
    发表于 06-09 10:05 2093次阅读
    <b class='flag-5'>PSoC</b>3内部模拟布线和管脚选择

    请问如何将ECO输出分配给PSoC6GPIO

    如何将ECO输出分配给PSoC6GPIO
    发表于 01-16 07:56

    PSoC6 CY8CPROTO-062-4343W如何配置GPIO和ADC引脚?

    嗨,我正在使用 PSoC6 CY8CPROTO-062-4343W,我正在尝试测量 4 线电阻式触摸屏。由于 4 线电阻式触摸屏的工作原理,与某些引脚的连接会根据您是要读取 x 轴还是 y 轴上
    发表于 01-18 09:23

    PSoc4上控制GPIO时,怎样才能用modustoolBox为GPIO设置驱动模式?

    PSoc4 上控制 GPIO 时,我想为 GPIO 设置驱动模式。 在 PSoC Creator 中,可以在 “元器件目录” 中选择并放
    发表于 01-22 07:29

    PSOC6 GPIO无法触发中断的原因?怎么解决?

    Hi all: 我们现在的项目用PSOC6的GPIOp10.6 管脚连接其他芯片的INT管脚,通过示波器可以抓到该管脚上已经产生了500us左右的脉冲(INT脚一直高,脉冲来了会拉低500us
    发表于 02-02 08:01

    PSoC3_5 GPIO应用笔记

    PSoC3_5 GPIO应用笔记,在这里向读者介绍PSoC 3和PSoC5个GPIO基础,并展示他们如何在设计中有效地使用技术图文并茂,挺容
    发表于 11-22 16:21

    按时如何在PSoC6中复用?

    你好,现在我用PSoC6通过UART连接其他的板。董事会只有四条线,即VCC,GND,RX(GPIO)和Tx(GPIO)。该板使用TX作为GPIO唤醒
    发表于 08-19 00:26

    调试后选择gpioPSoC 4不可编程

    你好,为了省电,我在应用笔记中把SWD引脚改为GPIO,但此后PSoC创建者没有显示目标MCU,甚至连PSoC程序员也无法连接到它。这发生在我的定制板与KYPROG从CY8KIT-043
    发表于 10-10 14:52

    PSOC5 GPIO奇怪行为

    在我的项目中,我使用PSoC5FTK。GPIO奇怪的行为已经被检测到。两个子系统,两个问题。第一个红外接收器,连接到P5〔1〕。在接收周期(RC6协议)中存在雪崩中断Req,1000和更多。G
    发表于 03-14 13:25

    PSOC 4怎么在固件中控制GPIO

    根据PSoC 4“使用GPIO引脚”,文档端口4和更高(P4、P5、P6、P7等)不能用于通过DSI路由。要使用它们,必须直接控制在固件中。GPION固件我不清楚如何做到这一点,如果我
    发表于 10-08 13:50

    基于PSoC3芯片的步进电机微步控制方案

    基于PSoC3芯片的步进电机微步控制方案
    发表于 01-14 12:28 10次下载

    基于PSoC3 UDB的异步SRAM读写控制

    基于 PSoC3 UDB 的异步 SRAM 读写控制
    发表于 01-23 20:48 15次下载

    PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168

    PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168
    发表于 10-10 16:10 7次下载
    <b class='flag-5'>PSoC</b> 1 使用外部微<b class='flag-5'>控制</b>器对 <b class='flag-5'>PSoC</b>® 1 器件编程 (HSSP)-AN44168

    PSoC3 UDB的异步SRAM读写控制

    PSoC3 UDB的异步SRAM读写控制
    发表于 10-30 15:21 8次下载
    <b class='flag-5'>PSoC</b>3 UDB的异步SRAM读写<b class='flag-5'>控制</b>

    基于PSOC3的移相控制器的设计与实现

    摘 要 : 介绍以CYPRESS产品为核心的基于PSOC 3的移相控制器的设计与实现。本设计采用PSOC技术,使用CapSense作为控制信号的输入,通过
    发表于 02-20 16:58 1103次阅读
    基于<b class='flag-5'>PSOC</b>3的移相<b class='flag-5'>控制</b>器的设计与实现