前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中移ML307A(4G Cat1,C-SDK,OpenCPU)模组学习开发-GPIO

中移ML307A(4G Cat1,C-SDK,OpenCPU)模组学习开发-GPIO

作者头像
杨奉武
发布2024-08-13 11:13:54
2000
发布2024-08-13 11:13:54
举报
文章被收录于专栏:知识分享

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

GPIO输出高低电平

 1,直接上代码

代码语言:javascript
复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉

    //      这个0代表GPIO0  同理1就代表GPIO1 ....
    cm_gpio_init(0, &cfg);//配置GPIO0

    while (1)
    {
        cm_gpio_set_level(0, 1);//设置GPIO0输出高电平
        osDelay(1000/5);//延时

        cm_gpio_set_level(0, 0);//设置GPIO0输出低电平
        osDelay(1000/5);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

烧录下载以后就会看到这个灯每隔1S亮灭

2,关于 cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

 其它的配置不用说大家也都知道了

GPIO输入

1,在引脚作为输出的模式下读取引脚状态

代码语言:javascript
复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉

    //      这个0代表GPIO0  同理1就代表GPIO1 ....
    cm_gpio_init(0, &cfg);//配置GPIO0

    cm_gpio_level_e level;
    while (1)
    {
        cm_gpio_set_level(0, 1);//设置GPIO0输出高电平

        cm_gpio_get_level(0, &level);//读取引脚电平
        cm_log_printf(0,"cm_gpio_get_level=%d\r\n",level);//打印

        osDelay(1000/5);//延时

        cm_gpio_set_level(0, 0);//设置GPIO0输出低电平
        
        cm_gpio_get_level(0, &level);//读取引脚电平
        cm_log_printf(0,"cm_gpio_get_level=%d\r\n",level);//打印

        osDelay(1000/5);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

2,在引脚作为输入的模式下读取引脚状态

咱们就使用 77号引脚作为功能2, GPIO13, 让GPIO13作为输入

代码语言:javascript
复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    //配置GPIO0为输出
    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(0, &cfg);//配置GPIO0

    //配置GPIO13为输入
    cm_iomux_set_pin_func(77, 2);//设置 77 号引脚为功能 2, 也就是作为 GPIO13
    cfg.direction = CM_GPIO_DIRECTION_INPUT;//输入
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(13, &cfg);//配置GPIO13


    cm_gpio_level_e level;
    while (1)
    {
        cm_gpio_get_level(13, &level);//读取GPIO13引脚的电平
        
        cm_gpio_set_level(0, level);//GPIO13输入什么电平,GPIO0就输出什么电平

        osDelay(1);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

咱设置GPIO13上拉了,所以GPIO0也会输出高电平,灯亮; 可以把GPIO13接电平,灯就会灭;

3,GPIO输入中断

这边写的复杂了些,有了中断以后就发送个事件, 任务等到有事件以后处理

代码语言:javascript
复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osEventFlagsId_t osEventFlagsIdTest;//事件句柄

#define GPIO_INT 0x01

static void gpio_irq_callback(void)
{
    //不能处理打印和耗时任务
    osEventFlagsSet(osEventFlagsIdTest, GPIO_INT);//发送事件
}

osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    //配置GPIO0为输出
    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(0, &cfg);//配置GPIO0

    //配置GPIO13为输入
    cm_iomux_set_pin_func(77, 2);//设置 77 号引脚为功能 2, 也就是作为 GPIO13
    cfg.direction = CM_GPIO_DIRECTION_INPUT;//输入
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(13, &cfg);//配置GPIO13
    //增加设置GPIO13中断
    cm_gpio_interrupt_register(13, gpio_irq_callback);
    cm_gpio_interrupt_enable(13, CM_GPIO_IT_EDGE_BOTH);//上下沿触发


    cm_gpio_level_e level;
    while (1)
    {
        //等待事件,                                         等待0x01         其中一个来了就执行       一直等着
        uint32_t flag = osEventFlagsWait(osEventFlagsIdTest, GPIO_INT,     osFlagsWaitAny,         osWaitForever);

        if (flag&GPIO_INT == GPIO_INT)
        {
            cm_gpio_get_level(13, &level);//读取GPIO13引脚的电平

            cm_gpio_set_level(0, level);//GPIO13输入什么电平GPIO0输出什么电平
        }
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    osEventFlagsIdTest = osEventFlagsNew(NULL);//创建事件
    if (osEventFlagsIdTest==NULL) 
    {
        return -1;
    }

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GPIO输出高低电平
    •  1,直接上代码
      • 烧录下载以后就会看到这个灯每隔1S亮灭
    • 2,关于 cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0
      •  其它的配置不用说大家也都知道了
  • GPIO输入
    • 1,在引脚作为输出的模式下读取引脚状态
      • 2,在引脚作为输入的模式下读取引脚状态
        • 咱们就使用 77号引脚作为功能2, GPIO13, 让GPIO13作为输入
        • 咱设置GPIO13上拉了,所以GPIO0也会输出高电平,灯亮; 可以把GPIO13接电平,灯就会灭;
      • 3,GPIO输入中断
        • 这边写的复杂了些,有了中断以后就发送个事件, 任务等到有事件以后处理
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档