CC3200 GPIO 简单易懂实现引脚拉高、拉低 ( 实现一个简单的物联网系统-5 )

一、序言

  前面已经可以实现从服务器获得用户想要的浇水量,下面就需要对IO口进行拉高拉低对水泵的启停进行控制。

二、CC3200 GPIO 简介

  CC3200所有逻辑引脚和部分模拟引脚均可以用来作为通用输入/输出(GPIO)使用。GPIO功能可用于各种逻辑输入输出的场合。 GPIO有4组(GPIO A0~A3),每组8个。 具体如下:
  ①.  GPIO A0: GPIO_00~GPIO_07, 对应 GPIOA0.0~GPIOA0.7 。
  ②.  GPIO A1: GPIO_08~GPIO_15, 对应 GPIOA1.0~GPIOA1.7 。
  ③.  GPIO A2: GPIO_00~GPIO_07, 对应 GPIOA2.0~GPIOA2.7 。
  ④.  GPIO A3: GPIO_00~GPIO_07, 对应 GPIOA3.0~GPIOA3.7 。

  根据功能引脚的配置不同, GPIO的数量有27个 。所有GPIO引脚具备中断能力(电平有效或者边沿有效、上升或下降沿触发、有中断屏蔽)。可用于出发DMA或作为唤醒源。

三、简单易懂实现IO口拉高拉低

  CC3200 提供了一系列 API 去更方便的实现用户想要的功能。在SDK的 driverlib 和 src 下。我们导入的例程都包含了这些API。但是例程里面的实现方法显得过于复杂,不易理解,但是对我们来说是一个重要的参考。下面 过滤掉 “_if_” 层,通过直接调用 API 实现对IO的拉高拉低。注意:重要的说明在程序的注释中,对于每一个形参代表的意思的理解非常重要。

int
main()
{
	BoardInit();	//板子初始化
	/*--引脚配置  Start--*/
        PinTypeGPIO(PIN_64, PIN_MODE_0, false);		//参数:引脚名 引脚功能模式  开漏模式或STD
        GPIODirModeSet(GPIOA1_BASE, GPIO_PIN_1, GPIO_DIR_MODE_OUT);	//哪一组的端口地址  GPIO_A1的第1个 GPIO位权(0~7)   输入或者输出
        /*--引脚配置  End--*/
        while(1)
        {
        	MAP_UtilsDelay(2000000);
        	GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_1,GPIO_PIN_1);		//拉高IO口
        	MAP_UtilsDelay(2000000);
        	GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_1,0);		//拉低IO口
        }
}

这样就实现了对于PIN_64引脚的拉高拉低操作,如果是launchpad的话就可以看到LED灯一直闪烁。
注: 在pin.h 和 gpio.h 中都对于每一个IO口的地址都进行了定义,对于每一个API只需要相对应的使用即可,但是,需要了解 T I对 CC3200 的引脚定义,知道其对应关系,具体参照下表。(引自源地的资料)

四、学习方法

  TI 对于每一种功能都提供了例程,所以如果我们需要用到相应的功能就可以直接去参考例程中是如何配置的,这对于为了快速的上手开发是一个行之有效的好方法。 比如:我们模数转换会用到ADC ,那么就可以直接去参考例程中的ADC有关引脚的配置,等等。

五、视频展示

  到此为止,整个远程浇水系统就完成了,达不到商品化的稳定性,但能够在较长时间内实现该功能。
视频地址: https://www.bilibili.com/video/av43996928

六、专栏地址

  https://blog.csdn.net/CSDN_X_W/column/info/33567

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现ESP32-S3的GPIO1输入模式,可以参考以下代码: ```c #include "driver/gpio.h" #define GPIO_PIN 1 void gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; printf("GPIO[%d] intr, val: %d\n", gpio_num, gpio_get_level(gpio_num)); } void app_main() { gpio_pad_select_gpio(GPIO_PIN); gpio_set_direction(GPIO_PIN, GPIO_MODE_INPUT); gpio_set_intr_type(GPIO_PIN, GPIO_INTR_ANYEDGE); gpio_install_isr_service(0); gpio_isr_handler_add(GPIO_PIN, gpio_isr_handler, (void*) GPIO_PIN); } ``` 上述代码中,我们首先将GPIO1配置为输入模式,然后设置中断触发类型为任意边缘。接着,我们安装GPIO中断服务并添加中断处理函数。 当GPIO1引脚上的电平发生变化时,中断处理函数`gpio_isr_handler`会被调用。在这个函数中,我们可以通过`gpio_get_level`函数获取当前GPIO1引脚的电平值,并进行相应的处理。 如果你想要实现外部接电源拉高只触发一次、去掉电源拉低触发一次的功能,可以在中断处理函数中加入相应的判断逻辑。例如: ```c void gpio_isr_handler(void* arg) { static bool flag = false; uint32_t gpio_num = (uint32_t) arg; int level = gpio_get_level(gpio_num); if(level == 1 && !flag) { flag = true; // 外部接电源拉高触发一次的处理逻辑 } else if(level == 0 && flag) { flag = false; // 去掉电源拉低触发一次的处理逻辑 } printf("GPIO[%d] intr, val: %d\n", gpio_num, level); } ``` 在这个例子中,我们使用了一个静态变量`flag`来记录上一次中断是否是由电源拉高引起的。如果当前中断是由电源拉高引起的,并且上一次中断不是由电源拉高引起的,则执行相应的处理逻辑,并将`flag`设置为`true`。同理,如果当前中断是由去掉电源拉低引起的,并且上一次中断是由电源拉高引起的,则执行相应的处理逻辑,并将`flag`设置为`false`。 请注意,由于中断处理函数是在中断服务线程中执行的,因此应该尽量避免在中断处理函数中执行过长或复杂的操作。如果需要进行复杂的操作,可以将其放在一个任务中执行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值